翻译 | python利用shodan搜集信息
文中提及的部分技术、工具可能带有一定的攻击性、仅供安全学习和教学用途,禁止非法使用!
安装
为了开始使用Shodan的Python库,首先要确保你已经收到了API密钥。一旦完成,就可以通过以下方法来安装库:
(注:API密钥可以通过注册shodan账户获得)
$ easy_install shodan
升级到最新版本:
$ easy_install -U shodan
由于向后兼容的特性,所以更新库始终是安全的。通常,库的新版本仅仅意味着有新的方法/特性可用。
连接到api
我们的代码中需要做的第一件事是初始化API对象:
import shodan
SHODAN_API_KEY = "API密钥 "
api = shodan.Shodan(SHODAN_API_KEY)
搜索Shodan
现在我们已经有了API对象,我们就准备执行搜索了:
#将请求包装在一个try/ except块中以捕获错误
try:
# Search Shodan
results = api.search('apache')
# Show the results
print 'Results found: %s' % results['total']
for result in results['matches']:
print 'IP: %s' % result['ip_str']
print result['data']
print ''
except shodan.APIError, e:
print 'Error: %s' % e
遍历代码,我们首先调用api对象的Shodan.search()方法,它将返回的结果信息放入字典。然后,我们打印出总共发现了多少结果,最后通过返回的匹配进行循环,并打印IP和标语。每一页的搜索结果包含多达100个结果。
还有很多信息会通过函数返回。下面是一个简短的示例字典,它由Shodan.search()返回:
{
'total': 8669969,
'matches': [
{
'data': 'HTTP/1.0 200 OKrnDate: Mon, 08 Nov 2010 05:09:59 GMTrnSer...',
'hostnames': ['pl4t1n.de'],
'ip': 3579573318,
'ip_str': '89.110.147.239',
'os': 'FreeBSD 4.4',
'port': 80,
'timestamp': '2014-01-15T05:49:56.283713'
},
...
]
}
访问REST API文档(https://developer.shodan.io/api),以获得方法返回属性的完整列表。
把所有API请求都封装在一个try/ except子句中也是一种很好的做法,因为任何错误都会引发异常。但为了简单起见,我们现在暂时不用try/ except。
查找主机
要查看Shodan在特定IP上可用的内容,我们可以使用Shodan.host()函数:
#查找主机
host = api.host('217.140.75.46')
#输出信息
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搜索
#!/usr/bin/env python
#
# shodan_ips.py
#搜索SHODAN并打印与查询匹配的IP列表#
# Author: achillean
import shodan
import sys
# Configuration
API_KEY = "YOUR_API_KEY"
#输入验证
if len(sys.argv) == 1:
print 'Usage: %s <search query>' % sys.argv[0]
sys.exit(1)
try:
# Setup the api
api = shodan.Shodan(API_KEY)
#执行搜索
query = ' '.join(sys.argv[1:])
result = api.search(query)
#循环匹配并打印每个IP
for service in result['matches']:
print service['ip_str']
except Exception as e:
print 'Error: %s' % e
sys.exit(1)
使用Facets收集摘要信息
Shodan API的强大功能是获取各种属性的摘要信息。例如,如果你想了解哪些国家拥有大量的Apache服务器,那么你可以使用facets。如果你想弄清楚nginx最流行的版本是什么,你也可以使用facets。或者,如果你想查看微软iis服务器的正常运行时间分布,也需要使用facets。
下面的脚本展示了如何使用shodan.Shodan.count()方法在不返回任何结果的情况下搜索Shodan,并请求API返回关于organization, domain, port, ASN和 country的多方面信息。
#!/usr/bin/env python
#
# query-summary.py
#搜索Shodan并打印查询的摘要信息。#
# Author: achillean
import shodan
import sys
# Configuration
API_KEY = 'YOUR API KEY'
#我们想要的摘要信息的属性列表
FACETS = [
'org',
'domain',
'port',
'asn',
#我们只关心前3个国家,所以我们让Shodan返回3而不是默认的5。
#如果你想看到超过5个,例如,你可以使用(“country”,1000),查看前1000个国家的搜索查询。
('country', 3),
]
FACET_TITLES = {
'org': 'Top 5 Organizations',
'domain': 'Top 5 Domains',
'port': 'Top 5 Ports',
'asn': 'Top 5 Autonomous Systems',
'country': 'Top 3 Countries',
}
#输入验证
if len(sys.argv) == 1:
print 'Usage: %s <search query>' % sys.argv[0]
sys.exit(1)
try:
# Setup the api
api = shodan.Shodan(API_KEY)
#从命令行参数中得到一个查询字符串
query = ' '.join(sys.argv[1:])
#使用count()方法,因为它不返回结果,也不需要付费API计划
#它的运行速度也比search()快.
result = api.count(query, facets=FACETS)
print 'Shodan Summary Information'
print 'Query: %s' % query
print 'Total Results: %sn' % result['total']
#打印来自各个方面的摘要信息
for facet in result['facets']:
print FACET_TITLES[facet]
for term in result['facets'][facet]:
print '%s: %s' % (term['value'], term['count'])
# Print an empty line between summary info
print ''
except Exception, e:
print 'Error: %s' % e
sys.exit(1)
Sample Output
=============
./query-summary.py apache
Shodan Summary Information
Query: apache
Total Results: 34612043
Top 5 Organizations
Amazon.com: 808061
Ecommerce Corporation: 788704
Verio Web Hosting: 760112
Unified Layer: 627827
GoDaddy.com, LLC: 567004
Top 5 Domains
secureserver.net: 562047
unifiedlayer.com: 494399
t-ipconnect.de: 385792
netart.pl: 194817
wanadoo.fr: 151925
Top 5 Ports
80: 24118703
443: 8330932
8080: 1479050
81: 359025
8443: 231441
Top 5 Autonomous Systems
as32392: 580002
as2914: 465786
as26496: 414998
as48030: 332000
as8560: 255774
Top 3 Countries
US: 13227366
DE: 2900530
JP: 2014506
实时访问SSL证书
新的Shodan Streaming API可以实时访问Shodan正在收集的信息。 使用Streaming API,可以原始访问Shodan搜索引擎中的所有数据。 请注意,无法使用Streaming API进行搜索,也无法执行REST API的任何其他操作。 这意味着大规模的实时数据消耗。
此脚本仅适用于具有订阅API计划的人员! 默认情况下,Streaming API只返回Shodan收集的数据的1%。 如果你希望获得更多信息,请通过support@shodan.io与我们联系以获取价格信息。
#!/usr/bin/env python
#
# cert-stream.py
# Shodan正在收集的SSL证书
#
#警告:此脚本仅适用于拥有订阅API计划的人员!
#默认情况下,Streaming API只返回Shodan收集的数据的1%。
#如果你想获得更多的访问权限,请联系我们sales@shodan.io获取价格
#信息
# Author: achillean
import shodan
import sys
# Configuration
API_KEY = 'YOUR API KEY'
try:
# Setup the api
api = shodan.Shodan(API_KEY)
print 'Listening for certs...'
for banner in api.stream.ports([443, 8443]):
if 'ssl' in banner:
# Print out all the SSL information that Shodan has collected
print banner['ssl']
except Exception as e:
print 'Error: %s' % e
sys.exit(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法