Sipcer's Blog

Shodan使用笔记之开发篇

TL;DR

介绍Shodan api的开发接口及数据结构,本文分为三部分,查询,扫描,告警。

初始化

安装shodan https://github.com/achillean/shodan-python

1
pip install shodan

初始化

1
2
import shodan
api = shodan.Shodan('YOUR API KEY')

查询

1
2
3
4
results = api.search("apache") #返回第一页
results = api.search("apache", page=2) #返回第一页
for banner in api.search_cursor('apache'): #相当于遍历第一页results['matches']
print(banner)

results格式如下:
其中total为结果数量,matches包含所有搜索结果,一次search最多返回100条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
'total': 1234,
'matches': [
{'_shodan': {'crawler': 'c4f6dbc...',
'id': 'd39a2f2e-...',
'module': 'http',
'options': {}},
'asn': 'AS11111',
'data': 'HTTP/1.1 200 ...',
'deprecated': {'html': {'eol': '2016-12-xx', 'new': 'http.html'},
'title': {'eol': '2016-12-xx', 'new': 'http.title'}},
'domains': [],
'hash': -1234567890,
'hostnames': [],
'http': {'components': {'jQuery': {'categories': ['javascript-frameworks']}},
'html': '<html>...'
'host': 'x.x.x.x',
'html_hash': -1234567890,
'location': '/',
'redirects': [],
'robots': None,
'server': None,
'sitemap': None,
'title': ''},
'ip': 1234567890,
'ip_str': 'x.x.x.x',
'isp': 'test',
'location': {'area_code': None,
'city': 'Beijing',
'country_code': 'CN',
'country_code3': 'CHN',
'country_name': 'China',
'dma_code': None,
'latitude': 00.0000000,
'longitude': 00.000,
'postal_code': None,
'region_code': '30'},
'org': 'test',
'os': None,
'port': 80,
'timestamp': '2016-12-22T10:10:14.842784',
'title': '',
'transport': 'tcp'},
...
]
}

Host Lookup

1
2
host = api.host('217.140.75.46') #查询单个IP
host = api.host('217.140.75.46', history=True) #查询某个IP的历史结果

当history为True时数据结构如下,其中data存储了历史数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
'area_code': None,
'asn': 'AS00000',
'city': 'Beijing',
'country_code': 'CN',
'country_code3': 'CHN',
'country_name': 'China',
'data': [...],
'dma_code': None,
'hostnames': [...],
'ip': 0000000000,
'ip_str': '0.0.0.0',
'isp': 'xx Technology',
'last_update': '2016-12-20T17:06:49.527271',
'latitude': 00.00000000000000,
'longitude': 000.00000000000000,
'org': 'xx Technology',
'os': None,
'ports': [...],
'postal_code': None,
'region_code': '30',
'tags': [...],
'vulns': [..]
}

data下的字典结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
'_shodan': {...},
'asn': 'AS0000',
'cpe': [...],
'data': 'HTTP/1.1 200 OK\r\n...',
'deprecated': {...},
'domains': [],
'hash': -123,
'hostnames': [],
'http': {
{'components': {'jQuery': {'categories': ['javascript-frameworks']}},
'host': 'xxxx.com',
'html_hash': -12345678,
'location': '/',
'redirects': [{'data': 'HTTP/1.0 302 Found...',
'host': 'xxx.com',
'location': '/'}],
'robots': 'Disallow...',
'server': 'nginx/1.6.2',
'sitemap': None,
'title': '官网'}
},
'ip': 12345678,
'ip_str': '0.0.0.0',
'isp': 'Technology',
'location': {...},
'opts': {...},
'org': 'Technology',
'os': None,
'port': 80,
'product': 'nginx',
'timestamp': '2016-12-20T17:06:49.527271',
'title': 'xx官网',
'transport': 'tcp',
'version': '1.6.2'
}

扫描

告警