翻译 | python利用shodan搜集信息

时间:2022-04-27
本文章向大家介绍翻译 | 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)