【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

  • A+
所属分类:安全文章

0x00 前言

    ZoomEye-python是一款基于 ZoomEye API 开发的 Python 库,提供了 ZoomEye 命令行模式,同时也可以作为 SDK集成到其他工具中。该库可以让技术人员更便捷地搜索筛选导出ZoomEye 的数据。

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

这里说一下ico图标搜索,因为我平时会经常用所以···【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

每个网站标签都有自己的ico图标

在对指定目标收集资产外围打点的时候这个会是一个很有用的点

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

通过搜索网站ico也会有意想不到的收获【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

重点是不需要高级账号也能查询

重点是不需要高级账号也能查询

重点是不需要高级账号也能查询

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

渗透的本质就是信息收集

在实战中你资产收集的多少决定你攻击面的大小

多了不说你细品【超详细 | 钟馗之眼】ZoomEye-python命令行的使用接下来介绍一下命令行版本的ZoomEye搜索引擎

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

0x01 安装步骤

可直接从 pypi进行安装:

pip3 install zoomeye

也可以通过github 进行安装:

pip3 install git+https://github.com/knownsec/ZoomEye-python.git

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

0x02 使用cli

在成功安装ZoomEye-python 后,可以直接使用 zoomeye 命令,如下:

$ zoomeye-h

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

usage: zoomeye [-h] [-v] {info,search,init,ip,history,clear} ...positionalarguments: {info,search,init,ip,history,clear}    info                Show ZoomEye account info    search              Search the ZoomEyedatabase    init                Initialize the token forZoomEye-python    ip                  Query IPinformation    history             Query device history    clear               Manually clear the cache anduser informationoptionalarguments:  -h, --help            show this help message andexit  -v, --version         show program's version number and exit

1.初始化token

在使用ZoomEye-python cli 前需要先初始化用户 token,该凭证用于验证用户身份以便从 ZoomEye 查询数据;我们提供了两种认证方式:

1.username/password2.APIKEY (推荐)

可以通过zoomeye init -h 查看帮助,通过 APIKEY 来进行演示:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

$ zoomeye init -apikey "01234567-acbd-00000-1111-22222222222"successfully initializedRole: developerQuota: 10000

