开发者API
作为一个网络安全人员,编程能力弱一直是我的一个痛点,Shodan为我们提供了一个开发者API,这样我们自己的程序就可以使用Shodan搜集的数据了
Shodan提供的API分为两种:REST API和Streaming API
REST API提供了搜索Shodan、查找主机、获取查询的总结性信息的方法,还有各种方法使开发更加容易
Streaming API提供的是一个实时信息,我们可以进行订阅以确保获取最新的信息
Usage Limits
API提供了三个方法
1.Searching
这个方法和我们在命令行下使用类似,如果使用过滤器或者查看第二页,就需要花费query credit。
使用过滤器搜索一次扣一个query Credit,多看一页花费query Credit,如果使用过滤器并且多看了一页,也是花费一个queryCredit
2.Scanning
扫描自然就花费scan credits ,每扫描一个指定主机,就会花费一个scancredits
3.NetworkAlert
网络提醒功能,根据我们的API的级别来分别进行了限制IP的数量,普通用户不能超过100个IP
Introducing Facets
关于Facets之前我们已经给大家讲述过了,主要就是能够给我们提供一个比较直观的统计大图。
之前我也把Facets的列表发出来了,通常facets都是研究全球范围安全的起点。
Facets只能在API和CLI中使用,Web接口中不行
Getting Started
下面我们就开始来进行演示,使用Python语言(其他语言也可以的),具体代码尽量使用Shodan官方提供的了!
安装命令行Shodan,上一篇文章中已经讲述过了
easy_install shodan
如果已经安装过了,想要升级的话可以使用
easy_install –U shodan
Initialization
跟命令行模式差不多,第一步都是初始化API
import shodan
api = shodan.Shodan('Kw7TeklmnU2aFRNdwDFt7O6EIRmpmUNV')
Searching
初始化之后,我们就开始尝试一下搜索功能吧
#把请求放在try/ except中可以捕捉异常错误
try:
#Search Shodan,搜索内容为apache
results = api.search('apache')
#Show the results
print 'Results found: %s' % results['total']
forresult in results['matches']:
print 'IP: %s' % result['ip_str']
print result['data']
print ''
except shodan.APIError, e:
print 'Error: %s' % e
简单来看一下这串代码
首先调用api.search()方法,之后将结果字典赋值给results这个变量,返回的字典中有total、matches两个key,matches又是一个字典,其中有ip_str、data等key,分别打印一下
那么究竟得到的结果是什么形式的呢?其实就是下面这个形式的:
跟之前我介绍的基本类似
此时就会有一个问题,就是我们没有办法在第一次就知道其中有哪些key,所以在写程序时候也会出现问题。还好,Shodan给我们提供了一个列表,和之前的类似,是一张Banner规范,可以访问
https://developer.shodan.io/api/banner-specification获取最新的
注意:默认一些数据量比较大的区域,比如html,shodan都自动进行了缩略,如果想要查看全部的信息的话,可以在search方法中加入minify=False参数,即:
results = api.search('apache', minify=False)
上面这些操作指示查看第一页的数据,如果我们想要查看第二页呢?
results = api.search('apache', page=2)
此时就可以使用循环来查询每一页的结果了,不过可能大家会说那样可能会很麻烦,ShodanAPI给我们提供了另一个方法
search_cursor()
这个方法会给我们查询所有的结果,并返回一个字典
for banner in api.search_cursor('apache'):
print banner['ip_str'] # Print out the IP address for each banner
需要注意的是:这个方法只能用于搜索结果,而不能使用facets
Host Lookup
查询固定主机的信息,我们可以使用host()方法
#-----------------------------------------------------------------
# Lookup the host
host = api.host('217.140.75.46')
# Print general info
print """
IP: %s
Organization: %s
Operating System: %s
""" % (host['ip_str'],host.get('org', 'n/a'), host.get('os', 'n/a'))
# Print all banners
for item in host['data']:
print """
Port: %s
Banner: %s
""" % (item['port'], item['data'])
#------------------------------------------------------------
默认情况下Shodan只会返回最近一段时间返回的查询信息,如果想查看包括历史信息的一个全面的资料,可以使用history参数
host = api.host('217.140.75.46', history=True)
Scanning
Shodan搜集设备Banner信息都是一个月一次,并且是无差别收集,如果我们想要Shodan为我们立刻去搜索一个主机的话,那我们可以使用scan方法
与Kali中其他的扫描工具不一样,Shodan是异步完成的,我们提交请求后可能会等待一段时间才会完成,完成后命令行会出现提醒信息,我们可以通过订阅实时流来等待结果。
scan = api.scan('198.20.69.0/24')
或者
scan = api.scan(['198.20.49.30','198.20.74.0/24'])
我们提交后会返回这样的信息
{
'id':'R2XRT5HH6X67PFAB',
'count': 1,
'credits_left': 5119
}
信息包括唯一的ID,查询的IP数,剩余Credits
Real-Time Stream
Streaming API是一个基于http的服务,返回shodan收集的实时的数据,并不提供搜索和查找主机功能,只是将爬虫的信息返回
下面是一个小事例,输出易受FREAK漏洞攻击的主机列表
def has_vuln(banner, vuln):
if'vulns' in banner['opts'] and vuln in banner['opts']['vulns']:
return True
returnFalse
ifhas_vuln(banner, 'CVE-2015-0204'):
print banner
常规的API订阅只能访问1%的提要。数据许可客户仅可获得100%的访问权限。
Network Alert
网络提醒是实时的,主要分为以下两个步骤
1.创建一个网络提醒
alert = api.create_alert('Productionnetwork', '198.20.69.0/24')
当然也可以是多个IP(段)
alert= api.create_alert('Production and Staging network', [
'198.20.69.0/24',
'198.20.70.0/24',
])
网络提醒是和扫描结合使用的,使用一个生命周期是比较简易的方式
alert = api.create_alert('Temporaryalert', '198.20.69.0/24', expires=60)
这个alert只在60s内有用,超过时间就自动失效
成功创建网络提醒后,API会返回以下数据
{
"name":"Production network",
"created":"2015-10-17T08:13:58.924581",
"expires":0,
"expiration":null,
"filters":{
"ip": ["198.20.69.0/24"]
},
"id":"EPGWQG5GEELV4799",
"size":256
}
2.订阅
print banner
alert()方法提供了一个迭代器,每个条目都是一个banner,因为它正在被Shodan爬行器收集。alert()方法需要的唯一参数是在创建网络警报时返回的警报ID。
3.使用Shodan命令行接口
现在我们就来看一看在命令行下如何完成python代码中的内容
首先清除搜索警报(这会清楚我们账户上产生的所有的警报)
$ shodan alertclear
Removing Scan:198.20.69.0/24 (ZFPSZCYUKVZLUT4F)
Alerts deleted
之后我们查看一下是不是被清楚干净了
$ shodan alert list
You haven't created any alerts yet.
可以看到已经清楚干净了,下面我们创建一个新的网络提醒
$ shodan alert create"Temporary alert"198.20.69.0/24
Successfully created network alert!
Alert ID: ODMD34NFPLJBRSTC
最后一步就是订阅了
$ mkdir alert-data
$ shodan stream --alert=ODMD34NFPLJBRSTC --datadir=alert-data
这样每一天都会得到一个提醒数据
$ ls alert-data
2016-06-05.json.gz
2016-06-06.json.gz
2016-06-07.json.gz
这是Shodan的最后一篇文章了,官方文档中介绍了蜜罐和工业控制系统的一些知识,这个还是弥足珍贵的,官方文档之前已经发到群了。
把之前介绍的知识进行组合就可以产生意想不到的效果,有些方法不适合在公众号中介绍,大家还是自行组合,按照自己的想法去定义全世界的网络吧!
-END-
意大利的猫
有态度
不苟同
写文章不易,有帮助记得打赏一些哦!
领取专属 10元无门槛券
私享最新 技术干货