翻译 | 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 OK\r\nDate: Mon, 08 Nov 2010 05:09:59 GMT\r\nSer...',
                        '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: %s\n' % 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)

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2018-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习和数学

[编程经验]R语言入门及描述性统计分析方法

好吧,我承认,最近都没好好学习了,事情比较多,好几天晚上我都会写下标题,然后就没有然后了,今天再不能忍了,决定来一发。但是,我觉得还是推文的质量要比数量更加重要...

4065
来自专栏猿天地

房价网是怎么使用分布式作业框架elastic-job

Elastic-Job是什么? Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-...

33611
来自专栏北京马哥教育

Linux性能检测常用的10个基本命令

本文的内容主要来自对Netflix的一篇技术博客( Linux Performance Analysis in 60,000 Milliseconds (htt...

1565
来自专栏大数据文摘

数据科学家必备!12个基本命令行工具帮你摆脱鼠标

1733
来自专栏linux驱动个人学习

Linux进程调度器的设计--Linux进程的管理与调度(十七)

调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换...

1472
来自专栏小灰灰

Quick-Task 动态脚本支持框架之结构设计篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构...

1033
来自专栏Golang语言社区

GoLang并发控制(上)

首先解释golang中的channel:channel是go中的核心部分之一,结构体简单概括就是一个ring队列+一个锁 有兴趣的同学可以去研究一下源码构建。在...

1962
来自专栏Crossin的编程教室

如何在 Python 中使用断点调试

实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。 -- 林纳斯·托瓦兹(Linux 之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被...

2986
来自专栏张善友的专栏

Windows Server AppFabric Caching

这套 AppFabric Caching 比我用过的 memcached 复杂多了,MSDN有一篇文章进行介绍Introduction to Caching w...

2129
来自专栏葡萄城控件技术团队

Winform文件下载之WebClient

最近升级了公司内部使用的一个下载小工具,主要提升了下面几点: 1. 在一些分公司的局域网中,连接不上外网 2. 服务器上的文件更新后,下载到的还是更新前的文件 ...

2045

扫码关注云+社区