好处

使用api的好处想必是很显而易见的,没有像web那样要很久才能打开,api的速度是非常快的。

数据格式很友好,shodan的api返回的数据格式是json格式的,json的解析非常方便,这对于我们快速开发应用来说是相当不错的。

如何使用

那如何使用shodan的api呢?官方提供了 REST API 的详细文档,这里我们使用Python开发。按照下面的步骤来就可以了。

注册

要想使用shodan的api,首先得需要注册一个shodan账号,注册过程就不描述了,按照提示一步步来,如果你的英文足够烂的话,那么我推荐你使用国内的zoomeye,这个东西就是仿照shodan做的跟shodan做的类似,两者偏向的方向可能不太一样吧但是做的并没有shodan好(补充:因为此前多次尝试调用zoomeye的api,但是始终提示帐号错误,没有成功过),不过还是可以将就下

假设你已经注册好了shodan账号,那么现在请转到api相关的页面 https://developer.shodan.io/api 这个页面详细介绍了 shodan REST API的各种参数,假设你已经有了一些网络编程基础,那么,你看这些文档应该毫无压力。

获取key

api的使用依赖shodan的api key,key的获取也很简单,在页面的右上角,有个 show Apikey的按钮,点击一下即可获得api key

2016-08-15-18-01-32----.png - 大小: 52.65 KB - 尺寸: 415 x 297 - 点击打开新窗口浏览全图

安装python模块

shodan的模块默认是没有安装的,这里需要我们手动安装一下,安装过程也是非常的简单,使用pip就可以了

执行下面的命令即可

sudo pip install shodan

编写脚本

我们定义一个叫shodanSearch的方法用来取回搜索的结果列表

def shodanSearch(keywords,key):

	SHODAN_API_KEY = key
	api = shodan.Shodan(SHODAN_API_KEY)

	iplist = []
	total = 0

	try:
		results = api.search(keywords)
		total = int(results['total'])
		for result in results['matches']: iplist.append({"ip":result['ip_str'],"country":result['location']['country_name']})
		return total,iplist

	except shodan.APIError, e:
		print 'Error: %s' % e
是不是很简单? 好了,下面咱们把返回的结果拿来做一些有趣的事情。

应用实战

这里我找到了Brother打印机的一个升级页面,可以远程操作打印机升级的漏洞,使用shodan来搜索打印机并且获取打印机的型号能相关信息。

我们定义一个checkStatus的方法,并将要检查的ip信息传进去,这个方法将返回结果,方法代码如下

def checkStatus(host):
	aimurl = "http://"+host['ip']+"/admin/firmwareupdate.html"
	try:
		req = requests.get(url = aimurl,timeout = 10)
		html_code = req.content

		title = re.findall(r'<title>(.+?)</title>',html_code)[0]
		code = re.findall(r'<dd>(.+?)</dd>',html_code)[1]
		version = re.findall(r'<dd>(.+?)</dd>',html_code)[2].replace('&nbsp;','')

		if "Brother" in title:
			CHECKLIST.append(host['ip'])
			print aimurl+" ---> "+title+" code:"+code+" version:"+version
	except Exception,e:
		pass
这里我定义了一个全局变量CHECKLIST,如果获取成功便将成功的IP追加到 CHECKLIST 这个列表中

好了,是不是非常简单,看下实战截图吧 

2016-08-15-18-16-47------.png - 大小: 85.3 KB - 尺寸: 1018 x 355 - 点击打开新窗口浏览全图

由于免费API有100条的限制,所以这里最多显示100条结果,当然了,100条对我们开说已经足够了,遍历一遍可是需要不少时间,所以我加上了多线程,10秒内就可以跑完。

好了,使用方法就这么点,非常简单,完整的脚本就不上传了,剩下的也就十几行代码。