DSLBQ'S_BLOG

标签: Shodan

  • Shodan手册

    Shodan手册

    前言

    本文主要对Complete Guide to Shodan的内容进行增、删、改,虽篇幅较长,但内容涉及了Shodan的搜索语法、客户端命令行、API编程、工具插件、工控等,较为详细,适合当作Shodan手册。代码和搜索示例均已亲自测试并附截图。

    介绍

    Shodan是一个搜索互联网连接设备的搜索引擎,不同于谷歌、必应、百度这些搜索引擎。用户可以在Shodan上使用Shodan搜索语法查找连接到互联网的摄像头、路由器、服务器等设备信息。在渗透测试中,是个很不错的神器。

    Shodan的搜索流程:

    关于数据

    Shodan采集的基本数据单位是banner。banner是描述设备所运行服务的标志性文本信息。对于Web服务器来说,其将返回标题或者是telnet登陆界面。Banner的内容因服务类型的不同而相异。

    以下这是一个典型的HTTP Banner:

    HTTP/1.1 200 OK
    Server: nginx/1.1.19
    Date: Sat, 03 Oct 2015 06:09:24 GMT
    Content-Type: text/html; charset=utf-8
    Content-Length: 6466
    Connection: keep-alive
    

    上面的banner显示该设备正在运行一个1.1.19版本的nginx Web服务器软件

    下面是西门子S7工控系统协议的一个banner,这次返回的banner完全不同,提供了大量的详细数据(有关的固件信息、序列号):

    Copyright: Original Siemens Equipment
    PLC name: S7_Turbine
    Module type: CPU 313C
    Unknown (129): Boot Loader           A
    Module: 6ES7 313-5BG04-0AB0  v.0.3
    Basic Firmware: v.3.3.8
    Module name: CPU 313C
    Serial number of module: S Q-D9U083642013
    Plant identification: 
    Basic Hardware: 6ES7 313-5BG04-0AB0  v.0.3
    

    注:Shodan搜索的是联网设备运行服务的banner,不是单一的主机信息。如果单个IP暴露很多服务信息,在指定特定搜索内容的时候,搜索结果只会出现指定的内容,不会显示其他的服务信息。

    设备元数据

    除了获取banner,Shodan还可以获取相关设备的元数据,例如地理位置、主机名、操作系统等信息。大部分元数据可以通过Shodan的官网获取,小部分的可以通过使用API编程获取。

    IPv6

    据统计,截至2015年10月,Shodan每月收集数百万条关于IPv6设备的可用数据。不过与收集的数亿个IPv4 banner相比,这些数字还是苍白。预计在未来几年会有所增长。

    数据采集

    频率

    Shodan的爬虫全天候工作,并实时更新数据库。在任何时候使用Shodan查询,都可以获得最新的结果。

    分布式

    爬虫分布于世界各地,包括:

    • 美国(东海岸和西海岸)
    • 中国
    • 冰岛
    • 法国
    • 台湾
    • 越南
    • 罗马尼亚
    • 捷克共和国

    从世界各地收集数据是为了防止地区各种因素的差异造成数据的偏差。例如,美国的许多系统管理员会封锁整个中国的IP范围,分布在世界各地的Shodan爬虫就可以确保任何全国性的封锁不会影响数据收集。

    随机

    Shodan爬虫的基本算法是:

    1. 生成一个随机的IPv4地址
    2. 从Shodan能解析的端口列表中生成一个随机端口测试
    3. 检测随机端口上的随机IPv4地址,并获取Banner
    4. 继续步骤1

    这意味着爬行器不扫描增量的网络范围。爬行是完全随机的,以确保在任何给定的时间内对因特网进行统一的覆盖,并防止数据的偏差。

    深入SSL

    SSL正在成为互联网上重要的服务,Shodan也随之扩展性地收集其banner,包括收集每个SSL的功能服务及其漏洞信息,比如HTTPS,不仅仅是SSL证书。

    漏洞测试

    心脏出血漏洞

    如果某服务有心脏出血漏洞Heartbleed bug),返回的banner将包含以下2个附加属性。opts.heartbleed包含了对服务进行心脏出血漏洞测试的原始回应(在测试中,爬虫只抓取少量溢出来确认服务是否受到心脏出血的影响,不会获取泄露的私钥)。若设备容易受到攻击,爬虫会将CVE-2014-0160添加到opts.vulns列表中;若不易受到攻击,则会返回!CVE-2014-0160

    {
        "opts": {
            "heartbleed": "... 174.142.92.126:8443 - VULNERABLE\n",
            "vulns": ["CVE-2014-0160"]
        }
    }
    

    Shodan也支持漏洞信息搜索。比如,要搜索美国受心脏滴血漏洞影响可在shodan输入country:US vuln:CVE-2014-0160

    FREAK

    如果服务支持导出密码,则爬虫程序就将“CVE-2015-0204”项添加到opts.vulns属性

    "opts": {
        "vulns": ["CVE-2015-0204"]
    }
    
    Logjam

    爬虫将短暂使用Diffie-Hellman密码连接到SSL服务,若连接成功就存储返回以下信息:

    "dhparams": {
        "prime": "bbbc2dcad84674907c43fcf580e9...",
        "public_key": "49858e1f32aefe4af39b28f51c...",
        "bits": 1024,
        "generator": 2,
        "fingerprint": "nginx/Hardcoded 1024-bit prime"
    }
    
    版本

    通常情况下,当浏览器连接到SSL服务时,它将协商应该与服务器一起使用的SSL版本和密码。然后,他们会就某个SSL版本(如TLSv1.2)达成一致,然后将其用于通信。

    Shodan爬虫开始按照上面所述的正常请求,与服务器进行协商连接SSL。但是,之后,他们还显式地尝试使用其他的SSL版本连接到服务器。换句话说,爬行器尝试使用SSLv2、SSLV3、TLSv1.0、TLSv1.1和TLSv1.2连接到服务器,来确定该SSL服务支持的所有版本。

    收集到的信息将在ssl.versions版本字段中显示:

    {
        "ssl": {
            "versions": ["TLSv1", "SSLv3", "-SSLv2", "-TLSv1.1", "-TLSv1.2"]
        }
    }
    

    如果在版本前面有一个-符号,那么该设备不支持SSL版本。如果版本不以-开头,则服务支持给定的SSL版本。例如,上面的服务器支持: TLSv1SSLv3

    不支持版本:SSLv2TLSv1.1TLSv1.2

    TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。见传输层安全性协议

    版本信息可以通过shodan的网站或者API搜索。例如,输入ssl.version:sslv2搜索查询将返回允许使用SSLv2的所有SSL服务(包括HTTP、SMTP、HTTP、POP3、IMAP等)

    遵循链

    证书链是从root到最终用户的SSL证书列表;SSL的banner服务包括一个ssl.chain属性,该属性包含PEM序列化证书中链的所有SSL证书。

    基础之上

    对于大多数服务,爬虫试图分析主要的banner文本,并解析出有用的信息。不过有些情况是,抓取MongoDB的集合名称,从远程桌面服务获取屏幕截图,存储比特币的对等点列表。有两种Shodan使用的高级数据分析技术,我想强调一下:

    Web组件

    爬虫也会尝试确定创建网站的Web技术。对于http和https模块,将分析header和HTML来分解网站的组件。结果信息存储在http.components属性中。该属性是一个技术字典,关键是技术的名称(例如jQuery),值是另一个具有类别属性的字典。categories属性是与技术相关的类别列表。例如

    "http": {
        ...
            "components": {
                "jQuery": {
                    "categories": ["javascript-frameworks"]
                },
                "Drupal": {
                    "categories": ["cms"]
                },
                "PHP": {
                    "categories": ["programming-languages"]
                }
            },
                 ...
        },
    

    http.components表明该网站在运行Drupal内容管理系统,该系统本身使用的jQueryPHPShodan REST API使信息通过过滤器http.component和2个方面(http.componen和http.component_category)进行搜索。要获得所有可能的组件/类别值的完整列表,请使用新的方面。例如,要获得所有可能类别的完整列表,请使用以下shodan命令:

    shodan stats --facets http.component_category:1000 http
    

    级联

    如果一个banner返回了关于对等点的信息,或者有关于另一个运行服务的IP地址的信息,那么爬虫就会试图在这个IP/服务上执行一个banner抓取。例如:主线DHT(过去用于Bittorrent)的默认端口是6881。这样一个DHT节点的banner看起来如下:

    DHT Nodes
    97.94.250.250	58431
    150.77.37.22	34149
    113.181.97.227	63579
    252.246.184.180	36408
    83.145.107.53	52158
    77.232.167.126	52716
    25.89.240.146	27179
    147.23.120.228	50074
    85.58.200.213	27422
    180.214.174.82	36937
    241.241.187.233	60339
    166.219.60.135	3297
    149.56.67.21	13735
    107.55.196.179	8748
    

    以前,抓取工具会抓取上面的banner,然后继续抓取。现通过为DHT banner的抓取启用级联功能,抓取工具现在可以为所有的对等启动新的banner抓取请求。在上面的示例中,搜寻器将使用DHT banner捕获器,在IP为97.94.250.250的58431端口上启动扫描150.77.37.22,继续在端口34149上启动扫描,依此类推。也就是说,如果初始扫描数据包含有关其他潜在主机的信息,对IP的单次扫描可能会导致级联扫描。

    为了跟踪初始扫描请求与任何子级/级联请求之间的关系,我们引入了2个新属性:

    • _shodan.id:banner的唯一ID。如果可以从服务启动级联请求,这个属性就一定存在,但这并不一定意味着级联请求会成功。
    • _shodan.options.referrer:提供触发创建当前banner的banner的唯一ID。即引用者是当前banner的父代。

    Web界面

    访问Shodan收集的数据最简单的方法是通过Web界面。所有的人都可以输入一个需要查询的设备。

    搜索查询说明

    默认情况下,搜索查询仅查看主横幅文本,不搜索元数据。例如,如果您要搜索“Google”,那么搜索结果将只包含标题中显示“Google”文本的结果;它不一定会返回Google网络范围的结果。

    如上所述,搜索“谷歌”返回许多组织购买并连接到Internet的谷歌搜索设备;它不返回谷歌的服务器。

    Shodan将尝试找到匹配所有搜索项的结果,这意味着隐含地在每个搜索项之间存在+AND连接符号。例如,搜索查询“apache + 1.3”相当于“apache 1.3”

    要搜索特定的元数据需要使用搜索过滤器。

    过滤器

    过滤器是Shodan用来根据服务或设备的元数据缩小搜索结果的特殊关键字。输入过滤器的格式是:

    注意:和值之间没有空格

    要使用包含过滤器空间的值,必须将值包含在双引号中。例如搜索圣地亚哥的所有联网设备:

    筛选多个值可以使用,分开。比如要查找23号端口和1023号端口上运行telnet的设备:

    如果过滤语法不允许使用逗号(如port,hostname,net),那么可以使用多个值联合查询:

    port:80,8080  city:"beijing" hostname:"baidu.com"
    

    当然也可以使用-排除结果。比如:

    port:23,1023  -city:"San Diego"
    

    有时候也需要过滤一些主文本标题为空的搜索结果,这时候就需要使用-hash:0。比如:

    Shodan上的每个banner都有一个哈希值,对于空的banner,hash值就为0。若尝试搜索简短的、静态的banner,使用哈希过滤语法就比较便捷。

    shodan支持大量的过滤器,比较常用的是:

    过滤器名描述举例
    category现有的分类:ics, malwarecategory:"malware"
    city城市的名字city:"San Diego"
    country国家简写country:"ES" country:"CN"
    netCIDR格式的IP地址net:190.30.40.0/24
    hostname主机名或域名hostname:"google"
    port端口号port:21
    org组织或公司org:"google"
    ispISP供应商isp:"China Telecom"
    product软件、平台product:"Apache httpd" product:"openssh"
    os操作系统os:"Windows 7 or 8"
    version软件版本version:"2.6.1"
    geo经纬度geo:"46.9481,7.4474"

    搜索引擎

    默认情况下,搜索查询将查看过去30天内收集的数据。

    下载数据

    完成搜索后,顶部将出现一个名为“下载数据”的按钮。点击该按钮将为您提供以JSON,CSV(XML已经弃用)格式下载搜索结果的选项。

    JSON格式的文件,其中每行包括全部的banner和所有附带的元数据收集信息。这是保存所有可用信息的首选格式。格式与Shodan命令行客户端兼容,这意味着可以从Shodan网站下载数据,然后使用终端进一步处理。

    CSV格式的文件,返回包含IP、端口,banner,组织和主机名内容。它不包含由于CSV文件格式的限制收集的所有Shodan信息。如果只关心结果的基本信息,并希望快速将其加载到外部工具(如Excel)中,可以使用此方法。

    下载数据会消耗积分,积分需要在网站上购买。积分与Shodan API没有任何关联,并且不会每月自动更新。1积分可用于下载10000个结果。

    生成报告

    Shodan可让根据搜索查询生成报告。该报告包含图表,可以全面了解互联网上的分发结果。这个功能是免费的,任何人都可以使用。

    分享结果

    搜索完成之后,可以自定义,分享内容给其他Shodan用户。

    共享搜索查询是公开查看的

    例子

    搜索美国的服务器在8080端口上运行8.0版本IIS服务的服务器:

    port:8080 product:"Microsoft-IIS" country:"US" version:"8.0"
    

    搜索可能受到DOUBLEPULSAR攻击的机器:

    port:445 "SMB Version: 1" os:Windows !product:Samba
    

    搜索所有nist.gov域名里的apache服务:

    apache hostname:.nist.gov
    

    图标搜索

    通过已知icon hash搜索目标

    0x01 获取谷歌地址

    ping一下google,获得一个谷歌ip,为172.217.27.174

    0x02 查看原数据

    使用shodan搜索刚才获取的IP,并找到查看原始数据那一行

    0x03 查找favicon hash

    打开原始数据,找到data.1.http.favicon.hash,其值为708578229:

    0x04 图标hash搜索

    在Shodan网页搜索的过滤器处输入http.favicon.hash:708578229就可以搜索shodan所收录的谷歌的网站。

    0x05 favicon data

    data.1.http.favicon.data的值是base64,可以自行验证

    通过未知icon hash搜索目标

    0x01 背景

    在分析一个站点的登陆界面,没有其他信息,只有一个icon的时候,这时候就可以通过shodan搜索相同模板的站来入手,找突破口。

    如果目标已经被shodan收录,直接搜索对应的IP就能通过上述方法进行图标hash搜索。如果是目标未被收录,就可以通过现在这个方法来进行侧面突破。

    0x02 原理

    shodan对icon的处理其实是通过MurmurHash进行存储的。MurmurHash是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,[6]都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。其地址在github

    0x03 icon hash的生成验证

    直接在本地使用pip安装mmh3。

    验证代码如下:

    import mmh3
    import requests
    response = requests.get('https://www.baidu.com/favicon.ico')
    favicon = response.content.encode('base64')
    hash = mmh3.hash(favicon)
    print hash
    

    运行验证代码获得icon hash

    在shodan中进行http.favicon.hash:-1507567067搜索,验证成功

    0x04 扩展

    例如http://common.cnblogs.com/favicon.ico得到博客园的icon,直接将图标地址放入脚本中计算其hash值,得到-395680774,再在shodan中搜索http.favicon.hash:-395680774

    Shodan地图

    https://maps.shodan.io/

    直观的地图界面,显示搜索的结果

    使用可改变显示风格,有卫星、街景选项。

    Shodan Exploits

    https://exploits.shodan.io

    Shodan Exploits收集来自CVE,Exploit DB和Metasploit的漏洞和攻击,使其可通过Web界面进行搜索。

    Shodan Exploit搜索的结果不同于Shodan,Exploit搜索的内容包括exploit的信息和元数据。

    名称描述举例
    author漏洞或exploit的作者author:"Tom Ferris"
    description描述description:"remote"
    platform平台platform:"php" platform:"windows" platform:"Linux"
    type漏洞类型type:"remote" type:"dos"

    Shodan Images

    https://images.shodan.io

    顶部的搜索框使用与Shodan主搜索引擎相同的语法。使用搜索框按组织或网点筛选最有用。但是,它也可以用于过滤显示的图像类型。

    图像数据主要来自:

    • VNC
    • Remote Desktop (RDP)
    • RTSP
    • Webcams
    • X Windows

    每个图像源来自不同的端口/服务,因此具有不同的banner。如果只想看到来自摄像头的图像,你可以搜索:

    查找VNC可以输入RFB,查找RTSP可以使用RTSP

    如果在Shodan中搜索截图,可以使用has_screenshot:true

    has_screenshot:true country:"KR"
    

    共享的Shodan搜索语法

    链接见https://www.shodan.io/explore

    关于Shodan的外部工具

    Shodan命令行界面

    安装最新的Shodan可以通过

    安装该工具之后,使用API对其进行初始化操作:

    alert命令

    alert命令提供创建、列表、清除和删除网络提醒的能力。

    convert命令

    convert命令是导出Shodan的搜索结果文件,比如JSON文件。

    count命令

    统计查询结果

    shodan count microsoft iis 6.0
    

    download命令

    搜索Shodan并将结果导出到JSON文件中(请参阅附录A)。

    默认情况下,只下载1000个结果。如果想导出更多的结果,加上--limit标志。

    download命令可以保存搜索结果到本地,随时使用parse命令处理结果,当再次导出相同搜索内容的时候,就不必再花费积分导出。

    shodan download  microsoft iis 6.0
    

    host命令

    查看有关主机的信息,例如它位于何处,哪些端口是开放的以及哪个组织拥有其IP。

    shodan host 189.201.128.250
    

    honeyscore命令

    检查IP地址是否是蜜罐。

    shodan honeyscore 41.231.95.212
    

    info命令

    查询自己的API账户信息,包括本月剩余的查询次数和扫描积分数量。

    myip命令

    返回本机的出口IP(类似于curl ip.cn

    parse命令

    使用parse来分析使用导出的搜索结果。它可以让过滤出感兴趣的字段,也可以将JSON转换为CSV。这样,对于导入到其他脚本比较友好。

    以下命令输出之前下载的Microsoft-IIS数据,并且将JSON文件转换为的CSV格式的文件。其中包括IP地址,端口和归属组织:

    shodan parse --fields ip_str,port,org --separator , microsoft-data.json.gz
    

    scan命令

    scan命令提供了一些子命令。最重要的一个是submit命令,这个命令可以使用shodan执行网络扫描。

    shodan scan submit 198.20.99.0/24
    

    默认情况下,它将显示IP,端口,主机名和数据。您可以使用--fields来打印感兴趣的任何banner字段。

    search命令

    search命令搜索时候,终端将以友好的方式显示结果。默认情况下,它将显示IP,端口,主机名和数据。不过可以使用--fields参数来打印感兴趣的任何banner字段。

    shodan search --fields ip_str,port,org,hostnames microsoft iis 6.0
    

    stats命令

    提供关于搜索的摘要信息,当然可以用于统计信息。命令显示了Apache Web服务器所在的最常用的国家:

    shodan stats --facets country apache
    

    stream命令

    stream命令提供对Shodan爬虫收集的实时数据流的访问。

    该命令支持许多不同的选项,但有2个是重要的提及:

    • --datadir:可以指定流数据存储的目录,生成的文件格式YYYY-MM-DD.json.gz。每天只要保持数据流运行,就会生成一个新的文件。
      • 例如:从实时数据流保存数据到指定路径,可以使用shodan stream --datadir /var/lib/shodan/
    • --limit:指定应下载多少结果。默认情况下,该stream命令将一直运行,直到退出该工具。但是,如果只想收集数据样本,那么--limit参数可确保收集少量记录。
      • 例如:shodan stream --limit 100可以连接到Shodan实时流,打印出前100条记录,然后退出
    • --ports:接受逗号分隔端口,收集指定端口记录的清单
      • 例如:shodan stream --ports 80,8080

    例子

    官方例子

    官方例子见 28 public asciicasts by Shodan:https://asciinema.org/~Shodan

    网络分析例子

    Shodan最常见的使用案例是使用它来更好地了解公共网络范围内的运行情况。Shodan命令行工具可以快速帮助、处理你的目标。例如,查看78.13.0.0/16段在网上暴露了多少服务。

    shodan count net:78.13/16
    

    count命令提供了关于78.13.0.0/16段暴露了4960个服务

    统计出该网段暴露的最多端口数的top10:

    shodan stats --facets port net:78.13/16
    

    有时候也需要详尽的端口暴露数分配报告,因此指定最大的端口,返回此端口范围的暴露数统计情况:

    shodan stats --facets port:100000 net:78.13/16
    

    该网络上有955个端口被发现暴露,并统计出各自端口暴露数。最多的是7547端口,这个端口是调制解调器的端口,这个端口也有很多的安全问题可以关注。在统计中也有一些非常见的标准端口,这些端口大多是为了掩盖自己真实的Web服务。

    统计该网段的80、443端口上的服务情况:

    shodan stats --facets product "HTTP net:78.13/16 -port:80,443"
    

    这里应将端口号放在引号中,防止bash认为该port是shodan的命令参数。

    分析SSL的例子

    若要了解整个网络的SSL使用情况,可按照以下来查询

    shodan stats --facets ssl.version HTTP net:78.13/16
    

    可以看出大多运行的是TLS1.0及其以上的版本,不过还有一些古老的设备在使用sslv2。

    在web端的shodan搜索出来:

    分析telnet情况

    mkdir telnet-data
    
    shodan stream --ports 23,1023,2323 --datadir telnet-data / --limit 10000
    

    创建一个名为telnet-data的目录来存储telnet数据,然后从实时数据流中导出10000条记录,存储在telnet-data文件夹中

    Maltego扩展组件/assets

    shodan扩展组件为Maltego提供了2/assets新的实体功能(service和exploit)和五个转换:

    • searchShodan
    • searchShodanByDomain
    • searchShodanByNetblock
    • toShodanHost
    • searchExploits

    浏览器插件

    ChromeFirefox都有插件可以使用

    Metasploit

    MSF主要有两个shodan模块:

    1. Shodan的常用搜索:`auxiliary/gather/shodan_search`
    
    use auxiliary/gather/shodan_search
    
    set SHODAN_APIKEY ********************
    
    set QUERY ****
    
    run 
    
    1. Shodan的蜜罐验证:auxiliary/gather/shodan_honeyscore:
    use auxiliary/gather/shodan_honeyscore 
    
    set SHODAN_APIKEY ********************
    
    set TARGET your_target
    
    run
    

    Recon-ng

    先添加shodan API的key:

    keys add shodan_api VZbVJy***n8S****hS1YM1****enTuy
    

    显示可用的模块:

    使用shodan搜索主机名:

    use recon/domains-hosts/shodan_hostname
    

    设置参数,并运行:

    show options
    set SOURCE google
    set LIMIT 1
    run
    

    Developer API

    Shodan提供了一个开发者的API(https://developer.shdan.io/api)来编程,获取所需要的信息。可以通过网站完成的事情都可以通过代码完成。

    该API分为两部分:REST API和Streaming API。REST API提供搜索Shodan的方法,查找主机,获取关于查询的信息的摘要。Streaming API提供Shodan当前收集的数据的原始实时返回。有几个不同的套餐可以获取,该API获取的数据不能被搜索或用其他方式进行交互,适用于需要获取大量数据的人。

    只有购买开发者API计划的人才能获得Streaming API。

    使用限制

    根据API的套餐不同,API会有不同的限制:

    1. 搜索:每月的搜索次数有不同的限制,且需要使用查询积分。如果直接查询不会消耗查询积分,若进行过滤器或者是超过一页的搜索就需要消耗查询积分。搜索apache不需要消耗查询积分,搜apache country:"US"将会消耗一个查询积分,就算查询第二页也只会消耗一个查询积分。
    2. 扫描:按需获得的API也会根据积分限制每月扫描主机的数量。对于每个主机的扫描都需要一个扫描积分才能扫描。
    3. 网络提醒:根据不同的API的使用次数可以使用提醒功能监视所查询的IP。只有付费客户才能使用此功能,且无法在账户中创建超过100条提醒。

    Facets

    过滤器缩小搜索结果。而Facets提供关注的banner字段的聚合信息,会得到一个大的结果视图。例如,Shodan网站使用Facets来提供搜索的统计信息,类似于在左侧显示的:

    Facets有很多可以选择的参数。比如port:22Facetsssh.fingerprint,输出的时候就能显示出网络上SSH的详细条目。

    目前Facet只能在API和Shodan的命令行上使用

    入门

    所有的例子使用python来演示,当然其他的语言也有Shodan的库/客户端

    为python环境安装Shodan库:

    如果已经安装shodan,可以使用:

    初始化

    首先要做的是初始化:

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

    在https://account.shodan.io获取API密钥

    搜索

    已经拥有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和banner。每一页的搜索结果多达100个。

    当然查询的时候还有很多返回信息。下面是Shodan.search返回的部分信息:

    {
    	'total': 23199543,
    	'matches': [
    		{
    			'data': 'HTTP/1.1 301 Moved Permanently\r\nDate: Thu, 01 Feb 2018 02:43:53 GMT',
    			'hostnames':['mypage.ponparemall.com'],
    			'ip': 2685469827L,
    			'ip_str': '160.17.4.131',
    			'port': 80,443,
    			'isp': Recruit Holdings Co.,Ltd.,
    			'timestamp': '2018-02-01T02:47:34.036371'
    		},
    		...
    	]
    }
    

    有关banner可能包含的属性的完整列表请参阅附录A

    默认情况下,为了节省带宽使用量,banner中的一些大的字段会被截断(比如HTML的)。若想要检索所有的信息,只需使用minify=False禁用概要。例如,用以下代码可以将匿名VNC服务的查询结果全部返回:

    results = api.search('has_screenshot:true', minify=False)
    

    任何错误都会引发异常,将API请求封装在try/except是一种良好的代码习惯,不过为了简单起见,例子暂时不用try/except

    以上脚本仅输出第一页的搜索结果。要想获得第二页或更多的结果,可以使用page参数执行请求:

    results = api.search('apache',page=2)
    

    如果想遍历所有的结果,使用search_cursor()方法会更加便捷:

    for banner in api.search_cursor('apache'):
        print(banner['ip_str']) # 打印出该IP的每个banner
    

    search_cursor()方法只能循环结果,返回banner,不能使用Facets

    主机查找

    要用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'))
    
    # 打印所有的banner
    for item in host['data']:
    	print """
    		Port: %s
    		Banner: %s
    		""" % (item['port'], item['data'])
    

    默认情况下,Shodan只返回最近收集的主机的信息。如果想获取IP地址的完整历史记录,就使用history参数。

    host = api.host('217.140.75.46', history=True)
    

    虽然以上代码可以返回所有banner,但其中也包括一些可能不再在主机上活动的服务。

    扫描

    Shodan每月至少爬取一次,但是如果想用Shodan立即扫描网络,就可以使用API​​扫描。(订购的不同API有不同的扫描次数)

    与Nmap等工具扫描不同,使用Shodan进行的扫描是异步完成的,在进行Shodan扫描之后不会马上就收到扫描结果。这取决于开发人员是如何收集扫描结果的,是直接查找IP信息,是用Shodan直接搜索,还是订购实时信息流查找。Shodan命令行界面在启动扫描后,创建临时网络提醒,然后根据实时数据流出扫描结果。

    scan = api.scan('198.20.69.0/24')
    

    也可以使用CIDR表示法的地址来提供扫描目标:

    scan = api.scan(['198.20.49.30', '198.20.74.0/24'])
    

    在向API提交了扫描请求之后,会返回以下信息:

    {
    	'id': 'R2XRT5HH6X67PFAB',
    	'count': 1,
    	'credits_left': 5119
    }
    
    • id:唯一的扫描标识符
    • count: 提交的IP扫描数
    • credits: 剩余的扫描积分

    实时数据流

    Streaming API是一种基于HTTP的服务,可返回Shodan收集的实时数据流。它不提供任何搜索或查找功能,它只是抓取工具收集的所有内容的概要。

    例如,以下是一个脚本的部分代码,可以从容易受到FREAK(CVE-2015-0204)攻击的设备输出banner:

    def has_vuln(banner, vuln):
        if 'vulns' in banner['opts'] and vuln in banner['opts']['vulns']:
            return True
        return False
    
    for banner in api.stream.banners():
        if has_vuln(banner, 'CVE-2015-0204'):
            print banner
    

    在上面的例子中,has_vuln()方法检查服务是否可能存在CVE-2015-0204

    banner中的许多属性是可选的,这样可以节省空间和带宽。为了使可选属性更容易处理,最好在函数中封装对属性的访问。

    注意:常规的API能访问的数量仅仅是订购的API数量的1%,只有订购了API具有许可证的客户才有100%的访问权限

    网络提醒

    要创建网络提醒,需要提供一个提醒名称和一个IP范围。名称应该具有概述性,当受到提醒的时候,就大概知道是什么监视内容被返回了。

    alert = api.create_alert('Production network', '198.20.69.0/24')
    

    正如scan()方法一样,可以提供监视的网络范围列表:

    alert = api.create_alert('Production and Staging network', [
    	'198.20.69.0/24',
    	'198.20.70.0/24',
    ])
    

    只能使用有限数量的监视IP,并且每个帐户不能有超过100个监视提醒在活动。

    将网络提醒与扫描API结合使用时,一个有用的技巧是设置提醒的时间:

    alert = api.create_alert('Temporary alert', '198.20.69.0/24', expires=60)
    

    上述代码可以使得提醒会激活使用60s,60s之后就会停止,不再进行监视。

    成功创建提醒之后,API将返回以下对象:

    {
    	"name": "Production network", 
    	"created": "2015-10-17T08:13:58.924581", 
    	"expires": 0, 
    	"expiration": null, 
    	"filters": {
    		"ip": ["198.20.69.0/24"]
    	},
    	"id": "EPGWQG5GEELV4799",
    	"size": 256
    }
    

    订阅

    一旦创建了提醒,就可以将其用作实时数据流的监视。

    for banner in api.stream.alert(alert['id']):
    	print banner
    

    与常规实时流一样,该alert()方法提供了一个迭代器,其中每个项目都是由Shodan爬虫收集的banner。idalert()方法需要的唯一参数,在有网络提醒时会返回提醒ID。

    使用Shodan命令行界面

    接下来讲述如何使用Shodan的命令行界面快速清除基于Python代码创建的提醒。

    clear命令将会清除电脑上创建的所有alert。

    清除所有alert:

    $ shodan alert clear
    Removing Scan: 198.20.69.0/24 (ZFPSZCYUKVZLUT4F)
    Alerts deleted
    

    列出alert列表,确认有无alert:

    $ shodan alert list
    You haven't created any alerts yet.
    

    创建一个新的alert:

    $ shodan alert create "Temporary alert" 198.20.69.0/24
    Successfully created network alert!
    Alert ID: ODMD34NFPLJBRSTC
    

    最后一步是订阅监视提醒,并存储返回的数据。要为创建的警报传输结果,将ODMD34NFPLJBRSTC的警报ID提供给stream命令:

    $ mkdir alert-data
    $ shodan stream --alert=ODMD34NFPLJBRSTC --datadir=alert-data
    

    上面的命令中,使用ID为ODMD34NFPLJBRSTC的alert提醒,并且使用数据流传输结果。结果将存储在名为alert-data的目录中。每天都会在alert-data目录中生成具有一个当天收集banner的新文件。也就是说,不用关心轮转文件,stream命令会处理这些。几天后,目录将如下所示:

    $ ls alert-data
    2016-06-05.json.gz
    2016-06-06.json.gz
    2016-06-07.json.gz
    

    例子

    常用 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, ufacets=None, minify=True):查询Shodan数据

    例子——基本的搜索

    #!/usr/bin/env python
    #
    # shodan_ips.py
    # Search SHODAN and print a list of IPs matching the query
    #
    # Author: achillean
    
    import shodan
    import sys
    
    # Configuration
    API_KEY = "VZbVJyrIrn8SCSxHhS1YM1XPeKt5nTuy"
    
    # Input validation
    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)
    
            # Perform the search
            query = ' '.join(sys.argv[1:])
            result = api.search(query)
    
            # Loop through the matches and print each 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;若想查看Microsoft-IIS服务器的正常运行时间,那么可以使用Facets

    以下脚本显示了如何使用shodan.Shodan.count()方法在使用Shodan API进行搜索时候不返回任何详细结果,只返回组织、域、端口、ASN和国家的信息:

    #!/usr/bin/env python
    #
    # query-summary.py
    # Search Shodan and print summary information for the query.
    #
    # Author: achillean
    
    import shodan
    import sys
    
    # Configuration
    API_KEY = 'YOUR API KEY'
    
    # 键入想获取的信息
    FACETS = [
        'org',
        'domain',
        'port',
        'asn',
    
        # 只关注前三城市,('country', 3)让Shodan返回前三城市
        # Facet默认五个搜索区域(比如搜索1000个国家,就键入('country', 1000)
    ]
    
    FACET_TITLES = {
        'org': 'Top 5 Organizations',
        'domain': 'Top 5 Domains',
        'port': 'Top 5 Ports',
        'asn': 'Top 5 Autonomous Systems',
        'country': 'Top 3 Countries',
    }
    
    # Input validation
    if len(sys.argv) == 1:
        print 'Usage: %s <search query>' % sys.argv[0]
        sys.exit(1)
    
    try:
        # 键入Shodan API
        api = shodan.Shodan(API_KEY)
    
        # Generate a query string out of the command-line arguments
        query = ' '.join(sys.argv[1:])
    
        # 使用count()方法,因为它不返回结果,不需要通过付费API才能使用
        # count()运行速度快于search().
        result = api.count(query, facets=FACETS)
    
        print 'Shodan Summary Information'
        print 'Query: %s' % query
        print 'Total Results: %s\n' % result['total']
    
        # 从Facets打印摘要信息。
        for facet in result['facets']:
            print FACET_TITLES[facet]
    
            for term in result['facets'][facet]:
                print '%s: %s' % (term['value'], term['count'])
    
            # 在摘要信息之间打印一条空行
            print ''
    
    except Exception, e:
        print 'Error: %s' % e
        sys.exit(1)
    

    例子——利用API编写GIF图片

    Shodan很好得保存了爬取的IP的完整历史记录,可以通过API编写Python脚本,输出Shodan爬虫收集的屏幕截图的。

    环境:

    需要的Python包:

    • shodan:sudo easy_install shodan安装
    • arrow: sudo easy_install arrow安装。arrow包用于将banner的时间戳字段解析为Python datetime对象。

    需要的软件包:

    sudo apt-get install imagemagick //将多个图像合并成一个GIF动画所需要
    
    easy_install -U requests simplejson
    

    代码参见:Timelapse GIF Creator using the Shodan API

    import arrow
    import os
    import shodan
    import shodan.helpers as helpers
    import sys
    
    
    # Settings
    API_KEY = ''
    
    # The user has to provide at least 1 Shodan data file
    if len(sys.argv) < 2:
    	print('Usage: {} <shodan-data.json.gz> ...'.format(sys.argv[0]))
    	sys.exit(1)
    
    # GIFs are stored in the local "data" directory
    os.mkdir('data')
    
    # Setup the Shodan API object
    api = shodan.Shodan(API_KEY)
    
    # Loop over all of the Shodan data files the user provided
    for banner in helpers.iterate_files(sys.argv[1:]):
    	# See whether the current banner has a screenshot, if it does then lets lookup
    	# more information about this IP
    	has_screenshot = helpers.get_screenshot(banner)
    	if has_screenshot:
    		ip = helpers.get_ip(banner)
    		print('Looking up {}'.format(ip))
    		host = api.host(ip, history=True)
    		
    		# Store all the historical screenshots for this IP
    		screenshots = []
    		for tmp_banner in host['data']:
    			# Try to extract the image from the banner data
    			screenshot = helpers.get_screenshot(tmp_banner)
    			if screenshot:
    				# Sort the images by the time they were collected so the GIF will loop
    				# based on the local time regardless of which day the banner was taken.
    				timestamp = arrow.get(banner['timestamp']).time()
    				sort_key = timestamp.hour
    
    				# Add the screenshot to the list of screenshots which we'll use to create the timelapse
    				screenshots.append((
    					sort_key,
    					screenshot['data']
    				))
    
    		# Extract the screenshots and turn them into a GIF if we've got more than a few images
    		if len(screenshots) >= 3:
    			# screenshots is a list where each item is a tuple of:
    			# (sort key, screenshot in base64 encoding)
    			# 
    			# Lets sort that list based on the sort key and then use Python's enumerate
    			# to generate sequential numbers for the temporary image filenames
    			for (i, screenshot) in enumerate(sorted(screenshots, key=lambda x: x[0], reverse=True)):
    				# Create a temporary image file
    				# TODO: don't assume that all images are "jpg", use the mimetype instead
    				open('/tmp/gif-image-{}.jpg'.format(i), 'w').write(screenshot[1].decode('base64'))
    			
    			# Create the actual GIF using the  ImageMagick "convert" command
    			# The resulting GIFs are stored in the local data/ directory
    			os.system('convert -layers OptimizePlus -delay 5x10 /tmp/gif-image-*.jpg -loop 0 +dither -colors 256 -depth 8 data/{}.gif'.format(ip))
    
    			# Clean up the temporary files
    			os.system('rm -f /tmp/gif-image-*.jpg')
    
    			# Show a progress indicator
    			print('GIF created for {}'.format(ip))
    

    使用iterate_files()遍历Shodan数据文件。在shodan.Shodan.host()方法中获取所有Shodan收集的IP的banner历史记录。

    下载屏幕截图的JSON数据包:

    shodan download --limit -1 screenshots.json.gz has_screenshot:true
    

    *例子——公开的MongoDB数据

    MongoDB是一个流行的NoSQL数据库。在很长一段时间内,MongoDB默认是不需要输入用户名和密码,就可以登录。导致了许多MongoDB的服务在互联网上可以被公开访问。(见shodan扫描结果:3万个MongoDB可以无密码访问 大概包含595Tb数据

    使用Shodan抓取这些数据库的banner,其中包含了大量关于存储数据的信息。以下是banner的概要:

    IP: 115.231.180.54
    MongoDB Server Information
    Authentication partially enabled
    {
        "storageEngines": [
            "devnull", 
            "ephemeralForTest", 
            "mmapv1", 
            "wiredTiger"
        ], 
        "maxBsonObjectSize": 16777216, 
        "ok": 1.0, 
        "bits": 64, 
        "modules": [], 
        "openssl": {
            "compiled": "OpenSSL 1.0.1f 6 Jan 2014", 
            "running": "OpenSSL 1.0.1f 6 Jan 2014"
        }, 
        "javascriptEngine": "mozjs", 
        "version": "3.2.18", 
        "gitVersion": "4c1bae566c0c00f996a2feb16febf84936ecaf6f", 
        "versionArray": [
            3, 
            2, 
            18, 
            0
        ], 
        "debug": false, 
        "buildEnvironment": {
            "cxxflags": "-Wnon-virtual-dtor -Woverloaded-virtual -Wno-maybe-uninitialized -std=c++11", 
            "cc": "/opt/mongodbtoolchain/bin/gcc: gcc (GCC) 4.8.2", 
            "linkflags": "-fPIC -pthread -Wl,-z,now -rdynamic -fuse-ld=gold -Wl,-z,noexecstack -Wl,--warn-execstack", 
            "distarch": "x86_64", 
            "cxx": "/opt/mongodbtoolchain/bin/g++: g++ (GCC) 4.8.2", 
            "ccflags": "-fno-omit-frame-pointer -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -Werror -O2 -Wno-unused-local-typedefs -Wno-unused-function -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-missing-braces -fno-builtin-memcmp", 
            "target_arch": "x86_64", 
            "distmod": "ubuntu1404", 
            "target_os": "linux"
        }, 
        "sysInfo": "deprecated", 
        "allocator": "tcmalloc"
    },
    ....
    

    基本上,banner是MongoDB服务器信息和及其3个JSON对象用逗号分隔而组成。或者有的banner里有需要登陆凭据的验证字符——“authentication enabled”。每个JSON对象都包含有关数据库的不同信息,建议在Shodan网站上查看完整的头信息,方法是搜索:

    metrics字符保证了搜索时只搜索不需要认证的MongoDB服务

    接下来使用banner信息统计最流行的数据库名称,以及在互联网上暴露的数据量。基本的工作流程:

    1. 下载所有的MongoDB banner数据
    2. 处理下载的文件,并输出前十个数据库名称的列表以及总数据大小
    shodan download --limit -1 mongodb-servers.json.gz product:mongodb
    

    上述命令功能是,利用Shodan搜索关于mongodb的设备信息,并使用--limit -1指令下载所有的查询结果,输出到mongodb-servers.json.gz文件。

    使用Python脚本处理刚才所下载的数据。

    要轻松遍历文件,将使用shodan.helpers.iterate_files()方法:

    import shodan.helpers as helpers
    import sys
    
    # datafile变量是命令行的第一个参数
    datafile = sys.argv[1]
    
    for banner in helpers.iterate_files(datafile):
        # 获得banner
    

    由于每个banner仅仅是带有头信息的JSON,因此可以使用simplejson库将banner处理为本地的Python字典:

    # 去除Shodan加入的MongoDB的头信息
    data = banner['data'].replace('MongoDB Server Information\n', '').split('\n},\n'\
    )[2]
    # 加载数据库信息
    data = simplejson.loads(data + '}')
    

    接下来的事情就是记录暴露的数据总量和最流行的数据库名称:

    total_data = 0
    databases = collections.defaultdict(int)
    
    ...
    
        # 然后循环
        # 跟踪可访问的数据
        total_data += data['totalSize']
    
        # 跟踪哪些数据库使用最多
        for db in data['databases']:
            databases[db['name']] += 1
    

    Python有一个有用的collections.defaultdict类,该类的功能是,如果字典的键尚不存在,这个类将自动为字典的键创建一个默认值。只需访问 MongoDB banner的totalSizedatabases属性即可收集的信息。最后,我们只需要输出实际结果:

    print('Total: {}'.format(humanize_bytes(total_data)))
    
    counter = 1
    for name, count in sorted(databases.iteritems(), key=operator.itemgetter(1),reverse=True[:10]:
        print('#{}\t{}: {}'.format(counter, name, count))
        counter += 1
    

    首先打印数据总量,然后使用humanize_bytes()方法将字节存储转换为易读的MB、GB等存储格式。

    其次,对数据库集合进行多次逆序遍历排序(key=operator.itemgetter(1)),取结果的TOP10([:10])。

    以下是读取Shodan数据文件并分析banner的完整脚本:

    #!C:\Python27\python.exe
    # -*- coding: utf-8 -*-
    # @Time    : 2018/2/2 10:01
    # @Author  : b404
    # @File    : MongDB_Shodan.py
    # @Software: PyCharm
    
    import collections
    import operator
    import shodan.helpers as helpers
    import sys
    import simplejson
    
    def humanize_bytes(bytes, precision=1):
        """将字节转换为易读的存储单位MB、GB等
    
        Assumes `from __future__ import division`.
    
        >>> humanize_bytes(1)
        '1 byte'
        >>> humanize_bytes(1024)
        '1.0 kB'
        >>> humanize_bytes(1024*123)
        '123.0 kB'
        >>> humanize_bytes(1024*12342)
        '12.1 MB'
        >>> humanize_bytes(1024*12342,2)
        '12.05 MB'
        >>> humanize_bytes(1024*1234,2)
        '1.21 MB'
        >>> humanize_bytes(1024*1234*1111,2)
        '1.31 GB'
         >>> humanize_bytes(1024*1234*1111,1)
            '1.3 GB'
            """
        abbrevs = (
            (1 << 50L, 'PB'),
            (1 << 40L, 'TB'),
            (1 << 30L, 'GB'),
            (1 << 20L, 'MB'),
            (1 << 10L, 'kB'),
            (1, 'bytes')
        )
        if bytes == 1:
            return '1 byte'
        for factor, suffix in abbrevs:
            if bytes >= factor:
                break
        return '%.*f %s' % (precision, bytes / factor, suffix)
    
    total_data = 0
    databases = collections.defaultdict(int)
    for banner in helpers.iterate_files(sys.argv[1]):
        try:
            # 去除Shodan加入的MongoDB的头信息
            data = banner['data'].replace('MongoDB Server Information\n', '').split('\n},\n')[2]
    
            # 加载数据库信息
            data = simplejson.loads(data + '}')
            # 记录公开访问的数据量
            total_data += data['totalSize']
    
            # 跟踪哪些数据库名称最常见
            for db in data['databases']:
                databases[db['name']] += 1
        except Exception, e:
            pass
    
    print('Total: {}'.format(humanize_bytes(total_data)))
    
    counter = 1
    for name, count in sorted(databases.iteritems(), key=operator.itemgetter(1), reverse=True)[:10]:
        print('#{}\t{}: {}'.format(counter, name, count))
    counter += 1
    

    该脚本输出:

    Total: 569.7 GB
    #1	Warning: 1448
    #1	local: 1172
    #1	admin: 488
    #1	README: 113
    #1	config: 67
    #1	test: 43
    #1	DATA_HAS_BEEN_BACKED_UP: 19
    #1	logs: 19
    #1	db_has_been_backed_up: 15
    #1	gpsreal: 11
    

    工业控制系统

    工控指的是工业自动化控制,主要利用电子电气、机械、软件组合实现。打比方说,工业控制系统(ICS)是控制周围世界的计算机。它们负责管理办公室的空调、发电厂的涡轮机、剧院的照明设备或者工厂的机器人。

    可以去灯塔实验室(http://plcscan.org/blog/)和https://cs3sthlm.se/ 了解工控的相关姿势

    SHINE项目(SHodan INTElligence Extraction)研究表明,从2012至2014年,互联网上至少有200万个可公开访问的工控设备。在2012年,第一个包含500,000个ICS设备的数据库被发送到ICS- cert。ICS-CERT认定,在美国50万的设备中,大约有7200个是关键的基础设施。随着对工控安全做出很多努力,越来越多的工控设备进行漏洞修补或者关机下线。但这是一个具有挑战性的问题,而且针对工控安全问题的解决方案没有一个是简单的。

    下图是2014年Shodan爬取的工控全球分布图:

    常用缩写

    以下是一些常用的缩写,有助于后面了解协议,快速找到ICS设备:

    缩写说明
    SCADA数据采集与监视控制系统
    ICS工业控制系统
    DCS分布式控制系统/集散控制系统
    PCS过程控制系统
    ESD应急停车系统
    PLC可编程序控制器(Programmable Logic Controller)
    RTU远程终端控制系统
    IED智能监测单元
    HMI人机界面(Human Machine Interface)
    MIS管理信息系统(Management Information System)
    SIS生产过程自动化监控和管理系统(Supervisory Information System)
    MES制造执行管理系统
    BMS建筑管理系统(uilding Management System)
    VNC虚拟网络计算(Virtual Network Computing)

    协议

    识别联网的控制系统有两种不同的方式:

    1. 在ICS环境中使用的非ICS协议。

    Shodan的ICS搜索结果大部分是通过搜索WEB服务器或其他常用的协议发现的,这些协议并不是直接与ICS相连接,而是可以在ICS网络上看到。例如,运行在HMI上的Web服务器或未经身份验证的Windows远程桌面直接连接在ICS网络上,这些协议将回提供一个ICS的可视化界面。(但大多常用某种形式进行身份验证)

    2. ICS协议

    ICS协议是控制系统使用的原始协议。每个ICS协议都有其独特的标志,它们都有一个共同点:它们不需要任何认证。这意味着,如果可以远程访问工业设备,则可以自动对其进行读取和写入。但是,原始的ICS协议往往很难开发,是独有的,实际也很难与控制系统交互。也就是使用Shodan很容易检查设备是否支持ICS协议。

    下图的banner是一个Siemens S7 PLC设备的Shodan搜索图,banner暴露了其序列号和位置:

    Modbus

    MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。

    工控安全问题:

    • 缺乏认证:仅需要使用一个合法的Modbus地址和合法的功能码即可以建立一个Modbus会话
    • 缺乏授权:没有基于角色的访问控制机制,任意用户可以执行任意的功能。
    • 缺乏加密:地址和命令明文传输,可以很容易地捕获和解析

    PROFIBUS

    PROFIBUS 一种用于工厂自动化车间级监控和现场设备层数据通信与控制的现场总线技术,可实现现场设备层到车间级监控的分散式数字控制和现场通信网络

    DNP3

    DNP3 DNP(Distributed Network Protocol,分布式网络协议)是一种应用于自动化组件之间的通讯协议,常见于电力、水处理等行业。简化OSI模型,只包含了物理层,数据层与应用层的体系结构(EPA)。SCADA可以使用DNP协议与主站、RTU、及IED进行通讯。

    ICCP

    ICCP 电力控制中心通讯协议。

    OPC

    OPC 过程控制的OLE (OLE for Process Control)。OPC包括一整套接口、属性和方法的标准集,用于过程控制和制造业自动化系统。

    BACnet

    BACnet 楼宇自动控制网络数据通讯协议(A Data Communication Protocol for Building Automation and Control Networks)。BACnet 协议是为计算机控制采暖、制冷、空调HVAC系统和其他建筑物设备系统定义服务和协议

    CIP

    CIP 通用工业协议,被deviceNet、ControINet、EtherNet/IP三种网络所采用。

    Siemens S7

    Siemens S7 属于第7层的协议,用于西门子设备之间进行交换数据,通过TSAP,可加载MPI,DP,以太网等不同物理结构总线或网络上,PLC一般可以通过封装好的通讯功能块实现。

    其他工控协议

    其他工控协议IEC 60870-5-104、EtherNet/IP、Tridium Niagara Fox、Crimson V3、OMRON FINS、PCWorx、ProConOs、MELSEC-Q

    架构缺陷

    • 未经真正安全考验的组件与协议
      • 若有Web服务,那就利用Web服务该有的缺陷
      • 经典渗透技巧大多适用于工控网络
    • 稳定性优先+懒 → 升级难
    • 互联网的便利性,让工控组件暴露在网络空间里
    • 以协议研究为出发点

    工控系统的指纹识别技术

    http://plcscan.org/blog/2017/03/fingerprint-identification-technology-of-industrial-control-system/

    信息探测

    Ethernet/IP

    Port:44818

    • Nmap: enip-enumerate.nse
    • Python: https://github.com/paperwork/pyenip
    • Wireshark dissector
      • src/epan/dissector/packet-etherip.c

    Modbus

    • port:502
    • 抓取设备相关信息
    • Nmap: modicon-info.nse
    • Wireshark dissector
      • src/epan/dissector/packet-mbtcp.c
    • 认证与加密缺失

    IEC 61870-5-101/104

    • Port: 2404
    • 判断是否使用该协议
      • Nmap: iec-identify.nse
      • Wireshark dissector
        • src/epan/dissectors/packet-iec104.c
    • 认证与加密缺失

    Siemens S7

    • key:Siemens S7 PLC(102)
    • 抓取设备相关信息
    • Nmap: s7-enumerate_.nse
      • http://plcscan.org/blog/wp-content/uploads/2014/11/s7-enumerate.nse_.txt
    • Wireshark plugins
      • http://sourceforge.net/projects/s7commwireshark/
    • 弱加密,易破解

    Tridium Niagara Fox

    • port:1911
    • 抓取设备信息
      • Nmap: fox-info.nse

    以下是有关banner的最新属性字段列表(若要查看最新的,请访问在线文档):

    常用属性

    名称描述举例
    asn自治系统号AS4837
    data服务的主要bannerHTTP/1.1 200…
    ip整数型的IP地址格式493427495
    ip_str字符串型IP199.30.15.20
    ipv6字符串型IPv62001:4860:4860::8888
    port服务的端口号80
    timestamp收集信息的日期2014-01-15T05:49:56.283713
    hash数据属性的散列值Numeric hash of the data property
    hostnames目标IP的主机名[“shodan.io”, “www.shodan.io”]
    domains目标IP的所有域名[“shodan.io”]
    link网络连接类型以太网/调制解调器
    location设备的物理地址见下文
    opts补充或者实验数据不包含在主要的banner中 
    org分配IP的组织Google Inc.
    isp负责IP空间的ISPVerizon Wireless
    os操作系统Linux
    uptimeIP上线时间50
    tags描述设备用途的标签列表(仅供企业型账号使用)[“ics”, “vpn”]
    transport用于收集banner的传输协议(UDP或者是TCP)tcp

    Elastic属性

    下列属性是为 Elastic (曾经的 ElasticSearch)收集的:

    名称描述
    elastic.cluster有关集群的一般信息
    elastic.indices集群上可用的索引列表
    elastic.nodes群集的节点/对等点列表及其信息

    HTTP(S)属性

    Shodan遵循HTTP响应的重定向,并将所有中间数据存储在banner中。抓取工具不遵循重定向的情况是HTTP请求被重定向到HTTPS位置,反之亦然:

    名称描述
    http.components用于创建网站的网络技术
    http.host发送主机名来抓取网站的HTML
    http.html网站的HTML内容
    http.html_hashhttp.html属性的数字散列
    http.location最终的HTML响应的位置
    http.redirects遵循的重定向列表。每个重定向项目有3个属性:主机,数据和位置
    http.robotsrobots.txt文件的网站
    http.serverHTTP响应的服务器头
    http.sitemap网站的Sitemap XML
    http.title网站的标题

    位置属性

    名称描述
    area_code设备位置的区号
    city城市名称
    country_code2个字母组成的国家代码
    country_code33个字母组成的国家代码
    country_name国家的全名
    dma_code指定市场区号(仅限美国)
    latitude纬度
    longitude经度
    postal_code邮政编码
    region_code地区代码

    SMB属性

    名称描述
    smb.anonymous服务是否允许匿名连接(true/false)
    smb.capabilities服务支持的功能列表
    smb.shares可用的网络共享列表
    smb.smb_version用于收集信息的协议版本
    smb.software提供服务的软件
    smb.raw服务器发送的十六进制编码数据包列表;如果想做SMB解析,这很有用

    SSH属性

    名称描述
    ssh.cipher协商期间使用的密码
    ssh.fingerprint设备的指纹
    ssh.kex服务器支持的密钥交换算法列表
    ssh.key服务器的SSH密钥
    ssh.mac消息认证码算法

    SSL 属性

    如果服务使用SSL进行包装,则Shodan将执行附加测试,并在以下属性中提供结果:

    名称描述
    ssl.acceptable_cas服务器接受的证书颁发机构列表
    ssl.cert可解析的SSL证书
    ssl.cipherSSL连接的首选密码
    ssl.chain从用户证书到根证书的SSL证书列表
    ssl.dhparamsDiffie-Hellman参数
    ssl.tlsext服务器支持的TLS扩展列表
    ssl.versions支持的SSL版本;如果该值用-开头,则该服务不支持该版本(例如:“-SSLv2”是指不支持SSLv2的服务)

    ISAKMP属性

    以下为使用ISAKMP协议的VPN(例如IKE)收集的属性:

    名称描述
    isakmp.initiator_spi初始化器的hex编码的安全参数索引
    isakmp.responder_spi用于响应器的hex编码的安全参数索引
    isakmp.next_payload启动后发送的下一个载荷
    isakmp.version协议版本;例如“1.0”
    isakmp.exchange_type交换类型
    isakmp.flags.encryption加密设置:true或false
    isakmp.flags.commit提交设置:true或false
    isakmp.flags.authentication认证设置:true或false
    isakmp.msg_id消息的十六进制编码标识
    isakmp.lengthISAKMP数据包的大小

    特殊属性

    _shodan

    _shodan属性包含有关数据如何被Shodan收集的信息。它与其他属性不同,因为它不提供有关设备的信息。相反,它会告诉你Shodan使用哪一个banner抓取器来与目标IP交互。这对于探知服务器上的端口运行服务情况是很重要的。例如,80端口是最知名的Web服务端口,但它也被各种恶意软件用来规避防火墙规则,_shodan属性将让你知道是该端口否用HTTP模块来收集数据或是否使用了反恶意软件模块。

    名称描述
    _shodan.crawler识别Shodan爬取工具的唯一ID
    _shodan.id此banner的唯一ID
    _shodan.module爬虫抓取banner而使用SHodan模块的名称
    _shodan.options数据收集期间使用的配置选项
    _shodan.hostname发送Web请求时使用的主机名
    _shodan.options.referrer为某端口/服务触发扫描的banner的惟一ID

    例子

    {
       "timestamp": "2014-01-16T08:37:40.081917","timestamp": "2014-01-16T08:37:40.081917",
       "hostnames": ["hostnames": [
          "99-46-189-78.lightspeed.tukrga.sbcglobal.net""99-46-189-78.lightspeed.tukrga.sbcglobal.net"
       ],],
       "org": "AT&T U-verse","org": "AT&T U-verse",
       "guid": "1664007502:75a821e2-7e89-11e3-8080-808080808080","guid": "1664007502:75a821e2-7e89-11e3-8080-808080808080",
       "data": "NTP\nxxx.xxx.xxx.xxx:7546\n68.94.157.2:123\n68.94.156.17:123","data": "NTP\nxxx.xxx.xxx.xxx:7546\n68.94.157.2:123\n68.94.156.17:123",
       "port": 123,"port": 123,
       "isp": "AT&T U-verse","isp": "AT&T U-verse",
       "asn": "AS7018","asn": "AS7018",
       "location": {"location": {
          "country_code3": "USA","country_code3": "USA",
          "city": "Atlanta","city": "Atlanta",
          "postal_code": "30328","postal_code": "30328",
          "longitude": -84.3972,"longitude": -84.3972,
          "country_code": "US","country_code": "US",
          "latitude": 33.93350000000001,"latitude": 33.93350000000001,
          "country_name": "United States","country_name": "United States",
          "area_code": 404,"area_code": 404,
          "dma_code": 524,"dma_code": 524,
          "region_code": null"region_code": null
       },},
       "ip": 1664007502,"ip": 1664007502,
       "domains": ["domains": [
          "sbcglobal.net""sbcglobal.net"
       ],],
       "ip_str": "99.46.189.78","ip_str": "99.46.189.78",
       "os": null,"os": null,
       "opts": {"opts": {
          "raw": "\\x97\\x00\\x03*\\x00\\x03\\x00H\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01G\\x06\\xa7\\x8ec.\\xbdN\\x00\\x00\\x00\\x01\\x1dz\\x07\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00i\\x00\\x00\\x00\\x00\\x00\\x00\\x00XD^\\x9d\\x02c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00o\\x00\\x00\\x00\\x00\\x00\\x00\\x00YD^\\x9c\\x11c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00","raw": "\\x97\\x00\\x03*\\x00\\x03\\x00H\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01G\\x06\\xa7\\x8ec.\\xbdN\\x00\\x00\\x00\\x01\\x1dz\\x07\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00i\\x00\\x00\\x00\\x00\\x00\\x00\\x00XD^\\x9d\\x02c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00q\\x00\\x00\\x00o\\x00\\x00\\x00\\x00\\x00\\x00\\x00YD^\\x9c\\x11c.\\xbdN\\x00\\x00\\x00\\x01\\x00{\\x04\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00",
          "ntp": {"ntp": {
             "more": false"more": false
          }}
       }}
    }}
    
    

    附录B:搜索语法关键词列表

    常用语法

    过滤器名描述类型举例
    after只显示给出日期之后的结果(dd/mm/yyyy)stringafter:"04/02/2017"
    asn自治系统号码stringasn:"AS4130"
    before只显示给出日期之前的结果(dd/mm/yyyy)stringbefore:"04/02/2017"
    category现有的分类:ics,malwarestringcategory:"malware"
    city城市的名字stringcity:"San Diego"
    country国家简写stringcountry:"ES" country:"CN"
    geo经纬度stringgeo:"46.9481,7.4474"
    hash数据的hash值int-hash:0
    has_ipv6是否是IPv6booleanhas_ipv6:true
    has_screenshot是否有截图booleanhas_screenshot:true
    hostname主机名或域名stringhostname:"google"
    ipip地址stringip:"54.67.82.248 "
    ispISP供应商stringisp:"China Telecom"
    org组织或公司stringorg:"google"
    os操作系统stringos:"Windows 7 or 8"
    port端口号intport:21
    postal邮政编码(仅限于美国)stringpostal:"98221"
    product软件、平台stringproduct:"Apache httpd" product:"openssh"
    region地区或国家别名string
    state string
    netCIDR格式的IP地址stringnet:190.30.40.0/24
    version软件版本stringversion:"2.6.1"
    vuln漏洞的CVE IDstringvuln:CVE-2014-0723

    HTTP过滤器

    名称描述类型
    http.component网站上所使用的网络技术名称string
    http.component_category网站上使用的网络组件的类别string
    http.htmlWeb bannerstring
    http.html_hash网站HTML的哈希值int
    http.status响应状态码int
    http.title网站title得bannerstring

    NTP 过滤器

    名称描述类型
    ntp.ip查找在其monlist中NTP服务器的IP 
    ntp.ip_count初始monlist返回的IP数量int
    ntp.more真/假; monlist集是否有更多的IP地址boolean
    ntp.portmonlist中的IP地址使用的端口int

    SSL过滤器

    名称描述类型
    has_ssl有无SSLboolean
    SSL搜索所有SSL的数据string
    ssl.alpn诸如HTTP/2的应用层协议string
    ssl.chain_count链中的证书数量int
    ssl.version可能的值:SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2string
    ssl.cert.alg证书算法string
    ssl.cert.expired是否是过期证书boolean
    ssl.cert.extension证书中的扩展名string
    ssl.cert.serial序列号为整数或十六进制字符串int/string
    ssl.cert.pubkey.bits公钥的位数int
    ssl.cert.pubkey.type公钥类型string
    ssl.cipher.versionSSL版本的首选密码string
    ssl.cipher.bits首选密码中的位数int
    ssl.cipher.name首选密码的名称string

    Telnet 过滤器

    名称描述类型
    telnet.option搜索所有选项string
    telnet.do对方执行的请求或期望对方执行指示的选项string
    telnet.dont对方停止执行的请求或不再期望对方执行指定的选项string
    telnet.will确认现在正在执行指定的选项string
    telnet.wont表示拒绝执行或继续执行指定的选项string

    附录C:Facets搜索

    常用Facets

    名称描述
    asn自治系统号码
    city城市的全名
    country国家的全名
    domain设备的域名
    has_screenshot有无可用的截图
    ispISP管理网络块
    link网络连接的类型
    org拥有该网块的组织
    os操作系统
    port服务的端口号
    postal邮政编码
    product软件/产品的名称
    region地区/国家的名称
    state区域的别名
    uptime主机启动的时间(以秒为单位计算)
    vuln漏洞的CVE ID

    HTTP Facets

    名称描述类型
    http.component网站上使用的网络技术的名称string
    http.component_category网站上使用的网络组件的类别string
    http.html_hashHTML网站的哈希值int
    http.status响应状态码int

    NTP Facets

    名称描述
    ntp.ipmonlist返回的IP地址
    ntp.ip_count初始monlist返回的IP数量
    ntp.more真假; monlist收集的是否有更多的IP地址
    ntp.portmonlist中的IP地址使用的端口

    SSH Facets

    名称描述
    ssh.cipher密码的名称
    ssh.fingerprint设备的指纹
    ssh.mac使用的MAC算法名称(例如:hmac-sha1)
    ssh.type认证密钥的类型(例如:ssh-rsa)

    SSL Facets

    名称描述
    ssl.version支持SSL版本
    ssl.alpn应用层协议
    ssl.chain_count链中的证书数量
    ssl.cert.alg证书算法
    ssl.cert.expired真假; 证书过期与否
    ssl.cert.serial证书序列号为整数
    ssl.cert.extension证书扩展名
    ssl.cert.pubkey.bits公钥的位数
    ssl.cert.pubkey公钥类型的名称
    ssl.cipher.bits首选密码中的位数
    ssl.cipher.name首选密码的名称
    ssl.cipher.versionSSL版本的首选密码

    Telnet Facets

    名称描述类型
    telnet.option显示所有选项string
    telnet.do对方执行的请求或期望对方执行指示的选项string
    telnet.dont对方停止执行的请求或不再期望对方执行指定的选项string
    telnet.will服务器支持指定的选项string
    telnet.wont服务器不支持指定的选项string

    附录D:端口列表

    PortService
    7Echo
    11Systat
    13Daytime
    15Netstat
    17Quote of the day
    19Character generator
    21FTP
    22SSH
    23Telnet
    25SMTP
    26SSH
    37rdate
    49TACACS+
    53DNS
    67DHCP
    69TFTP, BitTorrent
    70Gopher
    79Finger
    80HTTP, malware
    81HTTP, malware
    82HTTP, malware
    83HTTP
    84HTTP
    88Kerberos
    102Siemens S7
    104DICOM
    110POP3
    111Portmapper
    113identd
    119NNTP
    123NTP
    129Password generator protocol
    137NetBIOS
    143IMAP
    161SNMP
    175IBM Network Job Entry
    179BGP
    195TA14-353a
    311OS X Server Manager
    389LDAP
    389CLDAP
    443HTTPS
    443QUIC
    444TA14-353a, Dell SonicWALL
    445SMB
    465SMTPS
    500IKE (VPN)
    502Modbus
    503Modbus
    515Line Printer Daemon
    520RIP
    523IBM DB2
    554RTSP
    587SMTP mail submission
    623IPMI
    626OS X serialnumbered
    636LDAPS
    666Telnet
    771Realport
    789Redlion Crimson3
    873rsync
    902VMWare authentication
    992Telnet (secure)
    993IMAP with SSL
    995POP3 with SSL
    1010malware
    1023Telnet
    1025Kamstrup
    1099Java RMI
    1177malware
    1200Codesys
    1234udpxy
    1400Sonos
    1434MS-SQL monitor
    1515malware
    1521Oracle TNS
    1604Citrix, malware
    1723PPTP
    1741CiscoWorks
    1833MQTT
    1900UPnP
    1911Niagara Fox
    1962PCworx
    1991malware
    2000iKettle, MikroTik bandwidth test
    2081Smarter Coffee
    2082cPanel
    2083cPanel
    2086WHM
    2087WHM
    2123GTPv1
    2152GTPv1
    2181Apache Zookeeper
    2222SSH, PLC5, EtherNet/IP
    2323Telnet
    2332Sierra wireless (Telnet)
    2375Docker
    2376Docker
    2379etcd
    2404IEC-104
    2455CoDeSys
    2480OrientDB
    2628Dictionary
    3000ntop
    3260iSCSI
    3306MySQL
    3310ClamAV
    3386GTPv1
    3388RDP
    3389RDP
    3460malware
    3541PBX GUI
    3542PBX GUI
    3689DACP
    3702Onvif
    3780Metasploit
    3787Ventrilo
    4000malware
    4022udpxy
    4040Deprecated Chef web interface
    4063ZeroC Glacier2
    4064ZeroC Glacier2 with SSL
    4070HID VertX/ Edge door controller
    4157DarkTrack RAT
    4369EPMD
    4443Symantec Data Center Security
    4444malware
    4500IKE NAT-T (VPN)
    4567Modem web interface
    4664Qasar
    4730Gearman
    4782Qasar
    4800Moxa Nport
    4840OPC UA
    4911Niagara Fox with SSL
    4949Munin
    5006MELSEC-Q
    5007MELSEC-Q
    5008NetMobility
    5009Apple Airport Administration
    5060SIP
    5094HART-IP
    5222XMPP
    5269XMPP Server-to-Server
    5353mDNS
    5357Microsoft-HTTPAPI/2.0
    5432PostgreSQL
    5577Flux LED
    5601Kibana
    5632PCAnywhere
    5672RabbitMQ
    5900VNC
    5901VNC
    5938TeamViewer
    5984CouchDB
    6000X11
    6001X11
    6379Redis
    6666Voldemort database, malware
    6667IRC
    6881BitTorrent DHT
    6969TFTP, BitTorrent
    7218Sierra wireless (Telnet)
    7474Neo4j database
    7548CWMP (HTTPS)
    7777Oracle
    7779Dell Service Tag API
    8008Chromecast
    8009Vizio HTTPS
    8010Intelbras DVR
    8060Roku web interface
    8069OpenERP
    8087Riak
    8090Insteon HUB
    8099Yahoo SmartTV
    8112Deluge (HTTP)
    8126StatsD
    8139Puppet agent
    8140Puppet master
    8181GlassFish Server (HTTPS)
    8333Bitcoin
    8334Bitcoin node dashboard (HTTP)
    8443HTTPS
    8554RTSP
    8800HTTP
    8880Websphere SOAP
    8888HTTP, Andromouse
    8889SmartThings Remote Access
    9000Vizio HTTPS
    9001Tor OR
    9002Tor OR
    9009Julia
    9042Cassandra CQL
    9051Tor Control
    9100Printer Job Language
    9151Tor Control
    9160Apache Cassandra
    9191Sierra wireless (HTTP)
    9418Git
    9443Sierra wireless (HTTPS)
    9595LANDesk Management Agent
    9600OMRON
    9633DarkTrack RAT
    9869OpenNebula
    10001Automated Tank Gauge
    10001Ubiquiti
    10243Microsoft-HTTPAPI/2.0
    10554RTSP
    11211Memcache
    12345malware
    17000Bose SoundTouch
    17185VxWorks WDBRPC
    12345Sierra wireless (Telnet)
    11300Beanstalk
    13579Media player classic web interface
    14147Filezilla FTP
    16010Apache Hbase
    16992Intel AMT
    16993Intel AMT
    18245General Electric SRTP
    20000DNP3
    20547ProconOS
    21025Starbound
    21379Matrikon OPC
    23023Telnet
    23424Serviio
    25105Insteon Hub
    25565Minecraft
    27015Steam A2S server query, Steam RCon
    27016Steam A2S server query
    27017MongoDB
    28015Steam A2S server query
    28017MongoDB (HTTP)
    30313Gardasoft Lighting
    30718Lantronix Setup
    32400Plex
    37777Dahuva DVR
    44818EtherNet/IP
    47808Bacnet
    49152Supermicro (HTTP)
    49153WeMo Link
    50070HDFS Namenode
    51106Deluge (HTTP)
    53413Netis backdoor
    54138Toshiba PoS
    55443McAfee
    55553Metasploit
    55554Metasploit
    62078Apple iDevice
    64738Mumble
    {
        "hostnames": [],
        "title": "",
        "ip": 2928565374,
        "isp": "iWeb Technologies",
        "transport": "tcp",
        "data": "HTTP/1.1 200 OK\r\nExpires: Sat, 26 Mar 2016 11:56:36 GMT\r\nExpire\
    s: Fri, 28 May 1999 00:00:00 GMT\r\nCache-Control: max-age=2592000\r\nCache-Cont\
    rol: no-store, no-cache, must-revalidate\r\nCache-Control: post-check=0, pre-che\
    ck=0\r\nLast-Modified: Thu, 25 Feb 2016 11:56:36 GMT\r\nPragma: no-cache\r\nP3P:\
     CP=\"NON COR CURa ADMa OUR NOR UNI COM NAV STA\"\r\nContent-type: text/html\r\n\
    Transfer-Encoding: chunked\r\nDate: Thu, 25 Feb 2016 11:56:36 GMT\r\nServer: sw-\
    cp-server\r\n\r\n",
     "asn": "AS32613",
        "port": 8443,
        "ssl": {
            "chain": ["-----BEGIN CERTIFICATE-----\nMIIDszCCApsCBFBTb4swDQYJKoZIhvcN\
    AQEFBQAwgZ0xCzAJBgNVBAYTAlVTMREw\nDwYDVQQIEwhWaXJnaW5pYTEQMA4GA1UEBxMHSGVybmRvbj\
    ESMBAGA1UEChMJUGFy\nYWxsZWxzMRgwFgYDVQQLEw9QYXJhbGxlbHMgUGFuZWwxGDAWBgNVBAMTD1Bh\
    cmFs\nbGVscyBQYW5lbDEhMB8GCSqGSIb3DQEJARYSaW5mb0BwYXJhbGxlbHMuY29tMB4X\nDTEyMDkx\
    NDE3NTUyM1oXDTEzMDkxNDE3NTUyM1owgZ0xCzAJBgNVBAYTAlVTMREw\nDwYDVQQIEwhWaXJnaW5pYT\
    EQMA4GA1UEBxMHSGVybmRvbjESMBAGA1UEChMJUGFy\nYWxsZWxzMRgwFgYDVQQLEw9QYXJhbGxlbHMg\
    UGFuZWwxGDAWBgNVBAMTD1BhcmFs\nbGVscyBQYW5lbDEhMB8GCSqGSIb3DQEJARYSaW5mb0BwYXJhbG\
    xlbHMuY29tMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxc9Vy/qajKtFFnHxGOFPHTxm\
    \nSOnsffWBTBfyXnK3h8u041VxvZDh3XkpA+ptg2fWOuIT0TTYuqw+tqiDmg8YTsHy\njcpMFBtXV2cV\
    dhKXaS3YYlM7dP3gMmkGmH+ZvCgCYc7L9MIJxYJy6Zeuh67YxEMV\ngiU8mZpvc70Cg5WeW1uBCXtUAi\
    jDLsVWnhsV3YuxlweEvkRpAk3EHehKbvgMnEZS\nQ30QySe0GAqC7bWzKrwsJAOUk/+Js18+3QKb/LmD\
    a9cRjtFCTo6hYfPbfHj8RxQh\n4Xmnn/CtZ48wRQTqKXSO6+Zk3OuU7/jX1Gt/jxN6n77673e6uCsggT\
    wut/EtNwID\nAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBb/yTy76Ykwr7DBOPAXc766n73OsZizjAt\n1k\
    mx7LxgN3X/wFxD53ir+sdOqbPgJl3edrE/ZG9dNl6LhUBbUK+9s6z9QicEfSxo\n4uQpFSywbGGmXInE\
    ZmyT4SsOLi/hNgy68f49LO1h6rn/p7QgIKd31g7189ZfFkFb\nRdD49s1l/Cc5Nm4XapUVvmnS91MlPk\
    /OOIg1Lu1rYkuc8sIoZdPbep52H3Ga7TjG\nkmO7nUIii0goB7TQ63mU67+NWHAmQQ8CtCDCN49kJyen\
    1WFjD6Je2U4q0IFQrxHw\nMy+tquo/n/sa+NV8QOj1gMVcFsLhYm7Z5ZONg0QFXSAL+Eyj/AwZ\n----\
    -END CERTIFICATE-----\n"],
            "cipher": {
                "version": "TLSv1/SSLv3",
                "bits": 256,
                "name": "DHE-RSA-AES256-GCM-SHA384"
            },
            "alpn": [],
            "dhparams": {
                "prime": "b10b8f96a080e01dde92de5eae5d54ec52c99fbcfb06a3c69a6a9dca52\
    d23b616073e28675a23d189838ef1e2ee652c013ecb4aea906112324975c3cd49b83bfaccbdd7d90\
    c4bd7098488e9c219a73724effd6fae5644738faa31a4ff55bccc0a151af5f0dc8b4bd45bf35c1a65e68cfda76d4da708df1fb2bc2e4a4371",
                "public_key": "2e30a6e455730b2f24bdaf5986b9f0876068d4aa7a4e15c9a1b9c\
    a05a420e8fd3b496f7781a9423d3475f0bedee83f0391aaa95a738c8f0e250a8869a86d41bdb0194\
    66dba5c641e4b2b4b82db4cc2d4ea8d9804ec00514f30a4b6ce170b81c3e1ce4b3d17647c8e5b8f6\
    65bb7f588100bcc9a447d34d728c3709fd8a5b7753b",
                "bits": 1024,
                "generator": "a4d1cbd5c3fd34126765a442efb99905f8104dd258ac507fd6406c\
    ff14266d31266fea1e5c41564b777e690f5504f213160217b4b01b886a5e91547f9e2749f4d7fbd7\
    d3b9a92ee1909d0d2263f80a76a6a24c087a091f531dbf0a0169b6a28ad662a4d18e73afa32d779d\
    5918d08bc8858f4dcef97c2a24855e6eeb22b3b2e5",
                "fingerprint": "RFC5114/1024-bit MODP Group with 160-bit Prime Order\
     Subgroup"
            },
            "versions": ["TLSv1", "-SSLv2", "SSLv3", "TLSv1.1", "TLSv1.2"]
        },
        "html": "\n\t\t<html><head>\n\t\t<meta charset=\"utf-8\">\n\t\t<meta http-eq\
    uiv=\"X-UA-Compatible\" 
    content=\"IE=edge,chrome=1\">\n\t\t<title></title>\n\t\t\
    <script language=\"javascript\" type=\"text/javascript\" src=\"/javascript/commo\
    n.js?plesk_version=psa-11.0.9-110120608.16\"/></script>\n\t\t<script language=\"\
    javascript\" type=\"text/javascript\" src=\"/javascript/prototype.js?plesk_versi\
    on=psa-11.0.9-110120608.16\"></script>\n\t\t<script>\n\t\t\tvar opt_no_frames = \
    false;\n\t\t\tvar opt_integrated_mode = false;\n\t\t</script>\n\t\t\n\t\t</head>\
    <body onLoad=\";top.location='/login.php3?window_id=&amp;requested_url=https%3A%\
    2F%2F174.142.92.126%3A8443%2F';\"></body><noscript>You will be redirected to the\
     new address in 15 seconds... If you are not automatically taken to the new loca\
    tion, please enable javascript or click the hyperlink <a href=\"/login.php3?wind\
    ow_id=&amp;requested_url=https%3A%2F%2F174.142.92.126%3A8443%2F\" target=\"top\"\
    >/login.php3?window_id=&amp;requested_url=https%3A%2F%2F174.142.92.126%3A8443%2F\
    </a>.</noscript></html><!--_____________________________________________________\
    ________________________________________________________________________________\
    ________________________________________________________________________________\
    _________________________IE error page size limitation__________________________\
    ________________________________________________________________________________\
    ________________________________________________________________________________\
    ____________________________________________________-->",
        "location": {
            "city": null,
            "region_code": "QC",
            "area_code": null,
            "longitude": -73.5833,
            "country_code3": "CAN",
            "latitude": 45.5,
            "postal_code": "H3G",
            "dma_code": null,
            "country_code": "CA",
            "country_name": "Canada"
        },
        "timestamp": "2016-02-25T11:56:52.548187",
        "domains": [],
        "org": "iWeb Technologies",
         "os": null,
        "_shodan": {
            "options": {},
            "module": "https",
            "crawler": "122dd688b363c3b45b0e7582622da1e725444808"
        },
        "opts": {
            "heartbleed": "2016/02/25 03:56:45 ([]uint8) {\n 00000000  02 00 74 63 6\
    5 6e 73 75  73 2e 73 68 6f 64 61 6e  |..tcensus.shodan|\n 00000010  2e 69 6f 53 \
    45 43 55 52  49 54 59 20 53 55 52 56  |.ioSECURITY SURV|\n 00000020  45 59 fe 7a\
     a2 0d fa ed  93 42 ed 18 b0 15 7d 6e  |EY.z.....B....}n|\n 00000030  29 08 f6 f\
    8 ce 00 b1 94  b5 4b 47 ac dd 18 aa b9  |)........KG.....|\n 00000040  db 1c 01 \
    45 95 10 e0 a2  43 fe 8e ac 88 2f e8 75  |...E....C..../.u|\n 00000050  8b 19 5f\
     8c e0 8a 80 61  56 3c 68 0f e1 1f 73 9e  |.._....aV<h...s.|\n 00000060  61 4f d\
    a db 90 ce 84 e3  79 5f 9d 6c a0 90 ff fa  |aO......y_.l....|\n 00000070  d8 16 \
    e8 76 07 b2 e5 5e  8e 3e a4 45 61 2f 6a 2d  |...v...^.>.Ea/j-|\n 00000080  5d 11\
    74 94 03 3c 5d                              |].t..<]|\n}\n\n2016/02/25 03:56:45\
     174.142.92.126:8443 - VULNERABLE\n",
            "vulns": ["CVE-2014-0160"]
        },
        "ip_str": "174.142.92.126"
    }

    常用命令

    shodan search --limit 10 --fields ip_str,port country:kr device:router
    city:shanghai
    port:8080
    os:windows xp
    device:webcan,router,switch
    has_vuln:true
    
    shodan host ip
    
    Windows RDP CVE-2019-0708(bluekeep):
    shodan search '"x03ixO0lx00lx0blx06lxdO\xOOlx00\x124\x00"'
    shodan download name.file --limit number content 
    shodan parse --fields ip_str file.location > 0708.txt
    msf:
    set rhosts file:file.location
    file formats: 
    ip1
    ip2
    
    shodan search --limit 30 --fields ip_str "authentication disabled" port:5900 #搜索vnc空密码的服务器
    shodan download --limit 30 xxx 
    shodan count xxx
    shodan parse --fileds ip_str "file.location" > vnc.txt #解析下载的文件并把指定字段写入vnc.txt
    shodan honeypot 8.8.8.8 #查看服务器是否是蜜罐
    shodan host 8.8.8.8 --history #查看服务器的历史信息:以前的漏洞,部署过的服务等
    shodan myip #查看联公网的出口ip
    shodan --limit 10 --fields ip_str,port http.title:hacked by
    shodan --limit 10 --fields ip_str,port "cisco -authorized port:23"
    shodan --limit 10 --fields ip_str,port net:208.88.84.0/24 #搜索网段
    has_screenhot:true encrypted attention #搜索有快照的服务器,并且根据快照OCR文字进行过滤,比如回收站
    has_screenhot:true screenshot.label:ics #搜索工控设备
    shodan stats --facets ssl.version country:cn has_ssl:true #统计分析

    VS Google搜索

    https://www.exploit-db.com/google-hacking-database

    有很多google高级语法可以借鉴