可以通过登陆ZoomEye在个人信息中(https://www.zoomeye.org/profile)获取 APIKEY;APIKEY 不会过期,用户可根据需求在个人信息中进行重置。

除此之外,还提供了username/password 的初始化方式,通过这种方式认证后会返回 JWT-token,具有一定的时效性,失效后需要用户重新登陆。

2.查询配额

用户可以通过info 命令查询个人信息以及数据配额,如下:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

$ zoomeye infoRole: developerQuota: 10000

3.搜索

搜索是ZoomEye-python 最核心的功能,通过 search 命令进行使用。search 命令需要指定搜索关键词(dork),下面我们进行简单的搜索:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

$ zoomeye search "telnet" -num 1ip:port       service  country app                 banner                        222.*.*.*:23  telnet   Japan   Pocket CMD telnetd xffxfbx01xffxfbx03xffx...total:1/58277850

使用 search命令和使用浏览器在 ZoomEye 进行搜索一样简单,在默认情况下显示了较为重要的 5 个字段,可以使用这些数据了解目标信息:

1.ip:port  ip地址和端口2.service  该端口开放的服务3.country  该ip地址所属国家4.app      识别出的应用类型5.banner   该端口的特征响应报文

在以上,使用-num参数指定了显示的数量,除此之外,search还支持以下参数(zoomeye search-h),以便用户对数据进行处理,我们将在下文进行说明和演示:

-num     设置显示/搜索的数量,支持 all-count   查询该 dork 在 ZoomEye数据库的总量-facet   查询该 dork 全量数据的分布情况-stat    统计数据结果集的分布情况-filter 查询数据结果集中某个字段的详情,或根据内容进行筛选-save   可按照筛选条件将结果集进行导出-force         忽略本地缓存文件,直接从 ZoomEye获取数据-type    指定搜索源,host 或 web

4.数据数量

通过-num参数可以指定我们搜索和显示的数量,指定的数目即消耗的配额数量。而通过 -count 参数可以查询该 dorkZoomEye 数据库的总量,如下:

$ zoomeye search "telnet" -count56903258

需要注意一点,-num 参数消耗的配额为 20 的整数倍,这是因为 ZoomEye API 单次查询的最小数量为 20条。

5.数据聚合

我们可以通过-facet -stat 进行数据的聚合统计,使用 -facet 可以查询该 dork 全量数据的聚合情况(由 ZoomEye 聚合统计后通过 API获取),而 -stat 可以对查询到的结果集进行聚合统计。两个命令支持的聚合字段包括:

# hostsearch app      按应用类型进行统计device   按设备类型进行统计service  按照服务类型进行统计os       按照操作系统类型进行统计port     按照端口进行统计country  按照国家进行统计city     按照城市进行统计# websearchwebapp      按照 Web应用进行统计component   按照 Web容器进行统计framework   按照 Web 框架进行统计server      按照 Web 服务器进行统计waf         按照 Web防火墙(WAF)进行统计os          按照操作系统进行统计country     按照国家进行统计

使用 -facet统计全量 telnet 设备的应用类型:

$ zoomeyesearch "telnet" -facet appapp                               count[unknown]                         28317914BusyBox telnetd                   10176313Linux telnetd                     3054856Cisco IOS telnetd                 1505802Huawei Home Gateway telnetd       1229112MikroTik router config httpd      1066947Huawei telnetd                    965378Busybox telnetd                   962470Netgear broadband router...       593346NASLite-SMB/Sveasoft Alc...        491957

使用 -stat统计查询出来的 20 条 telnet 设备的应用类型:

$ zoomeyesearch "telnet" -stat appapp                               count               Cisco IOS telnetd                 7[unknown]                         5BusyBox telnetd                   4Linux telnetd                      3Pocket CMD telnetd                 1

6.数据筛选

使用 -filter参数可以查询数据结果集中某个字段的详情,或根据内容进行筛选,该命令支持的字段包括:

#host/searchapp          显示应用类型详情version      显示版本信息详情device       显示设备类型详情port         显示端口信息详情city         显示城市详情country      显示国家详情asn          显示as number详情banner      显示特征响应报文详情timestamp    显示数据更新时间*            在包含该符号时,显示所有字段详情#web/searchapp         显示应用类型详情headers     HTTP 头keywords    meta 属性关键词title       HTTP Title标题信息site        site 搜索city        显示城市详情country     显示国家详情webapp      Web 应用component   Web 容器framework   Web 框架server      Web 服务waf         Web 防火墙(WAF)os          操作系统timestamp   显示数据更新时间*           在包含该符号时,显示所有字段详情

相比较默认情况下的省略显示,所以通过-filter 可以查看完整的数据,如下:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

λ zoomeye search "telnet" -num 1 -filter serviceip                            service179.1.1.26                    http
total: 1

使用 -filter进行筛选时,语法为:key1,key2,key3=value,其中 key3=value 为筛选条件,而展示的内容为 key1,key2 例:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

$ zoomeye search telnet -num 1 -filter port,app,banner=Telnetip                        port                          app                          240e:*:*:*::3             23                            LANDesk remotemanagement    total: 1

在上面的示例中:banner=Telnet为筛选的条件,而 port,app 为展示的内容。如果需要展示 banner,筛选语句则是这样

$ zoomeye search telnet -num 1 -filter port,app,banner,banner=Telnet

7.数据导出

-save参数可以对数据进行导出,该参数的语法和 -filter 一样,并将结果按行 json 的格式保存到文件中,如下:

$ zoomeye search "telnet" -save banner=telnetsave file to telnet_1_1610446755.json successful!$ cattelnet_1_1610446755.json{'ip': '218.223.21.91', 'banner': '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x03TELNETsession now in ESTABLISHED state\r\n\r\n'}

如果使用 -save 但不带任何参数,则会将查询结果按照 ZoomEye API 的 json格式保存成文件,这种方式一般用于在保留元数据的情况下进行整合数据;该文件可以作为输入通过 cli 再次解析处理,如 zoomeye search"xxxxx.json"

8. 数据图像化

-figure参数为数据图像化参数,该参数提供了 pie(饼图) 和 hist(柱状图) 两种展示方式,在没有进行指定依旧显示数据,在指定 -figure时,只会显示图形。饼图如下:

 

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

柱状图如下:

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

注意:仅能在 -facet-stat 数据聚合的情况使用。

9. IP 历史数据查看

ZoomEye-python提供了 IP 历史设备数据查询功能,使用命令 history [ip] 便能查询 IP 设备历史数据,使用方式如下:

$ zoomeye history "207.xx.xx.13" -num 1207.xx.xx.13Hostnames:                   [unknown]Country:                      UnitedStatesCity:                         LakeCharlesOrganization:                fulair.comLastupdated:                 2021-02-18T03:44:06Number of open ports:        1Number of historical probes:  1timestamp                  port/service               app                        raw_data                   2021-02-18 03:44:06        80/http                    Apache httpd               HTTP/1.0 301 MovedPermanently...

在默认情况下展示的是这几个字段:

1.time                记录的时间2. service        开放的服务3. port                端口4. app         Web 应用5. banner   原始的指纹信息

使用 zoomeye history -h 可以查看 history 提供的参数。

$zoomeye history -husage:zoomeye history [-h] [-filter filed=regexp] [-force] ippositionalarguments:  ip                    search historical device IPoptionalarguments:  -h, --help            show this help message andexit  -filter filed=regexp  filter data and print raw data detail.field:                       [time,port,service,app,raw]  -force                ignore the local cache andforce the data to be                        obtained from theAPI

下面对-filter 进行演示:

$ zoomeye history "207.xx.xx.13" -filter"time=^2019-08,port,service"207.xx.xx.13Hostnames:                   [unknown]Country:                      UnitedStatesCity:                         LakeCharlesOrganization:                fulair.comLastupdated:                 2019-08-16T10:53:46Number of open ports:        3Number of historical probes:  3time                       port                       service                    2019-08-16 10:53:46        389                        ldap                       2019-08-08 23:32:30        22                         ssh                        2019-08-03 01:55:59        80                         http

-filter参数支持以下几个字段的筛选:

1.time      扫描时间2.port      端口信息3.service   开放的服务4.app       Web 应用5.raw       原始指纹信息6.*         在包含该符号时,显示所有字段详情

在展示时添加了一个id 字段的展示,id 为序号,为了方便查看,并不能作为筛选的字段。

注意:目前只开放了上述几个字段的筛选。使用 history 命令时同样会消耗用户配额,在 history命令中返回多少条数据,用户配额就相应扣除多少。例如:IP "8.8.8.8" 共有 944 条历史记录,查询一次扣除 944 的用户配额。

10.查询 IP 信息

可以通过zoomeye ip 命令查询指定 IP 的信息,例如:

$ zoomeye ip 185.*.*.57185.*.*.57Hostnames:                   [unknown]Isp:                         [unknown]Country:                      SaudiArabiaCity:                        [unknown]Organization:                [unknown]Lastupdated:                 2021-03-02T11:14:33Number of open ports:         4{2002,9002, 123, 25}port      service        app                    banner                        9002      telnet                               xffxfbx01xffxfbx0...   123       ntp            ntpd                  x16x82x00x01x05x0...   2002      telnet         Pocket CMD telnetd     xffxfbx01xffxfbx0...    25        smtp           Cisco IOS NetWor...    220 10.1.10.2 Cisco Net...

zoomeye ip命令同样支持筛选参数 -filter, 语法和 zoomeye search 的筛选语法一致。例如:

$ zoomeye ip "185.*.*.57" -filter "app,app=ntpd"Hostnames:                   [unknown]Isp:                         [unknown]Country:                      SaudiArabiaCity:                        [unknown]Organization:                [unknown]Lastupdated:                 2021-02-17T02:15:06Number of open ports:        0Number of historical probes:  1app                        ntpd

         

filter参数支持的字段有:

    port       端口信息    service     运行服务    app         应用    banner      指纹信息注意:此功能根据不同用户等级,对每个用户每天查询次数做了一定的限制。注册用户和开发者每天能够查询 10 次高级用户每天可查询 20 次VIP 用户每天可以查询 30 次每天的次数使用完之后,24小时后刷新,即从第一次查 IP 的时间开始计算,24小时后刷新次数。

11.清理功能

用户每天都会搜索大量的数据,这样就导致缓存文件夹所占的存储空间逐渐增大;如果用户在公共服务器上使用ZoomEye-python 可能会导致自己的 API KEYACCESS TOKEN 泄漏。为此 ZoomEye-python 提供了清理命令zoomeye clear,清理命令可以缓存数据和用户配置进行清空。使用方式如下:

$zoomeyeclear -husage: zoomeye clear [-h] [-setting] [-cache]optionalarguments:  -h, --help  show this help message and exit  -setting    clear user api key and accesstoken  -cache      clear local cache file

12.缓存机制

ZoomEye-python在 cli 模式下提供了缓存机制,位于 ~/.config/zoomeye/cache 下,尽可能的节约用户配额;用户查询过的数据集将在本地缓存 5天,当用户查询相同的数据集时,不会消耗配额。

0x03 演示视频

在 Windows、Mac、Linux、FreeBSD 演示视频

https://weibo.com/tv/show/1034:4597603044884556?from=old_pc_videoshow

0x04 使用SDK

1.初始化token

同样,在 SDK中也支持 username/password APIKEY 两种认证方式,如下:

1.user/pass

from zoomeye.sdk import ZoomEyezm =ZoomEye(username="username", password="password")

2.APIKEY

from zoomeye.sdk import ZoomEyezm =ZoomEye(api_key="01234567-acbd-00000-1111-22222222222")

2.SDK API

以下是 SDK提供的接口以及说明:

1.login()  使用 username/password 或者 APIKEY进行认证2.dork_search(dork, page=0, resource="host", facets=None)  根据 dork搜索指定页的数据3.multi_page_search(dork, page=1, resource="host",facets=None)  根据 dork搜索多页数据4.resources_info() 获取当前用户的信息5.show_count()  获取当前 dork下全部匹配结果的数量6.dork_filter(keys) 从搜索结果中提取指定字段的数据7.get_facet() 从搜索结果中获取全量数据的聚合结果8.history_ip(ip)  查询某个 ip的历史数据信息9.show_site_ip(data)  遍历 web-search结果集,并输出域名和ip地址10.show_ip_port(data)  遍历 host-search 结果集,并输出ip地址和端口

3.使用示例

$ python3>>> import zoomeye.sdk as zoomeye>>> dir(zoomeye)['ZoomEye', 'ZoomEyeDict', '__builtins__', '__cached__','__doc__','__file__', '__loader__', '__name__', '__package__','__spec__','fields_tables_host', 'fields_tables_web', 'getpass','requests','show_ip_port', 'show_site_ip', 'zoomeye_api_test']>>> # Use username and password to login>>> zm = zoomeye.ZoomEye()>>> zm.username = '[email protected]'>>> zm.password = 'password'>>>print(zm.login())....JIUzI1NiIsInR5cCI6IkpXVCJ9.....>>> data = zm.dork_search('apache country:cn')>>> zoomeye.show_site_ip(data)213.***.***.46.rev.vo***one.pt ['46.***.***.213']me*****on.o****e.net.pg ['203.***.***.114']soft********63221110.b***c.net['126.***.***.110']soft********26216022.b***c.net['126.***.***.22']soft********5084068.b***c.net ['126.***.***.68']soft********11180040.b***c.net ['126.***.***.40']...

4.数据搜索

如上示例,我们使用dork_search() 进行搜索,我们还可以设置 facets 参数,以便获得该 dork 全量数据的聚合统计结果,facets 支持的字段请参考 2.cli使用-4数据聚合。示例如下:

>>>data = zm.dork_search('telnet', facets='app')>>> zm.get_facet(){'product': [{'name': '', 'count': 28323128}, {'name': 'BusyBox telnetd','count': 10180912}, {'name': 'Linux telnetd', ......multi_page_search() 同样也可以进行搜索,当需要获取大量数据时使用该函数,其中 page字段表示获取多少页的数据;而 dork_search() 仅获取指定页的数据。

5.数据筛选

在 SDK 中提供了dork_filter() 函数,我们可以更加方便对数据进行筛选,提取指定的数据字段,如下:

>>>data = zm.dork_search("telnet")>>> zm.dork_filter("ip,port")[['180.*.*.166', 5357], ['180.*.*.6', 5357], ......由于通过 web-search 和 host-search 返回的字段不同,在进行过滤时需要填写正确的字段。web-search 包含的字段有:app / headers / keywords / title / ip / site / city / countryhost-search 包含的字段有:app / version / device / ip / port / hostname / city /country / asn / banner

【往期推荐】

【内网渗透】内网信息收集命令汇总

【内网渗透】域内信息收集命令汇总

【超详细 | Python】CS免杀-Shellcode Loader原理(python)

【超详细 | Python】CS免杀-分离+混淆免杀思路

【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现

【超详细 | 附PoC】CVE-2021-2109 | Weblogic Server远程代码执行漏洞复现

【漏洞分析 | 附EXP】CVE-2021-21985 VMware vCenter Server 远程代码执行漏洞

【CNVD-2021-30167 | 附PoC】用友NC BeanShell远程代码执行漏洞复现

【奇淫巧技】如何成为一个合格的“FOFA”工程师

记一次HW实战笔记 | 艰难的提权爬坑

【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】

【超详细】Fastjson1.2.24反序列化漏洞复现

走过路过的大佬们留个关注再走呗【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

往期文章有彩蛋哦【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

一如既往的学习,一如既往的整理,一如即往的分享。【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

如侵权请私聊公众号删文

本文始发于微信公众号(渗透Xiao白帽):【超详细 | 钟馗之眼】ZoomEye-python命令行的使用

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: