在渗透测试的初始阶段,Shodan、Censys等在线资源可以作为一个起点来识别目标机构的技术痕迹。本文中就以二者提供的Python API为例,举例介绍如何使用它们进行渗透测试初期的信息侦查。
Shodan和Censys简介
有关Shodan的详细介绍,可以查看Freebuf站内相关报道( 报道1 、 报道2 )。
前段时间,网上发布了一个新的资源,那就是Censys.io( Freebuf相关报道 )。通过每天对IPv4地址空间进行ZMap和ZGrab扫描,它能够收集互联网上的网站和系统的数据。这些网络资源可以结合使用,或者以不同的搜索参数(例如TLD、CIDR等)单独使用来查询可用的数据库,以此来帮助我们识别暴露在互联网上的任何信息和服务。
这些资源主要使用了下面的四种方式:
1、查询CIDR来枚举系统和服务(注意所枚举的任何额外域名) 2、查询顶级域名(TLD)来枚举系统和服务(注意所枚举的任何额外的CIDR范围) 3、查询单目标系统 4、查询搜索字符串(例如:Apache等。)
通常来说,向一个客户显示外部主机和公开服务是很有用的,并且这个过程通常会导致范围被扩大,以至于包含之前“未知的”主机或服务。虽然Shodan和Censys.io都通过一个API提供了对数据的直接访问功能,但是二者同时都提供了一个GUI与数据进行交互。由于Shodan和Censys结果之间的差别,所以二者的结合使用能够更全面地捕获外部服务。这些资源可以被快速地访问,并能够用来作为侦查目标机构的一个起点。
Shodan例子
对于枚举外部服务来说,Shodan是一个很出色的资源,且它同时支持IPv4和IPv6的数据查询。Shodan同时提供付费版本和免费版本的API接口和扩展GUI访问,以及一个Python模块来简化数据提取。下面是Python中与Shodan的免费API访问交互的一个例子:
~$ python >>> >>> import shodan >>> SHODAN_API_KEY = '[INSERT_API_KEY]' >>> api = shodan.Shodan(SHODAN_API_KEY) >>> results = api.host("8.8.8.8") >>> >>> results.keys() [u'data', u'city', u'region_code', u'ip', u'isp', u'area_code', u'dma_code', u'last_update', u'country_code3', u'latitude', u'hostnames', u'postal_code', u'longitude', u'country_code', u'org', u'country_name', u'ip_str', u'os', u'asn', u'ports'] >>> results['ip_str'] u'8.8.8.8' >>> results['ports'] [53] >>> results['hostnames'] [u'google-public-dns-a.google.com'] >>>
通过使用付费的Shodan API接口,你可以在执行查询时实现搜索过滤器,从而当你搜索数据时,它能够大大提升功能和细节粒度。一个展示Shodan脚本(需要使用付费的API接口)更高级的例子如下所示。下面例子中,输出内容被省略了,但是你可以看到,它可以返回对外部服务、网络范围、TLDs等的一次快速的快照,而这一点可用于驱动你的侦查,并能够使处理过程更深入。
$ shodan_searcher -s hostname:google.com [+] Query: hostname:google.com Total_Results: 44510 [-] 8.8.8.8 (google-public-dns-a.google.com) 53 [-] 178.35.137.68 (cache.google.com) 80 [-] 82.223.249.194 (www.google.com) 3306 Server: MySQL [-] 208.117.228.231 (cache.google.com) 80 Server: Google httpd [-] 80.228.66.209 (ewe-hb-GGC-Node3-209.cache.google.com) 80 [-] 179.49.8.116 (cache.google.com) 80 [-] 37.98.225.196 (cache.google.com) 80 ….. [+] Found Results in CIDRs: 208.117.244.0/24, 186.208.224.0/21, 85.118.96.0/19, 210.245.8.0/21, 86.120.0.0/13, 173.237.96.0/19, 114.31.0.0/20, 201.218.92.0/24, 213.153.32.0/19, 193.95.0.0/17, 177.155.141.0/24, 212.2.96.0/19, 212.113.48.0/20, 219.88.188.0/22, 83.174.192.0/18, 103.10.20.0/22, 202.163.106.0/24, 217.64.139.0/24, ….. 202.69.184.0/22, 192.232.16.0/20, 95.180.0.0/17, 189.28.163.0/24, 177.91.191.0/24, 206.80.240.0/20, 180.150.0.0/17, 217.175.200.0/24, 8.8.4.0/24, 176.126.56.0/22, 37.98.225.0/24, 77.120.60.0/22, 212.10.0.0/16, 109.110.32.0/23, 203.2.228.0/24, 77.50.0.0/17, 27.109.0.0/24, 95.181.0.0/17, 209.91.128.0/18 [+] Found the following TLDs: google.com
Censys例子
Censys.io是一个新型的免费在线资源,它由密歇根大学的研究人员创建。这个项目提供了一个Web服务API,以及一个Python模块来提高API交互。一旦你创建了一个免费账户,那么就可以通过它使用Censys.io API。为了执行API查询,你需要API ID和与你的帐户关联的密钥值。这两个唯一的键值可以在“我的帐户”区域中找到。下面是一个在Python中与Censys.io API交互的简单例子:
$ python >>> >>> import censys >>> from censys import * >>> >>> api = censys.ipv4.CensysIPv4(api_id="[INSERT_KEY]", api_secret="[INSERT_KEY]") >>> res = api.search("ip:8.8.8.8") >>> res {u'status': u'ok', u'results': [{u'ip': u'8.8.8.8', u'protocols': [u'53/dns']}], u'metadata': {u'count': 1, u'query': u'ip:8.8.8.8', u'backend_time': 34, u'page': 1, u'pages': 1}} >>> for i in res.get('results'): ... print "{} {}".format(i.get("ip"), " ".join(i.get('protocols')) ... 8.8.8.8 53/dns >>>
下面是一个POC脚本,它从API中提取数据。默认情况下,它只抓取结果(100个结果)中的第一页。为了绕过这个限制,我们添加了一些简单的逻辑来解析总量,并进行了适当数量的查询。
#!/usr/bin/env python import sys import censys from censys import * api = censys.ipv4.CensysIPv4(api_id="API_ID", api_secret="API_SECRET") res = api.search(sys.argv[1]) matches = res['metadata']['count'] pageNum = matches / 100 if matches % 100 != 0: pageNum = pageNum + 1 count = 1 while count <= pageNum: res = api.search(sys.argv[1], page=count) count = count+1 for i in res.get('results'): print "{} {}".format(i.get("ip"), " ".join(i.get('protocols'))
*参考来源: breakpoint-labs ,FB小编JackFree编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.com)