随着互联网、物联网、传感网、社交网络等信息系统所构成的泛在网络不断 发展,网络终端设备数量呈指数级上升。这为企业进行终端设备资产清点和统一 管控带来了巨大挑战,同时也引发了一系列安全问题,网络攻击与防御的博弈从 单边代码漏洞发展到了大数据对抗阶段,网络空间搜索引擎应运而生。
搜索引擎是指从互联网搜集信息,经过一定整理以后,提供给用户进行查询 的系统。传统搜索引擎对我们来说并不陌生,像Google 、百度等,每天我们几乎 都会用它们来搜索消息。与传统搜索引擎相比,网络空间搜索引擎有很大不同, 其搜索目标为全球的IP地址,实时扫描互联网和解析各种设备,对网络中的设备 进行探测识别和指纹分析,并将其扫描的目标信息进行分布式存储,供需求者检 索使用。传统的网络空间搜索模型框架一般由五部分组成:扫描和指纹识别、分 布存储、索引、UI界面以及调度程序,如图4-6所示。
图4-6 网络空间搜索模型框架
网络空间搜索引擎的用途有很多。对于安全研究者来说,能够帮助安全研究 人员针对APT组织、攻击方式等情况进行分析;对于公司安全管理人员,能够帮 助他们进行网络资产匹配、安全评估等;对于安全白帽子,能够帮助渗透测试人 员在与目标非交互的情况下搜集信息,例如,搜索资产、系统类型,开放端口
等。
4.3.1 常见搜索引擎平台
目前的网络空间搜索引擎平台比较多,各具特色,均可通过用户指定的关键 词来搜索网络中的设备或者设备信息。常见的网络空间搜索引擎有Shodan、
Censys 、ZoomEye 、Fofa 、Punk SPIDER 、IVRE(Drunk)和傻蛋等,接下来将详 细介绍ZoomEye和Shodan两款搜索引擎。
ZoomEye ,又称为“钟馗之眼” ,是国内安全厂商知道创宇倾力打造的知名空 间搜索引擎,它可以识别网络中的站点组件指纹和主机设备指纹。相较于
Shodan ,它更侧重于Web资产发现,而Shodan偏向于主机层面。该搜索引擎可以 搜索出三十多万条吻合度较高的数据,与此同时,ZoomEye具备全球4100万个网 站的网站组件指纹库,极大地提高了搜集效率和准确度。ZoomEye的搜索界面简 约,易上手,高级搜索功能非常实用,用户体验不错,“海盗榜计划”可以区分出 不用权限的用户,提高用户的互动性。 目前的ZoomEye针对普通用户是免费,但 是某些模块和数据需要收费,如图4-7所示为ZoomEye搜索引擎界面。
Shodan是全球开放最早的网络空间搜索引擎,也是目前全球最为知名的搜索 引擎。Shodan每月中会在全球5亿左右的设备上进行信息搜集,主要针对服务
器、网络设备、摄像设备、工控设备等基础设备进行扫描。Shodan为用户提供了 11种代码库,便于使用API接口,其中部分浏览器中集成了带有Shodan搜索功能 的插件。使用Shodan需要注册账号,同时可以缴费注册成会员,企业版和高级企 业版是收费的。Shodan还提供了Scanhub 、Images 、3D效果展示、CLI 、蜜罐判断 等实用性较强的功能,如图4-8所示为Shodan搜索引擎界面。
图4-7 ZoomEye搜索引擎
图4-8 Shodan搜索引擎
4.3.2 搜索引擎语法
下面就以ZoomEye和Shodan两大网络空间搜索引擎为例,对搜索引擎的使用 进行简单介绍。
ZoomEye支持公网设备指纹检索和Web指纹检索。Web指纹识别包括应用
名、版本、前端框架、后端框架、服务端语言、服务器操作系统、网站容器、内 容管理系统和数据库等。设备指纹识别包括应用名、版本、开放端口、操作系
统、服务名、地理位置等,直接输入关键词即可开始检索。下面列举了ZoomEye 的常见搜索语法,表4-8所示为设备指纹检索语法,表4-9所示为Web指纹检索语 法。
表4-8 设备指纹检索语法
表4-9 Web指纹检索语法
为了能够更好地解释ZoomEye设备指纹搜索语法,下面列举了搜索设备指纹 的使用示例,比如想查询在美国纽约市的Linux系统,且系统中运行组件为Apache 的服务器,我们可以构造如下的搜索语法:
app:"Apache httpd" +os:"linux" +country:US +city:"New York City" |
搜索结果如图4-9所示。 |
图4-9 ZoomEye搜索结果 接下来列举了Web指纹检索的使用示例,比如想查询美国纽约地区使用Linux 系统的网站,可以构造如下的搜索语法: |
site:google .com +os:linux +country:US +city:"New York City" |
图4-10 Web指纹检索示例
Shodan主要获取互联网中设备中的服务、位置、端口、版本等信息, 目前比 较受欢迎的内容有webcam 、linksys 、cisco 、netgear 、SCADA等。通过不同的搜 索语法可以做到批量搜索漏洞主机、统计中病毒主机、进行弱口令爆破、获取
shell等功能。表4-10中整理了常用的搜索语法。
表4-10 Shodan常用语法
表4-10中整理的Shodan语法只是其中一部分,这些语法可以结合在一起使用
4.3.3 搜索引擎API的使用
1.ZoomEye
ZoomEye除了以上介绍的智能检索功能以外,还提供了强大的Restful API功 能,用户通过它能够更好地与平台连接,调用平台提供的各类资源。接下来将带 领大家通过Python程序调用ZoomEye的API接口实现自动化信息搜集。ZoomEye平 台主要使用的是Json Web Token的登录验证方式,用户进行登录,并获取
access_token就可以直接调用API功能。方法如下:
方法1 通过curl命令直接获取access_token 。在Linux系统终端执行如下命 令,其中username为注册的邮箱或手机号,password为登录密码:
curl -X POST https://api.zoomeye .org/user/login -d '{ "username" :"20***** 989@qq .com", "password" :"123*******wxz"} ' |
运行结果如下所示: |
{"access_token" : "eyJhbGciOiJIUzI1Ni IsInR5cCI6IkpXVCJ9 .eyJpZGVudGl0eSI6IjIw NzI2MjI5ODlAcXEuY29t*********************TM1OTE2NzgsImV4cCI6MTU5MzYzNDg 3OH0 .3Ync_i7QBTVgtAOMkkZSGWz5Y__zps_1s3fVM-eMm6Y"} |
方法2 通过Python脚本获取access_token 。通过构造post请求的方式,将用户 名和密码以json的格式发送到ZoomEye的后端,打印出响应数据包,代码如下所 示:
|
#!/usr/bin/python #coding:utf-8 import requests import json def main() : username = input("username:") password = input("password :") url = "https://api.zoomeye .org/user/login" data = json .dumps({ 'username ' : username, 'password ' : password}) access_key = requests .post(url=url,data=data,verify=False) print(access_key .text) if __name__ == "__main__" : main() |
执行效果如图4-11所示。
图4-11 打印响应数据包
接下来,可以利用获取到的access_token检索我们需要的信息,这里将通过案 例进行演示说明,关于ZoomEye API详细的字段说明,大家可参考官方指导手册 (ZoomEye - Cyberspace Search Engine)。
案例1 使用host方法,查询开放6379端口的服务器IP地址,并打印出检索到 的IP地址和端口号,详细代码如下所示:
U
#coding:utf-8
import requests
from bs4 import BeautifulSoup
import json
import re
def main() :
headers = {
"Authorization" : "eyJhbGciOiJIUzI1Ni IsInR5cCI6IkpXVCJ9 .eyJpZGVudGl0eSI6
IjIwNzI2MjI5ODlAcXEuY***********************************0MzYsImV4cCI6MT U5MzYzNTYzNn0 .4EkTH3vh3JSjBJ_wEfnaMhQWuPSaIzQypBAKpfUSuZ0"
}
url = "https://api.zoomeye .org/host/search?query=port :6379&page=1&facet= app,os"
info = requests .get(url=url,headers=headers)
r_decoded = json .loads(info .text)
for line in r_decoded[ 'matches '] :
print(line[ 'ip ']+ ' : '+str(line[ 'portinfo '][ 'port ']))
if __name__ == "__main__" :
try:
main()
except Keyboard Interrupt :
print("interrupted by user, killing all threads . . .")
输出结果如下:
2.Shodan
使用Python去调用Shodan的API接口可以实现自动化信息搜集,首先需要注册 用户,在My Account中可以看到API Key。
初始化API:
import shodan SHODAN_API_KEY= 'Hg4t6PpPMvz4mgQhS**********KkCZLXh ' shodan_api=shodan .Shodan(SHODAN_API_KEY) | ||
|
初始化API之后就可以使用Shodan的库函数,下面整理一些函数。可以参考 Shodan官方给出的API文档(Shodan Developer)。
·shodan_api.count(query ,facets=None):查询结果数量。
·shodan_api.host(ip ,history=False):获取一个IP的详细信息。
·shodan_api.ports() :获取Shodan可查询的端口号。
·shodan_api.protocols() :获取Shodan可查询的协议。
·shodan_api.services() :获取Shodan可查询的服务。
·shodan_api.scan(ips ,force=False):使用Shodan进行扫描,ips可以为字符 或字典类型。
案例2 使用host方法获取指定IP的相关信息,代码如下:
import shodan import json SHODAN_API_KEY= 'Hg4t6P###########4U9zKkCZLXh ' shodan_api=shodan .Shodan(SHODAN_API_KEY) ip=shodan_api.host('8.8.8.8 ') print(json .dumps(ip)) |
运行结果如下所示:
|
{"region_code" : null, "ip" : 134744072, "postal_code" : null, "country_code" : "US", …… "ip_str" : "8 .8 .8 .8", "os" : null, "ports" : [53]} |
案例3 搜索JAWS摄像头,将IP和端口打印出来,代码如下: |
import shodan import json SHODAN_API_KEY= 'Hg4t6PpP##########4U9zKkCZLXh ' shodan_api=shodan .Shodan(SHODAN_API_KEY) results=shodan_api.search( 'JAWS/1 .0 ') print("Results found :%s"%results[ 'total ']) for result in results[ 'matches '] : print(result[ 'ip_str ']+" :"+str(result[ 'port '])) |
运行结果如下:
以上内容主要介绍了网络空间搜索引擎的基本概念,对Zoomeye和Shodan两 款搜索引擎的特点和常用语法进行详细的说明,让读者在对国内外的搜索引擎有 一定了解的同时可以熟悉Zoomeye和Shodan的搜索语法。最后结合Python和搜索 引擎API进行自动化信息搜集,笔者通过简单的示例介绍了Zoomeye和Shodan的 API使用方法,希望读者多去实践,能够在工作中运用搜索引擎提高信息搜集的 效率和质量。