社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

渗透Xiao白帽 • 4 年前 • 1315 次点击  

0x00 前言

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

这里说一下ico图标搜索,因为我平时会经常用所以···

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

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

通过搜索网站ico也会有意想不到的收获

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

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

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

渗透的本质就是信息收集

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

多了不说你细品接下来介绍一下命令行版本的ZoomEye搜索引擎


0x01 安装步骤

可直接从 pypi进行安装:

pip3 install zoomeye

也可以通过github 进行安装:

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

0x02 使用cli

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

$ zoomeye-h

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 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 infoRole: developerQuota: 10000

3.搜索

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

$ zoomeye search "telnet" -num 1ip:port       service  country app                 banner                        222.*.*.*:23  telnet   Japan   Pocket CMD telnetd \xff\xfb\x01\xff\xfb\x03\xff\x...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 search "telnet" -num 1 -filter serviceip                            service179.1.1.26                    http
total: 1

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

$ 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时,只会显示图形。饼图如下:

 

柱状图如下:

注意:仅能在 -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                               \xff\xfb\x01\xff\xfb\x0...   123       ntp            ntpd                  \x16\x82\x00\x01\x05\x0...   2002      telnet         Pocket CMD telnetd     \xff\xfb\x01\xff\xfb\x0...    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 = 'username@zoomeye.org'>>> 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反序列化漏洞复现

走过路过的大佬们留个关注再走呗

往期文章有彩蛋哦

一如既往的学习,一如既往的整理,一如即往的分享。

如侵权请私聊公众号删文

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/117164
 
1315 次点击