0x01 前言
ZoomEye 作為一款網絡空間搜索引擎,通過瀏覽器可以快速搜索網絡設備。對于技術人員來說這并不是很友好,技術人員期待一款能夠便捷有效的查詢 ZoomEye 的信息、數據以及格式化結果等操作并且還能作為 SDK 集成到其他的工具中,于是便有了 ZoomEye-python 這樣一個工具。
ZoomEye-python 是一款基于 ZoomEye API 開發的 Python 庫,提供了 ZoomEye 命令行模式,同時也可以作為 SDK 集成到其他工具中。該庫可以讓技術人員更便捷地搜索、篩選、導出 ZoomEye 的數據。
0x02 ZoomEye API
ZoomEye 官方提供了搜索數據,用戶登陸,剩余資源以及設備歷史接口,目前 ZoomEye API 對外開放開發者(developer) 權限,有一定的額度限制。每個月的額度為 10000 條,對外開放的開發者套餐每個月會重置相應資源的請求額度。注冊用戶即可獲得 API 的開發者套餐使用權限。
0x03 安裝步驟
可直接從 pypi 進行安裝:
pip3 install zoomeye
也可以通過 github 進行安裝:
pip3 install git+https://github.com/knownsec/zoomeye-python.git
0x04 如何使用
ZoomEye-python 提供了 cli 和 SDK 兩種工作模式。
1.使用cli
在完成安裝后,可以使用 zoomeye -h 命令驗證是否安裝成功。
$ zoomeye -h
usage: zoomeye [-h] {info,search,init} ...
positional arguments:
{info,search,init}
info Show ZoomEye account info
search Search the ZoomEye database
init Initialize the token for ZoomEye-python
optional arguments:
-h, --help show this help message and exit
1.初始化
ZoomEye-python 的初始化非常簡單,使用下列方式中的一種就可以:
APIKEY (推薦)
$ zoomeye init -apikey "01234567-acbd-00000-1111-22222222222"
successfully initialized
Role: developer
Quota: 10000
or
username/password
$ zoomeye init -username "username@zoomeye.org" -password "password"
successfully initialized
Role: developer
Quota: 10000
這兩種方式本質上沒有區別,通過 username/password 的方式初始化 cli ,這種方式認證后會返回 JWT-token,具有一定的時效性 (大概 12 個小時),JWT-toekn失效后需要用戶重新登陸。而APIKEY 不會過期,用戶可根據需求在個人信息中進行重置。因此我們推薦 使用 APIKEY 的方式 進行初始化。
登陸
ZoomEye在個人信息中(https://www.zoomeye.org/profile) 獲取APIKEY。
2.賬戶資源
ZoomEye API 規定每個賬戶注冊即可獲得 10000 條數據的額度,在使用搜索之前記得查看賬戶所剩下的配額。
使用命令 zoomeye info 即可查詢賬戶的剩余配額。
$ zoomeye info
Role: developer
Quota: 10000
需要注意:info 命令只顯示了免費部分的配額,將在下個版本修復。
3.搜索
$ zoomeye search -h
usage: zoomeye search [-h] [-num value] [-facet [field]]
[-filter [field=regexp]] [-stat [field]]
[-save [field=regexp]] [-count]
dork
positional arguments:
dork The ZoomEye search keyword or ZoomEye exported file
optional arguments:
-h, --help show this help message and exit
-num value The number of search results that should be returned
-facet [field] Perform statistics on ZoomEye database, field:
[app,device,service,os,port,country,city]
-filter [field=regexp]
Output more clearer search results by set filter
field, field:
[app,version,device,port,city,country,asn,banner,*]
-stat [field] Perform statistics on search results, field:
[app,device,service,os,port,country,city]
-save [field=regexp] Save the search results with ZoomEye json format, if
you specify the field, it will be saved with JSON
Lines
-count The total number of results in ZoomEye database for a
search
search 命令提供了對數據進行 篩選、搜索、導出、聚合統計 的能力,下面以 飛致云堡壘機 為例展示 ZoomEye-python 的功能:
搜索數據
$ zoomeye search "app:"飛致云堡壘機""
ip:port service country app banner
46.*.*.254:80 http Russian Federation Tornado httpd HTTP/1.1 302 FOUND\r\nContent-...
139.*.*.11:6080 http China nginx HTTP/1.1 200 OK\x0d\nServer: n...
180.*.*.202:8880 http China nginx HTTP/1.1 200 OK\r\nServer: ngi...
180.*.*.181:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nEtag: W/"600...
180.*.*.104:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nContent-Type...
180.*.*.195:80 http China HTTP/1.1 200 OK\nContent-Leng...
180.*.*.118:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nCache-Contro...
180.*.*.120:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
180.*.*.212:80 http China HTTP/1.1 200 OK\nDate: Mon, 1...
180.*.*.119:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nAccept-Range...
101.*.*.237:8888 http China nginx HTTP/1.1 200 OK\r\nServer: ngi...
175.*.*.71:443 https China nginx HTTP/1.1 200 OK\r\nServer: ngi...
182.*.*.7:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nStrict-Trans...
182.*.*.114:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
182.*.*.45:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nAccept-Range...
182.*.*.79:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
52.*.*.175:80 http China nginx HTTP/1.1 302 Found\r\nServer: ...
182.*.*.131:80 http China HTTP/1.1 200 OK\nExpires: Tue...
182.*.*.183:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nLast-Modifie...
182.*.*.41:80 http China HTTP/1.1 200 OK\nAccept-Range...
total: 20
搜索功能是 ZoomEye-python 最重要的功能,其優點是在于不僅能獲取到數據而且能對數據進行篩選,統計,導入導出。
Tips:可以通過 -num 指定展示的數量。
這里為什么不是獲取的數量?
因為
ZoomEye API單次查詢的最小數量為 20 條, 所以-num參數消耗的配額為 20 的整數倍。
下次獲取數據時是否重復消耗配額?
并不會,在對數據進行搜索時,ZoomEye-python 對 API 返回的數據進行了緩存,下次獲取將從緩存中獲取,超過緩存的數量再從 API 獲取,緩存的時間為 5 天,這樣做的目的在一定程度上節約用戶的配額,也保證了數據的準確性。
查看總量
$ zoomeye search "app:"飛致云堡壘機"" -count
7748
在線數據聚合
$ zoomeye search "app:"飛致云堡壘機"" -facet "country"
country count
China 6921
United States 252
Singapore 152
Japan 129
Russian Federation 114
Asia Pacific Regions 26
Republic of Korea 26
South Africa 24
India 15
Philippines 10
以上是獲取 ZoomEye API 對全部數據統計的結果,可以直觀的看出飛致云堡壘機在中國的使用是最多的,設備總量。在分析能提供不小的幫助。
本地數據聚合
zoomeye search "app:"飛致云堡壘機"" -stat "country,city"
country count
China 19
Russian Federation 1
city count
Beijing 9
Shanghai 6
Kamyshin 1
New Taipei City 1
Hangzhou 1
Chengdu 1
Zhongwei 1
本地數據聚合能夠對當前獲取的數據進行統計。
篩選數據
面對眾多的數據,往往看起來比較麻煩,為了方便我們在查看數據時更加方便,ZoomEye-python 提供了一個貼心的功能 —— 篩選。ZoomEye-python 在篩選可以指定字段 ( key ) 也可以指定字段和值 ( key=value )。value 支持正則表達式,如:
$ zoomeye search "app:"飛致云堡壘機"" -filter "city=Beijing,port=8*"
ip city port
180.*.*.181 Beijing 80
180.*.*.104 Beijing 80
182.*.*.7 Beijing 80
182.*.*.114 Beijing 80
182.*.*.45 Beijing 80
182.*.*.79 Beijing 80
182.*.*.131 Beijing 80
182.*.*.183 Beijing 80
182.*.*.41 Beijing 80
total: 9
保存數據
根據不同的需求我們需要導出格式不盡相同的數據,在 ZoomEye-python 提供了兩種保存方式:一種是行 json ,另外一種是ZoomEye API返回的元數據,同時支持篩選。
保存行 json 時,可以指定自己想要的字段,語法與上面的 filter 一致,同樣支持正則表達式。
# 保存篩選數據
$ zoomeye search "app:"飛致云堡壘機"" -save "city=Beijing,port"
save file to /app:飛致云堡壘機_9_1610962280.json successful!
$ cat app:飛致云堡壘機_9_1610962280.json
{'ip': '180.*.*.181', 'city': 'Beijing', 'port': 80}
{'ip': '180.*.*.104', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.7', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.114', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.45', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.79', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.131', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.183', 'city': 'Beijing', 'port': 80}
{'ip': '182.*.*.41', 'city': 'Beijing', 'port': 80}
在沒有指定字段時,將保存從 ZoomEye API 獲取的元數據。
# 保存元數據
$ zoomeye search "app:"飛致云堡壘機"" -save
save file to /app:飛致云堡壘機_20_1610962433.json successful!
$ cat app:飛致云堡壘機_20_1610962433.json
{"total": 7748, "matches": [{"geoinfo": {"city": {"geoname_id": null, "names": {"zh-CN": "\u5361\u6885\u7533", "en": "Kamyshin"}}, "country": {"geoname_id": null, "code": "RU", "names": {"zh-CN": "\u4fc4\u7f57\u65af", "en": "Russian Federation"}}, "isp": "abrikosnet.ru", ......
導入數據
ZoomEye-python 能夠對保存的 ZoomEye API 元數據進行載入并對其進行篩選、搜索等操作,如:
$ zoomeye search app:飛致云堡壘機_20_1610962433.json
ip:port service country app banner
46.*.*.254:80 http Russian Federation Tornado httpd HTTP/1.1 302 FOUND\r\nContent-...
139.*.*.11:6080 http China nginx HTTP/1.1 200 OK\x0d\nServer: n...
180.*.*.202:8880 http China nginx HTTP/1.1 200 OK\r\nServer: ngi...
180.*.*.181:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nEtag: W/"600...
180.*.*.104:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nContent-Type...
180.*.*.195:80 http China HTTP/1.1 200 OK\nContent-Leng...
180.*.*.118:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nCache-Contro...
180.*.*.120:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
180.*.*.212:80 http China HTTP/1.1 200 OK\nDate: Mon, 1...
180.*.*.119:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nAccept-Range...
101.*.*.237:8888 http China nginx HTTP/1.1 200 OK\r\nServer: ngi...
175.*.*.71:443 https China nginx HTTP/1.1 200 OK\r\nServer: ngi...
182.*.*.7:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nStrict-Trans...
182.*.*.114:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
182.*.*.45:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nAccept-Range...
182.*.*.79:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nDate: Mon, 1...
52.*.*.175:80 http China nginx HTTP/1.1 302 Found\r\nServer: ...
182.*.*.131:80 http China HTTP/1.1 200 OK\nExpires: Tue...
182.*.*.183:80 nagios-nsca China Nagios NSCA HTTP/1.1 200 OK\nLast-Modifie...
182.*.*.41:80 http China HTTP/1.1 200 OK\nAccept-Range...
total: 20
2. SDK
在 ZoomEye-python 中提供了一下接口:
1.login()
使用 username/password 進行認證
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地址和端口
##### 使用實例
使用 username/password 初始化
$ 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']
...
使用 APIKEY 初始化
$ python3
>>> import zoomeye.sdk as zoomeye
>>> zm = zoomeye.ZoomEye()
>>> zm.api_key = "01234567-acbd-00000-1111-22222222222"
>>> zm.dork_search("apache country:cn")
...
搜索
如上所示,使用 dork_search() 函數進行搜索,dork_search 提供了 page,resource,facets 參數用來獲取指定頁數,Web/Host 設備以及對數據總量的聚合統計。其中 resource 默認為 host 設備,facets 為 None。
data = zm.dork_search('telnet', facets='app')
zm.get_facet()
{'product': [{'name': '', 'count': 28323128}, {'name': 'BusyBox telnetd', 'count': 10180912}, {'name': 'Linux telnetd', ......
同時 SDK 還提供了獲取多頁數據的函數 multi_page_search ,multi_page_search() 與 dork_search() 的區別在于:multi_page_search 中的 page 為獲取數據的頁數,而 dork_search 中的 page 為第幾頁的數據。
篩選
為了更加容易的獲取數據,SDK 提供了幫助用戶篩選的數據的函數 dork_filter ,用于獲取指定字段的數據,如:
data = zm.dork_search("telnet")
zm.dork_filter("ip,port")
[['180.*.*.166', 5357], ['180.*.*.6', 5357], ......
根據 ZoomEye API 提供的接口,分別為 /host/search 和 /web/search ,這兩個接口返回的數據有一定的區別。因此在進行篩選時請根據指定的搜索類型填入正確的字段。
/web/search 包含的字段有:app / headers / keywords / title / ip / site / city / country
/host/search 包含的字段有:app / version / device / ip / port / hostname / city / country / asn / banner
0x05 Knownsec 404 Team星鏈計劃
ZoomEye-python 是 Knownsec 404 Team星鏈計劃 中的一員。
“404星鏈計劃”是知道創宇404實驗室于2020年8月開始的計劃,旨在通過開源或者開放的方式,長期維護并推進涉及安全研究各個領域不同環節的工具化,就像星鏈一樣,將立足于不同安全領域、不同安全環節的研究人員鏈接起來。
其中不僅限于突破安全壁壘的大型工具,也會包括涉及到優化日常使用體驗的各種小工具,除了404本身的工具開放以外,也會不斷收集安全研究、滲透測試過程中的痛點,希望能通過“404星鏈計劃”改善安全圈內工具龐雜、水平層次不齊、開源無人維護的多種問題,營造一個更好更開放的安全工具促進與交流的技術氛圍。
https://github.com/knownsec/404StarLink-Project
0x06 項目地址
ZoomEye-python 完全開源,任何人可以在此基礎上修改或提交代碼。
GitHub:https://github.com/knownsec/ZoomEye-python
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1461/
暫無評論