好处
使用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
安装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(' ','') if "Brother" in title: CHECKLIST.append(host['ip']) print aimurl+" ---> "+title+" code:"+code+" version:"+version except Exception,e: pass这里我定义了一个全局变量CHECKLIST,如果获取成功便将成功的IP追加到 CHECKLIST 这个列表中
好了,是不是非常简单,看下实战截图吧
由于免费API有100条的限制,所以这里最多显示100条结果,当然了,100条对我们开说已经足够了,遍历一遍可是需要不少时间,所以我加上了多线程,10秒内就可以跑完。
好了,使用方法就这么点,非常简单,完整的脚本就不上传了,剩下的也就十几行代码。
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。