前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Developer API

Developer API

作者头像
意大利的猫
发布2020-08-19 19:53:17
5180
发布2020-08-19 19:53:17
举报
文章被收录于专栏:漫流砂漫流砂

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

for banner in api.stream.banners():

ifhas_vuln(banner, 'CVE-2015-0204'):

print banner

常规的API订阅只能访问1%的提要。数据许可客户仅可获得100%的访问权限。

Network Alert

网络提醒是实时的,主要分为以下两个步骤

  1. 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.订阅

for banner in api.stream.alert(alert['id']):

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的最后一篇文章了,官方文档中介绍了蜜罐和工业控制系统的一些知识,这个还是弥足珍贵的,官方文档之前已经发到群了。

把之前介绍的知识进行组合就可以产生意想不到的效果,有些方法不适合在公众号中介绍,大家还是自行组合,按照自己的想法去定义全世界的网络吧!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NOP Team 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档