1.暗黑谷歌的由来

有这么一款搜索引擎,它一刻不停的在寻找着所有和互联网关联的PLC、摄像头、红绿灯、打印机、路由器、交换机、服务器、数据库等等各种软硬件服务设施。

它就是shodan,那么shodan到底是什么呢?怎么会有如此大的魔力?首先,Shodan 是一个搜索引擎,但它与 Google 这种搜索网址的搜索引擎不同,Shodan不是在网上搜索网址,而是直接进入互联网探索其背后的信息。

SRE实战,互联网时代守护先锋!让网站飞一会, 阿里云优惠促销大全。

Shodan真正值得注意的能力就是能找到几乎所有和互联网相关联的东西。其中最受欢迎的搜索内容是:webcam,linksys,cisco,netgear,SCADA等等。

配合其组合参数,可以做到以下功能:

  • 批量搜索现有漏洞主机
  • 统计感染某木马的主机数量
  • 批量扫描登录入口,并使用弱口令字典进行爆破
  • 批量抓取shell
  • 使用自己的0day打遍天下

写这篇文章是希望能够将这款工具的用途、使用方法、利用技巧进行实战应用。以便使用Shodan搜索引擎进行相关搜索,并利用Shodan的API编写Python脚本,进行批量扫描,将技术应用到渗透测试和安全攻防中,最大限度做好安全防御。
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第1张

2.Shodan的工作原理

Shodan每隔一段时间就会对全球大约8亿主机进行扫描,通过对返回Banner信息的处理,识别特定主机,并进行分类储存。为了避免因政治、技术等原因导致的扫描信息误差(比如某墙或某些老美服务商对大陆羊毛党的屏蔽等),Shodan的扫描主机至少遍布在全球的8个国家和地区。

当我们发出一条搜索请求,其背后的逻辑是这样的
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第2张

那Banner是什么呢?
在探测端口时数据包里存在Banner信息

HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Sat, 18 May 2019 06:56:30 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

这是一个普通的HTTP Banner,可以从上获知服务端使用的是1.16.0版本的nginx。

西门子S7-300工控协议的Banner:

Reserved for operating system: 
Serial number of memory card: SD D45C6213
Location designation of a module: 
Module type: CPU 315-2 PN/DP
PLC name: S7-300 station_1
Plant identification: 
OEM ID of a module: 
Module name: Vestas V27 AS+PITCH
Serial number of module: 18382

其中能获取更多的信息。

Shodan的Banner处理机制比较复杂,我们这里只需要知道探测端口是来往的数据包中包含Banner,并包含了主机的部分信息即可。

3.Shodan的查询指南

基本查询

Shodan的参数有很多,这里只介绍简单几种。

