ZoomEye-go 是一款基于 ZoomEye API 开发的 Golang 库

Overview

ZoomEye-go

ZoomEye 是一款网络空间搜索引擎,用户可以使用浏览器方式 搜索网络设备

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

下载安装

  • Releases 中获得已经编译好的二进制文件

  • 直接通过Github下载源代码,或运行 go get 进行下载安装:

     go get -u github.com/gyyyy/ZoomEye-go
    

    进入项目目录,执行 make 命令完成编译,编译好的二进制文件存放于 bin 目录下:

     make [all/linux/macos/win64/win32]
    

使用命令行模式

基础配置

ZoomEye-go 二进制文件同目录下创建 conf.yaml 文件,对配置变量进行自定义设置:

# API-Key和JWT存放路径
ZOOMEYE_CONFIG_PATH: "~/.config/zoomeye/setting"

# 搜索结果数据缓存路径
ZOOMEYE_CACHE_PATH: "~/.config/zoomeye/cache"

# 搜索和过滤结果数据保存路径
ZOOMEYE_DATA_PATH: "data"

# 本地数据超时时间,默认为5天
EXPIRED_TIME: 432000

若不创建或修改配置文件,ZoomEye-go 相关文件路径和其他参数默认值都将与 conf_default.yaml 描述一致。

初始化用户凭证

首次使用 ZoomEye-go 时,需要通过 init 命令对用户凭证进行初始化,该凭证将自动作为之后其他 ZoomEye API 接口调用时的身份标识。ZoomEye-go 实现了 ZoomEye API 支持的两种认证方式:

  1. API-Key (推荐)

    ./ZoomEye-go init -apikey [API-KEY]
    
  2. JWT

    ./ZoomEye-go init -username [USERNAME] -password [PASSWORD]
    

使用示例:

./ZoomEye-go init -apikey "XXXXXXXX-XXXX-XXXXX-XXXX-XXXXXXXXXXX"
succeed to initialize

[Resources Info]

  Role:  developer
  Quota: 10000

推荐使用 API-Key 认证方式,用户可以登录 ZoomEye个人信息 中获取,注意不要将其泄露给其他人JWT 认证方式获取的凭证具有时效性,失效后需要重新初始化才能正常使用,本地存储的旧的凭证数据会被覆盖。

可以通过 init -h 获取帮助。

查询用户资源信息

通过 info 命令可以查询 ZoomEye 当前用户个人信息以及数据配额,初始化成功后也会自动查询:

./ZoomEye-go info
succeed to query

[Resources Info]

  Role:  developer
  Quota: 10000

搜索

搜索是 ZoomEye-go 最核心的功能,通过 search 命令指定搜索关键词进行使用,支持的参数说明如下:

-dork [KEYWORDS]     设置搜索关键字,必填(如:-dork "port:80 nginx")
-num [NUM]           设置显示/搜索的数据条数,默认为 20(建议设置20的倍数,因为ZoomEye一次接口查询为20条)
-type [host/web]     设置搜索资源类型,默认为 host(如:-type "web")
-force               强制调用 ZoomEye API 查询,忽略本地数据和缓存
-count               查询该 dork 在 ZoomEye 数据库中的总量
-facet [field,...]   查询该 dork 在 ZoomEye 数据库中全量数据的分布情况,以逗号分隔(如:-facet "app,service,os")
-stat [field,...]    统计本次搜索结果数据中指定字段的分布情况,以逗号分隔(如:-stat "app,service,os")
-filter [field,...]  对本次搜索结果数据中指定字段进行筛选,以逗号分隔(如:-filter "app,ip,title")
-save                保存本次搜索结果数据,若使用 filter 参数指定了筛选条件,筛选结果也会保存

根据搜索资源类型的不同(由参数 -type 确定),其他部分参数值范围存在差异,并且可能根据 ZoomEye 官方更新而改变:

  • -facet-stat ,它们取值一样,只是统计的数据集范围不同
    • -typehost 时,可以使用 app,device,service,os,port,country,city
    • -typeweb 时,可以使用 webapp,component,framework,frontend,server,waf,os,country,city
  • -filter
    • -typehost 时,可以使用 app,version,device,ip,port,hostname,city,city_cn,country,country_cn,asn,banner
    • -typeweb 时,可以使用 app,headers,keywords,title,ip,site,city,city_cn,country,country_cn

使用示例:

./ZoomEye-go search -dork "telnet" -num 1 -count
succeed to search (in 272.080753ms)

