网络空间搜索引擎语法及API的应用


搜索引擎是指从互联网搜集信息,经过一定整理以后,提供给用户进行查询的系统。传统的搜索引擎对我们来说并不陌生,像Google、百度等。与传统搜索引擎相比,网络空间搜索引擎有很大不同,其搜索目标为全球的IP地址,实时扫描互联网和解析各种设备,对网络中的设备进行探测识别和指纹分析,并将其扫描的目标信息进行分布式存储,供需求者检索使用。

1. 传统网络空间搜索框架

一般由五部分组成:

§ 扫描和指纹识别 § 分布存储 § 索 引 § UI界面 § 调度程序

信息搜集:网络空间搜索引擎语法及API的应用_web安全

2. 常见搜索引擎平台

目前的网络空间搜索引擎平台比较多,各具特色,均可通过用户指定的关键词来搜索网络中的设备或者设备信息。常见的网络空间搜索引擎有Shodan、Censys、ZoomEye(钟馗之眼)、Fofa、PunkSPIDER、IVRE(Drunk)和傻蛋等。现介绍ZoomEye(钟馗之眼)。

ZoomEye(钟馗之眼)是国内安全厂商知道创宇倾力打造的知名空间搜索引擎,它可以识别网络中站点组件指纹和主机设备指纹,更侧重于Web资产发现。下图是ZoomEye搜索引擎界面:

信息搜集:网络空间搜索引擎语法及API的应用_网络安全_02

3. 搜索引擎语法

ZoomEye支撑公网设备指纹检索和Web指纹检索。Web指纹识别包括应用名、版本、前端框架、后端框架、服务端语言、服务器操作系统、网站容器、内容管理系统和数据库等。设备指纹识别包括应用名、版本、开放端口、操作系统、服务名、地理位置等。直接输入关键词即可开始搜索。

设备指纹检索语法

语 法

描 述

示 例

app:组件名

组件名称

app:“Apaache httpd”

ver:组件版本

组件的版本号

ver:“2.2.16”

port:端口号

目标系统开放端口

port:3389

os:操作系统

目标操作系统类型

os:linux

service:服务名

系统运行的服务类型

service:webcam

hostname:主机名

目标系统的主机名

hostname:google.com

country:国家或者地区代码

目标系统的地理位置

country:US

city:城市名称

目标系统所在城市

city:“beijing”

ip:指定的IP地址

目标系统对应的IP地址

ip:8.8.8.8

org:组织机构

所属的组织机构

org:“Vimpelcom”

asn:自治系统编号

自治系统编号

asn:42893

ssl: SSL证书

SSL证书

ssl:“corp.google.com”

Web指纹检索语法

语 法

描 述

示 例

app:组件名

组件名称

app:“Apache httpd”

ver:组件版本

组件的版本号

ver:“2.2.16”

site:网站域名

目标网站域名

site:google.com

os:操作系统

目标操作系统类型

os:linux

title:页面标题

网站的标题

title:Nginx

keywords:页面关键字

网站页面的关键字

keywords:Nginx

desc:页面说明

页面描述字段

desc:Nginx

headers:请求头部

HTTP请求中的Headers

headers:Server

country:国家或者地区代码

目标系统的地理位置

country:US

city:城市名称

目标系统所在城市

city"beijing"

ip:指定的IP地址

目标系统对应的IP地址

ip:8.8.8.8

org:组织机构

所属的组织机构

org:“Vimpelcom”

asn:自治系统号

自治系统编号

asn:42893

下面列举搜索设备指纹的使用示例,比如查询在美国纽约市的Linux系统,且系统中运行组件为Apache的服务器,语法构造如下:

app:"Apache httpd" + os:"linux" + country:US + city:"New York City"

搜索结果如下图:

信息搜集:网络空间搜索引擎语法及API的应用_网络安全_03

接下来搜索Web指纹检索的使用示例,比如查询美国纽约地区使用Linux系统的网站,语法构造如下:

site:google.com + os:linux + country:US + city:"New York City"

搜索结果如下图:

信息搜集:网络空间搜索引擎语法及API的应用_web安全_04

4. 搜索引擎API的应用

ZoomEye除了以上介绍的智能检索功能以外,还提供了强大的Result API功能,用户通过它能够更好地与平台连接,调用平台各类资源。现利用Python程序调用ZoomEye的API接口实现自动化信息搜集。ZoomEye—API被分为两种验证方式,API-KEY和登录验证(Login verification)。

运 行 环 境:

OS: macOS Monterey Version 12.3.1(英文版)

IDE:PyCharm 2020.1

Python: Version 3.9.9

1) 登录验证(Login verification)

平台主要使用的是Json Web Token的登录验证方式,用户进行登录,并获取access_token 就可以直接调用API功能,使用host方法查询开放6379端口的服务器IP地址,并输出检索到的IP地址和端口号,示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :4/18/22 7:03 PM
# 文件      :Zoomeye_host_token.py
# IDE      :PyCharm

import requests
import json

import zoomeye.sdk as zoomeye

# 定义一个函数获取access_token
def get_access_token(username, password):
    # 实例化一个zm对象
    zm = zoomeye.ZoomEye()
    # 账号赋值给对象的账号属性,账号密码赋值给账号密码属性
    zm.username = username
    zm.password = password
    return zm.login()

# 定义主函数
def main():
    # 输入zoomeye账号和密码
    username = input('请输入账号: ')
    password = input('请输入账号密码:')
    # headers里的Authorization值必须JWT前缀加空格
    headers = { "Authorization":"JWT " + get_access_token(username=username, password=password)}
    # 赋值给url
    url = 'https://api.zoomeye.org/host/search?query=port:6379&page=1&facets=app,os'
    # 请求信息赋值给info
    info = requests.get(url=url, headers=headers)
    # 转换为json数据
    r_decoded = json.loads(info.text)
    # 遍历匹配项列表,输出IP地址和端口号
    for line in r_decoded['matches']:
        print(line['ip'] + ': ' + str(line['portinfo']['port']))

#  启动主程序
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('interrupted by user, killing all threads....')

运行结果如下:

信息搜集:网络空间搜索引擎语法及API的应用_web安全_05

备注:headers头部Authorization必须包含JWT 前缀

2)API-KEY 验证

对于每个账户,在它的个人资料页的底部会找到一串API-KEY字符串,将这个字符串添加到ZoomEye-API字段。本人的个人资料的字符串如下图:

信息搜集:网络空间搜索引擎语法及API的应用_python_06

备注:API-KEY与账号绑定而且可以被重置

示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :4/18/22 4:11 PM
# 文件      :ZoomEye_host.py
# IDE      :PyCharm

# 导入相关模块
import requests
import json

# 定义主函数
def main():
    # 定义头部headers
    headers = { "API-KEY":"E4b729d3-5730-D778B-87f2-408604aedbd"}
    # 赋值url
    url = 'https://api.zoomeye.org/host/search?query=port:6379&page=1&facets=app,os'
     # 请求信息赋值给info
    info = requests.get(url=url, headers=headers)
    # 转换为json数据
    r_decoded = json.loads(info.text)
    # 遍历匹配项列表,输出IP地址和端口号
    for line in r_decoded['matches']:
        print(line['ip'] + ': ' + str(line['portinfo']['port']))

# 运行主程序
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print('interrupted by user, killing all threads....')

运行结果如下图:

信息搜集:网络空间搜索引擎语法及API的应用_web安全_07

希望此文对您有所帮助和启发,欢迎点赞收藏和转发加关注!谢谢!