HACK7YD 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在渗透测试中,往往需要选择一个合适的域名作为c2服务器,那么什么样的域名才能称之为“合适”呢? Expireddomains.net也许能给你一些建议。 Expireddomains.net可以查询最近过期或删除的域名,更重要的是,它提供了关键字搜索功能。 本文将对过期域名自动搜索工具CatMyFish进行测试,分析其原理,修复其bug,用python编写一个爬虫,得到所有的搜索结果。 0x01 简介 本文将介绍以下内容: 测试CatMyFish,一个自动搜索过期域名的工具 分析原理纠正了CatMyFish中的错误 爬虫的开发思路和实现细节 开源python实现的爬虫代码 0x02 测试过期域名自动化搜索工具CatMyFish 下载地址: https://github.com/Mr-Un1k0d3r/CatMyFish 主要实现流程 用户输入关键字 该脚本将搜索请求发送给expireddomains.net进行查询。 获取域名列表 将脚本域名发送给Symantec BlueCoat进行查询。 获取每个域名的类别。 Expireddomains.net地址: https://www.expireddomains.net/ 赛门铁克大衣地址: https://sitereview.bluecoat.com/ 实际测试 需要安装Python库beautifulsoup4 pip安装beautifulsoup4 尝试搜索关键词微软,脚本给出错误,如下图。 解析脚本结果时出现问题。 所以按照CatMyFish的实现思路,自己写脚本测试一下。 访问expireddomains.net,使用以下代码查询关键字microsoft: 导入urllib 导入urllib2 从bs4导入BeautifulSoup URL=' https://www . expired domains . net/domain-name-search/?q=微软 req=urllib2。请求(url) res_data=urllib2.urlopen(req) html=beautiful soup(RES _ data . read(),' html.parser ') tds=html.findAll('td ',{'class': 'field_domain'}) 对于tds中的td: 对于td.findAll('a ',{'class': 'namelinks'})中的a: 打印文本 总共得到15个结果,如下图所示。 通过浏览器访问,共获得25个结果,如下图所示 对比后发现,脚本获得的数量少于浏览器,应该是脚本的筛选出现了问题。 注: 建议初学者掌握使用beautifulsoup4的基本技巧,本文对此进行了简要介绍。 0x03 查找bug原因 1、根据response查看域名标签,对筛选规则进行判断 我们需要获取收到的响应数据,检查每个域名对应的标签,确定标签筛选是否有问题。 查看响应数据的两种方法: (1) 使用Chrome浏览器查看 F12 -更多工具-网络条件 重新加载网页,选择?q=微软资源 如下图 (2) 使用python脚本 代码如下: 导入urllib 导入urllib2 URL=' https://www . expired domains . net/domain-name-search/?q=微软 req=urllib2。请求(url) res_data=urllib2.urlopen(req) print res_data.read() 分析响应数据并找出错误原因: 使用原始测试脚本,可以提取以下数据中的域名: MicroSoft. MSK . rugo daddy . com dyna dot . com uniregistry . com name cheap . com one . com 123-reg . co . uk 但是响应数据还包含另一种类型的数据: 新MicroSoft。com 最初的测试脚本没有提取存储在这个标签中的域名信息。 0x04 bug修复 筛选想法: 获取标签中第一个标题的内容。 原因: 这样就可以同时获得两组数据中存储的域名信息,过滤掉无效信息(如第二个标题中的域名GoDaddy.com)。 实施代码: tds=html.findAll('td ',{'class': 'field_domain'}) 对于tds中的td: 打印td.findAll('a')[0]['title'] 因此,获得完整查询结果的测试代码如下: 导入urllib 导入urllib2 导入系统 从bs4导入BeautifulSoup def SearchExpireddomains(键): URL=' https://www . expired domains . net/domain-name-search/?q='键 req=urllib2。请求(url) res_data=urllib2.urlopen(req) html=beautiful soup(RES _ data . read(),' html.parser ') tds=html.findAll('td ',{'class': 'field_domain'}) 对于tds中的td: 打印td.findAll('a')[0]['title'] if __name__=='__main__ ': searchepireddomains(sys . argv[1]) 成功获取第一页上的所有结果,并按如下所示进行测试。 0x05 获得所有查询结果 Expireddomains.net每页保存25个结果。要获得所有结果,您需要发送多个请求来遍历所有查询页面的结果。 首先需要得到所有结果的数量,除以25得到要查询的页数。 1、统计所有结果 检查响应以找到指示搜索结果数量的位置,内容如下: 显示过滤器 (大约20,213 个域) Chrome浏览器显示如下图 为了简化代码长度,select()被直接传入CSS选择器进行过滤。过滤标签strong后,第一个标签表示结果的数量,对应的查询代码是: 打印html.select('strong')[0] 输出为20,213 。 提取的数字: 打印html.select('strong')[0]。文本 输出是20213。 去掉中间”; 打印html . select(' strong ')[0]. text . replace(',','') 输出是20213。 除以25得到要查询的页数。这里需要注意的是,字符串类型“20213”需要转换成整数20213。 2、猜测查询规律 第二页查询的Url: https://www.expireddomains.net/domain-name-search/?start=25q=微软 第3页查询的Url: https://www.expireddomains.net/domain-name-search/?start=50q=微软 找到查询规则,即第一页上查询的url: https://www.expireddomains.net/domain-name-search/?start=25*(i-1))q=microsoft 注: 测试结束后,expireddomains.net为未注册用户提供了多达550个结果,共21页。 3、对结果进行判断 在脚本实现中,需要判断结果。如果结果大于550,则只输出21页;如果小于550,结果将输出/25页。 4、模拟浏览器访问(备选) 当我们使用脚本自动查询多个页面时,如果网站使用反爬虫机制,就无法获得真实数据。 经过测试,expireddomains.net没有打开反爬虫机制。 将来,如果在expireddomains.net开启了反爬虫机制,脚本需要模拟浏览器发送请求,并在报头中附加用户代理等信息。 检查Chrome浏览器以获取发送请求的信息,如下所示。 控件中,添加要绕过的标头信息。 示例代码: req.add_header('用户代理',' Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.36(KHTML,像Gecko)Chrome/65 . 0 . 3325 . 181 Safari/537.36 ') 完整的代码实现地址: https://github.com/3gstudent/GetExpiredDomains 实际测试: 搜索microsoftoffices,结果不到550,如下图。 搜索微软,结果大于550,只显示21页,如图。 与Web访问的内容进行比较,结果相同,测试成功。 0x06 小结 本文对过期域名自动搜索工具CatMyFish进行了测试,分析了其原理,修复了其bug,用python编写了爬虫来获取所有收集到的结果,分享了开发思路和开源代码。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子