[Total Count]

  Count: 57003299


[Host Search Result]

  +-----------------------+----------------------+----------------------+------------------------------------------+----------------------+
  | Host                  | Application          | Service              | Banner                                   | Country              |
  +-----------------------+----------------------+----------------------+------------------------------------------+----------------------+
  | 159.203.16.45:10005   | Pocket CMD telnetd   | telnet               | \xff\xfb\x01\xff\xfb\x03\xff\xfc\'\xf... | Canada               |
  +-----------------------+----------------------+----------------------+------------------------------------------+----------------------+
  | Total: 1                                                                                                                              |
  +-----------------------+----------------------+----------------------+------------------------------------------+----------------------+

可以通过 search -h 获取帮助。

缓存机制

ZoomEye-go 参考官方 ZoomEye-python 的设计,在命令行模式下提供了相似的缓存机制,数据默认存储在 ~/.config/zoomeye/cache 目录,尽可能节约用户配额。搜索过的数据将默认在本地缓存 5 天,在缓存数据有效期内,重复执行同条件搜索不会消耗配额。可以设置 -force 参数强制调用 ZoomEye API 进行搜索,结果会覆盖当前缓存数据。

通过 clean 命令可以清空所有缓存数据。

加载分析本地数据

ZoomEye-go 也可以通过 load 命令加载本地数据,并将它解析成搜索结果数据类型,支持与 search 命令类似的 -count-facet-stat-filter 参数对数据进行统计分析,不同的是,-save 参数仅会保存 -filter 的执行结果。

可以通过 load -h 获取帮助。

使用SDK API

使用示例:

package main

import (
	"ZoomEye-go/zoomeye"
)

func main() {
	// 初始化用户凭证
	zoom := zoomeye.New()
	jwt, _ := zoom.Login("[email protected]", "password")
	// 或使用 API-Key 进行初始化,不需要再调用 Login() 方法
	// zoom := zoomeye.NewWithKey("XXXXXXXX-XXXX-XXXXX-XXXX-XXXXXXXXXXX")

	// 查询用户资源信息
	info, _ := zoom.ResourcesInfo()

	// 搜索
	result, _ := zoom.DorkSearch("port:80 nginx", 1, "host", "app,service,os")
	// 多页搜索,5页(100条)以上会进行并发搜索,减少搜索耗时
  // results, _ := zoom.MultiPageSearch("wordpress country:cn", 5, "web", "webapp,server,os")
  // 多页搜索(结果合并)
	// result, _ := zoom.MultiToOneSearch("wordpress country:cn", 5, "web", "webapp,server,os")

	// 对搜索结果进行统计
	stat := result.Statistics("app,service,os")

	// 对搜索结果进行筛选
	filt := result.Filter("app,ip,title")

	// 设备历史搜索(需要高级用户或VIP用户权限,结果包含多少条记录就会扣多少额度,非土豪慎用)
	history, _ := zoom.HistoryIP("1.2.3.4")
}

TODO

  • 实现交互式命令行模式

404StarLink 2.0 - Galaxy

404StarLink Logo

ZoomEye-go 是 404Team 星链计划2.0 中的一环,如果对 ZoomEye-go 有任何疑问又或是想要找小伙伴交流,可以参考星链计划的加群方式。


如果发现Bug请提Issues,欢迎PR。

Issues
  • 感觉有个用户体验不好的地方

    感觉有个用户体验不好的地方

    当maxPage>5时,比如为10,则采用并发模式。

    此时只要其中一页请求有问题,比如搜索结果只有7页,则访问第8页的时候出错,很可能就会没结果。(因为这时候往往第8页返回的最快)

    我觉得程序的逻辑是不是可以更好:先访问第一页,看下结果有多少数量和用户有多少额度,然后根据这两个变量来调整maxPage,再进行余下的并发逻辑。

    opened by saucer-man 1
  • init bug

    init bug

    运行的命令: ./ZoomEye-go init -apikey xxx-xxx-xx

    failed to initialize: json: cannot unmarshal number 9013.0 into Go struct field .resources.search of type int

    看了一下代码,search定义的类型是 int,而源站返回的是 9013.0,非int类型,json转struct时候出错。 相关代码: type ResourcesInfoResult struct { baseResult Plan string json:"plan" Resources *struct { Interval string json:"interval" Search int json:"search" Stats int json:"stats" } json:"resources" } 源站返回的结果: {"plan": "developer", "resources": {"search": 9013.0, "stats": 100, "interval": "month"}}

    opened by wivd 0