hostname:"主机或域名"   如 hostname:"google''
port:"端口或服务" 如 port:"80"
ip : "ip地址" 如 ip : "114.114.114.114"
net:"IP地址或子网"如 net:"111.112.113.110.0/24"
vuln :指定漏洞的cve如 vuln:CVE-2015-8869
但是这个命令最好搭配起来使用,如 country:CN vuln:CVE-2018-0610
os :"操作系统" 如 os:"debian"
isp:"ISP供应商" 如 isp:"China Telecom"
product:"操作系统/软件/平台" 如 product:"nginx"
version:"软件版本" 如 version:"1.16.0"
geo:"经纬度" 如 geo:"38°53.707′,77°02.182"
country`:"国家" 如 country:"China"
city:"城市"  如 city:"shanghai"
org:"组织或公司" 如org:"google"
before/after:"日/月/年" 如 before:"11/05/2019" after:"11/05/2019"
asn : "自治系统号码" 如 asn:"TS1826"

关联查询

搜索上海开放8080端口的主机

Apache city:"shanghai" port:"8080"

可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第3张
搜索IP段为23.238.20.0/24的所有linux主机

os:"linux"  net:"23.238.20.0/24"

可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第4张
Shodan参数还有很多,前提是注册或付费用户:
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第5张

更多信息使用时可以查看中文说明手册,可点击前往。

其他功能

Shodan 不仅可以查找网络设备,它还具有其他相当不错的功能。
Exploits:每次查询完后,点击页面上的 “Exploits” 按钮,Shodan 就会帮我们查找针对不同平台、不同类型可利用的 exploits。当然也可以通过直接访问网址来自行搜索:https://exploits.shodan.io/welcome
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第6张
地图:每次查询完后,点击页面上的 “Maps” 按钮,Shodan 会将查询结果可视化的展示在地图当中;
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第7张
报表:每次查询完后,点击页面上的 “Create Report” 按钮,Shodan 就会帮我们生成一份精美的报表,这是天天要写文档兄弟的一大好帮手啊;
可怕的黑暗料理之暗黑谷歌搜索神器 Safe 第8张

4.命令行下的Shodan

Shodan 是由官方提供的 Python 库的,项目位于:https://github.com/achillean/shodan-python

安装

pip install shodan
或者
git clone https://github.com/achillean/shodan-python.git && cd shodan-python
python setup.py install

本文以debian为例,安装完后我们先看下帮助信息:

root@debian:~# shodan -h
Usage: shodan [OPTIONS] COMMAND [ARGS]...
Options:
  -h, --help  Show this message and exit.
Commands:
  alert       Manage the network alerts for your account  # 管理账户的网络提示
  convert     Convert the given input data file into a...  # 转换输入文件
  count       Returns the number of results for a search  # 返回查询结果数量
  download    Download search results and save them in a...  # 下载查询结果到文件
  honeyscore  Check whether the IP is a honeypot or not.  # 检查 IP 是否为蜜罐
  host        View all available information for an IP...  # 显示一个 IP 所有可用的详细信息
  info        Shows general information about your account  # 显示账户的一般信息
  init        Initialize the Shodan command-line  # 初始化命令行
  myip        Print your external IP address  # 输出用户当前公网IP
  parse       Extract information out of compressed JSON...  # 解析提取压缩的JSON信息,即使用download下载的数据
  scan        Scan an IP/ netblock using Shodan.  # 使用 Shodan 扫描一个IP或者网段
  search      Search the Shodan database  # 查询 Shodan 数据库
  stats       Provide summary information about a search...  # 提供搜索结果的概要信息
  stream      Stream data in real-time.  # 实时显示流数据

常用示例

init
初始化命令行工具。

root@debian:~# shodan init [API_Key] #请使用自己账号的API Key
Successfully initialized

count
返回查询的结果数量。

root@debian:~# shodan count nginx 1.16.0
81840

download
将搜索结果下载到一个文件中,文件中的每一行都是 JSON 格式存储的目标 banner 信息。默认情况下,该命令只会下载10条结果,如果想下载更多结果需要增加 --limit 参数。

root@debian:~# shodan download nginx 1.16.0 --limit 100
Search query:                   1.16.0
Total number of results:        82058
Query credits left:             0
Output file:                    nginx.json.gz
  [###---------------------------------]   10%  00:00:31
Notice: fewer results were saved than requested
Saved 100 results into file nginx.json.gz

parse
我们可以使用 parse 来解析之前下载数据,它可以帮助我们过滤出自己感兴趣的内容,也可以用来将下载的数据格式从 JSON 转换成 CSV 等等其他格式,当然更可以用作传递给其他处理脚本的管道。例如,我们想将上面下载的数据以CSV格式输出IP地址、端口号和组织名称:

root@debian:~# shodan parse --fields ip_str,port,org --separator , nginx.json.gz 
23.239.25.203,80,Linode
85.209.0.11,80,
93.119.176.67,80,0 7 I N T E R N E T . R O
149.202.169.98,80,OVH SAS
138.68.232.31,80,Digital Ocean
195.70.4.97,80,DFI Service SA
47.101.70.248,80,Hangzhou Alibaba Advertising Co.,Ltd.
42.159.196.244,80,Shanghai Blue Cloud Technology Co.,Ltd
142.4.17.163,80,Unified Layer
80.69.173.48,80,UpCloud Cloud Servers
39.100.85.208,80,Hangzhou Alibaba Advertising Co.,Ltd.
156.67.92.27,80,NETRONIK sp. z o.o.
193.112.97.173,80,Tencent cloud computing
47.107.139.162,80,Hangzhou Alibaba Advertising Co.,Ltd.
129.121.192.115,8080,Nexcess.net L.L.C.
162.144.69.141,80,Unified Layer
164.138.216.162,80,SuperHosting.BG Ltd.
......................................... #此处省略N行。

host
查看指定主机的相关信息,如地理位置信息,开放端口,甚至是否存在某些漏洞等信息。

root@debian:~# shodan host 42.159.196.244
42.159.196.244
City:                    Shanghai
Country:                 China
Organization:            Shanghai Blue Cloud Technology Co.,Ltd
Updated:                 2019-05-18T08:13:44.814290
Number of open ports:    2
Vulnerabilities:         CVE-2018-15919 CVE-2017-15906

Ports:
     22/tcp OpenSSH (7.4)
     80/tcp nginx (1.16.0)

search
直接将查询结果展示在命令行中,默认情况下只显示IP、端口号、主机名和HTTP数据。当然我们也可以通过使用 –fields 来自定义显示内容,例如,我们只显示IP、端口号、组织名称和主机名:

root@debian:~# shodan search --fields ip_str,port,org,hostnames nginx 1.16.0
162.144.138.155 80      Unified Layer   server.vitaathletics.com        
85.209.0.11     80                      
162.144.196.17  80      Unified Layer   server.yen.hlv.mybluehost.me    
138.68.232.31   80      Digital Ocean   nexo-host.com.ve        
212.22.64.245   80      LLC Quadronet   timri.ru        
38.143.213.84   80      Cogent Communications           
212.33.243.127  80      JSC ER-Telecom Holding  212x33x243x127.static-business.perm.ertelecom.ru        
64.247.179.214  80      SoftwareWorks Group     useast33.myserverhosts.com      
120.31.140.112  81      FoShan RuiJiang Science and Tech        ns1.eflydns.net;ns2.eflydns.net 
80.69.173.48    80      UpCloud Cloud Servers   80-69-173-48.fi-hel1.upcloud.host       
85.209.0.76     80                      
156.67.92.27    80      NETRONIK sp. z o.o.             
162.144.201.223 80      Unified Layer   server.formacolorytextura.com   
193.112.97.173  80      Tencent cloud computing         
47.110.78.125   80      Hangzhou Alibaba Advertising Co.,Ltd.           
129.121.192.115 8080    Nexcess.net L.L.C.      ip-129-121-192-115.local  
......................................... #此处省略N行。      

5.代码中使用 Shodan 库

上面介绍了 shodan 库的用法,这里描述下如何在python代码中使用 shodan 库,首先需要初始化连接 API,代码如下:

import shodan
SHODAN_API_KEY = "API_Key"
api = shodan.Shodan(SHODAN_API_KEY)

随后,我们就可以搜索数据了,示例代码片如下:

try:
    # 搜索 Shodan
    results = api.search('apache')
    # 显示结果
    print 'Results found: %s' % results['total']
    for result in results['matches']:
            print result['ip_str']
except shodan.APIError, e:
    print 'Error: %s' % e

这里 Shodan.search() 会返回类似如下格式的 JSON 数据:

{
        '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'
                },
                ...
        ]
}

常用 Shodan 库函数

  • shodan.Shodan(key) :初始化连接API
  • Shodan.count(query, facets=None):返回查询结果数量
  • Shodan.host(ip, history=False):返回一个IP的详细信息
  • Shodan.ports():返回Shodan可查询的端口号
  • Shodan.protocols():返回Shodan可查询的协议
  • Shodan.services():返回Shodan可查询的服务
  • Shodan.queries(page=1, sort=’timestamp’, order=’desc’):查询其他用户分享的查询规则
  • Shodan.scan(ips, force=False):使用Shodan进行扫描,ips可以为字符或字典类型
  • Shodan.search(query,page=1,limit=None,offset=None,facets=None,minify=True):查询Shodan数据。

至此,暗黑谷歌的料理介绍完毕,如果有付费的Shodan Membership用户就可以好好的Happy了。与之相似的料理就是Tor浏览器,这是一个无痕浏览的神器。

Tor浏览器的工作原理就是将你的ip跳到一连串的的代理上,比如:把你的ip地址先从美国跳到加拿大再跳到荷兰、日本、德国、俄罗斯。。。。。下载链接:https://www.torproject.org/download/

其中所有的数据全部都是经过加密处理,目的就是为了掩藏真正访问者的ip,防止被访问者的追踪。有兴趣的可以自行研究下,这里不再过多描述,综上内容纯属攻防和白帽子技术爱好。知己知彼,方能百战不殆。加油吧,少年!未来的某一天,白帽子大牛中你可能也是其中之一。