首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Developer API

开发者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-

意大利的猫

有态度

不苟同

写文章不易,有帮助记得打赏一些哦!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180113G09BIG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券