Releases(v1.5)
Owner
gyyyy(宫音)
gyyyy(宫音)
An API client for the Notion API implemented in Golang

An API client for the Notion API implemented in Golang

Anatoly Nosov 316 Aug 8, 2022
A API scanner written in GOLANG to scan files recursively and look for API keys and IDs.

GO FIND APIS _____ ____ ______ _____ _ _ _____ _____ _____ _____ / ____|/ __ \ | ____|_ _| \ | | __ \ /\ | __ \_

Sreekanth Sasi 3 Oct 25, 2021
Arweave-api - Arweave API implementation in golang

Arweave API Go implementation of the Arweave API Todo A list of endpoints that a

Joshua Lawson 1 Jan 16, 2022
Reservationbox-api - Reservationbox Api with golang

reservationbox-api How to set up application Cloning git on this link : https://

null 0 Jan 30, 2022
Go api infra - Infrastructure for making api on golang so easy

Go Infra Api Infrastructre methods and types for make api simple Response abstra

Anosov Konstantin 1 Jun 18, 2022
A GoLang wrapper for Politics & War's API. Forego the hassle of accessing the API directly!

A GoLang wrapper for Politics & War's API. Forego the hassle of accessing the API directly!

null 1 Mar 5, 2022
Awb-kh-api - AWB KH API WITH GOLANG

AWB KH API Da die vorhandene API des Abfallwirtschaftsbetriebs in Bad Kreuznach

null 0 Feb 11, 2022
Golang API for Whatsapp API MultiDevice version

Go Whatsapp API Multi Device Version Required Mac OS: brew install vips export C

Aldino Kemal 32 Aug 8, 2022
Go library for accessing the MyAnimeList API: http://myanimelist.net/modules.php?go=api

go-myanimelist go-myanimelist is a Go client library for accessing the MyAnimeList API. Project Status The MyAnimeList API has been stable for years a

Stratos Neiros 31 May 10, 2022
Go client for the YNAB API. Unofficial. It covers 100% of the resources made available by the YNAB API.

YNAB API Go Library This is an UNOFFICIAL Go client for the YNAB API. It covers 100% of the resources made available by the YNAB API. Installation go

Bruno Souza 52 Jul 15, 2022
lambda-go-api-proxy makes it easy to port APIs written with Go frameworks such as Gin to AWS Lambda and Amazon API Gateway.

aws-lambda-go-api-proxy makes it easy to run Golang APIs written with frameworks such as Gin with AWS Lambda and Amazon API Gateway.

Amazon Web Services - Labs 683 Aug 6, 2022
The NVD API is an unofficial Go wrapper around the NVD API.

NVD API The NVD API is an unofficial Go wrapper around the NVD API. Supports: CVE CPE How to use The following shows how to basically use the wrapper

Lucas TESSON 5 Jul 20, 2022
go-whatsapp-rest-API is a Go library for the WhatsApp web which use Swagger as api interface

go-whatsapp-rest-API go-whatsapp-rest-API is a Go library for the WhatsApp web which use Swagger as api interface Multi-devices (MD) Support. This ver

null 16 May 13, 2022
A Wrapper Client for Google Spreadsheet API (Sheets API)

Senmai A Wrapper Client for Google Spreadsheet API (Sheets API) PREPARATION Service Account and Key File Create a service account on Google Cloud Plat

ytnobody / satoshi azuma 0 Nov 5, 2021
💾 Wolke API is the API behind Wolke image storage and processing aswell as user management

?? Wolke API Wolke API is the API behind Wolke image storage and processing aswell as user management Deploying To deploy Wolke Bot you'll need podman

wolke.casa 1 Dec 21, 2021
Upcoming mobiles api (UpMob API)

upcoming_mobiles_api (UpMob API) UpMob API scraps 91mobiles.com to get devices i

null 0 Dec 21, 2021
Api-product - A basic REST-ish API that allows you to perform CRUD operations for Products

Description A basic REST-ish API that allows you to perform CRUD operations for

Abdul Salim 0 Jan 3, 2022
Contact-api - API for websites I have designed that have to send unauthenticated email

contact https://aws.amazon.com/premiumsupport/knowledge-center/custom-headers-ap

Noah Varghese 0 Apr 11, 2022
Triangula-api-server - API server for processing images with Triangula

Triangula API server Minimalistic API server that calculates and serves artistic

Maik Schneider 0 Jan 10, 2022