Skip to content

Commit e2a3198

Browse files
authoredFeb 5, 2025··
Merge pull request #656 from projectdiscovery/dev
v1.0.10
2 parents a4f1c2d + 5d906c6 commit e2a3198

31 files changed

+10356
-205
lines changed
 

‎.github/workflows/build-test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
strategy:
1515
matrix:
1616
os: [ubuntu-latest, windows-latest, macOS-13]
17-
go-version: [1.21.x]
17+
go-version: [1.22.x]
1818
steps:
1919
- name: Set up Go
2020
uses: actions/setup-go@v4

‎.github/workflows/lint-test.yml

+7-13
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,15 @@ on:
88
workflow_dispatch:
99

1010
jobs:
11-
lint:
12-
name: Lint Test
11+
lint-test:
12+
if: "! endsWith(github.actor, '[bot]')"
1313
runs-on: ubuntu-latest
1414
steps:
15-
- name: Set up Go
16-
uses: actions/setup-go@v4
17-
with:
18-
go-version: 1.21.x
19-
2015
- name: Checkout code
21-
uses: actions/checkout@v3
16+
uses: actions/checkout@v4
17+
18+
- name: Set up Go
19+
uses: projectdiscovery/actions/setup/go@v1
2220

2321
- name: Run golangci-lint
24-
uses: golangci/golangci-lint-action@v3.6.0
25-
with:
26-
version: latest
27-
args: --timeout 5m
28-
working-directory: .
22+
uses: projectdiscovery/actions/golangci-lint@v1

‎.github/workflows/provider-integration.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- name: Set up Go
1414
uses: actions/setup-go@v4
1515
with:
16-
go-version: 1.21.x
16+
go-version: 1.22.x
1717

1818
- name: Check out code
1919
uses: actions/checkout@v3

‎.github/workflows/release-binary.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
- name: "Set up Go"
1919
uses: actions/setup-go@v4
2020
with:
21-
go-version: 1.21.x
21+
go-version: 1.22.x
2222

2323
- name: "Create release on GitHub"
2424
uses: goreleaser/goreleaser-action@v4

‎.github/workflows/release-test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- name: Set up Go
2121
uses: actions/setup-go@v4
2222
with:
23-
go-version: 1.21.x
23+
go-version: 1.22.x
2424

2525
- name: release test
2626
uses: goreleaser/goreleaser-action@v4

‎README.md

+13-3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
- **[FOFA](https://fofa.info)**
4343
- **[Hunter](https://hunter.qianxin.com)**
4444
- **[Quake](https://quake.360.net/quake/#/index)**
45-
- **[Zoomeye](https://www.zoomeye.org)**
45+
- **ZoomEye [china](https://zoomeye.org) - [worldwide](https://zoomeye.hk)**
4646
- **[Netlas](https://netlas.io/)**
4747
- **[CriminalIP](https://www.criminalip.io)**
4848
- **[PublicWWW](https://publicwww.com)**
@@ -76,6 +76,7 @@ Flags:
7676
INPUT:
7777
-q, -query string[] search query, supports: stdin,file,config input (example: -q 'example query', -q 'query.txt')
7878
-e, -engine string[] search engine to query (shodan,shodan-idb,fofa,censys,quake,hunter,zoomeye,netlas,criminalip,publicwww,hunterhow,google) (default shodan)
79+
-asq, -awesome-search-queries string[] use awesome search queries to discover exposed assets on the internet (example: -asq 'jira')
7980

8081
SEARCH-ENGINE:
8182
-s, -shodan string[] search query for shodan (example: -shodan 'query.txt')
@@ -141,7 +142,7 @@ hunter:
141142
- HUNTER_API_KEY_1
142143
- HUNTER_API_KEY_2
143144
zoomeye:
144-
- ZOOMEYE_API_KEY_1
145+
- ZOOMEYE_API_KEY_1:zoomeye.hk
145146
- ZOOMEYE_API_KEY_2
146147
netlas:
147148
- NETLAS_API_KEY_1
@@ -181,7 +182,16 @@ export GOOGLE_API_KEY=xxx
181182
export GOOGLE_API_CX=xxx
182183
```
183184

184-
Required API keys can be obtained by signing up on following platform [Shodan](https://account.shodan.io/register), [Censys](https://censys.io/register), [Fofa](https://fofa.info/toLogin), [Quake](https://quake.360.net/quake/#/index), [Hunter](https://user.skyeye.qianxin.com/user/register?next=https%3A//hunter.qianxin.com/api/uLogin&fromLogin=1), [ZoomEye](https://www.zoomeye.org/login), [Netlas](https://app.netlas.io/registration/), [CriminalIP](https://www.criminalip.io/register), [Publicwww](https://publicwww.com/profile/signup.html) and Google [[1]](https://developers.google.com/custom-search/v1/introduction#identify_your_application_to_google_with_api_key),[[2]](https://programmablesearchengine.google.com/controlpanel/create).
185+
Required API keys can be obtained by signing up on following platform [Shodan](https://account.shodan.io/register), [Censys](https://censys.io/register), [Fofa](https://fofa.info/toLogin), [Quake](https://quake.360.net/quake/#/index), [Hunter](https://user.skyeye.qianxin.com/user/register?next=https%3A//hunter.qianxin.com/api/uLogin&fromLogin=1), ZoomEye [china](https://api.zoomeye.org) - [worldwide](https://api.zoomeye.hk), [Netlas](https://app.netlas.io/registration/), [CriminalIP](https://www.criminalip.io/register), [Publicwww](https://publicwww.com/profile/signup.html) and Google [[1]](https://developers.google.com/custom-search/v1/introduction#identify_your_application_to_google_with_api_key),[[2]](https://programmablesearchengine.google.com/controlpanel/create).
186+
187+
188+
### ZoomEye API
189+
190+
Before conducting any scans, please ensure you are using the correct host to comply with geographical access restrictions of the ZoomEye API:
191+
192+
- **zoomeye.org** is exclusively for users within China.
193+
- **zoomeye.hk** is for users outside China (this is default if no host provided).
194+
185195

186196
## Running Uncover
187197

‎go.mod

+39-40
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,46 @@
11
module github.com/projectdiscovery/uncover
22

3-
go 1.21
3+
go 1.22.0
44

55
require (
66
github.com/hashicorp/golang-lru v0.5.4
77
github.com/julienschmidt/httprouter v1.3.0
88
github.com/logrusorgru/aurora v2.0.3+incompatible
9+
github.com/projectdiscovery/awesome-search-queries v0.0.0-20241111181020-ad0097bd63a1
910
github.com/projectdiscovery/fdmax v0.0.4
10-
github.com/projectdiscovery/goflags v0.1.57
11-
github.com/projectdiscovery/gologger v1.1.13
11+
github.com/projectdiscovery/goflags v0.1.70
12+
github.com/projectdiscovery/gologger v1.1.43
1213
github.com/projectdiscovery/mapcidr v1.1.34
13-
github.com/projectdiscovery/ratelimit v0.0.45
14-
github.com/projectdiscovery/retryablehttp-go v1.0.65
15-
github.com/stretchr/testify v1.9.0
14+
github.com/projectdiscovery/ratelimit v0.0.71
15+
github.com/projectdiscovery/retryablehttp-go v1.0.98
16+
github.com/stretchr/testify v1.10.0
1617
)
1718

1819
require (
19-
github.com/miekg/dns v1.1.56 // indirect
20-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
21-
golang.org/x/mod v0.13.0 // indirect
22-
golang.org/x/tools v0.14.0 // indirect
20+
github.com/miekg/dns v1.1.62 // indirect
21+
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
22+
golang.org/x/mod v0.22.0 // indirect
23+
golang.org/x/tools v0.29.0 // indirect
2324
)
2425

2526
require (
2627
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
2728
github.com/aymerick/douceur v0.2.0 // indirect
2829
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect
2930
github.com/davecgh/go-spew v1.1.1 // indirect
30-
github.com/gorilla/css v1.0.0 // indirect
31+
github.com/gorilla/css v1.0.1 // indirect
3132
github.com/json-iterator/go v1.1.12 // indirect
32-
github.com/microcosm-cc/bluemonday v1.0.25 // indirect
33+
github.com/microcosm-cc/bluemonday v1.0.27 // indirect
3334
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3435
github.com/modern-go/reflect2 v1.0.2 // indirect
3536
github.com/pmezard/go-difflib v1.0.0 // indirect
3637
github.com/projectdiscovery/blackrock v0.0.1 // indirect
37-
github.com/projectdiscovery/utils v0.1.4
38+
github.com/projectdiscovery/utils v0.4.8
3839
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
3940
go.uber.org/multierr v1.11.0 // indirect
40-
golang.org/x/net v0.23.0 // indirect
41-
golang.org/x/sys v0.18.0 // indirect
42-
golang.org/x/text v0.14.0 // indirect
41+
golang.org/x/net v0.34.0 // indirect
42+
golang.org/x/sys v0.29.0 // indirect
43+
golang.org/x/text v0.21.0 // indirect
4344
gopkg.in/yaml.v3 v3.0.1 // indirect
4445
)
4546

@@ -50,60 +51,56 @@ require (
5051
github.com/Mzack9999/go-http-digest-auth-client v0.6.1-0.20220414142836-eb8883508809 // indirect
5152
github.com/VividCortex/ewma v1.2.0 // indirect
5253
github.com/akrylysov/pogreb v0.10.1 // indirect
53-
github.com/alecthomas/chroma v0.10.0 // indirect
54+
github.com/alecthomas/chroma/v2 v2.14.0 // indirect
5455
github.com/andybalholm/brotli v1.0.6 // indirect
5556
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
56-
github.com/bits-and-blooms/bitset v1.13.0 // indirect
57-
github.com/charmbracelet/glamour v0.6.0 // indirect
57+
github.com/charmbracelet/glamour v0.8.0 // indirect
58+
github.com/charmbracelet/lipgloss v0.13.0 // indirect
59+
github.com/charmbracelet/x/ansi v0.3.2 // indirect
5860
github.com/cheggaaa/pb/v3 v3.1.4 // indirect
5961
github.com/cloudflare/circl v1.3.7 // indirect
6062
github.com/dimchansky/utfbom v1.1.1 // indirect
61-
github.com/dlclark/regexp2 v1.8.1 // indirect
63+
github.com/dlclark/regexp2 v1.11.4 // indirect
6264
github.com/docker/go-units v0.5.0 // indirect
6365
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
6466
github.com/fatih/color v1.15.0 // indirect
65-
github.com/gaissmai/bart v0.9.5 // indirect
66-
github.com/gaukas/godicttls v0.0.4 // indirect
67-
github.com/go-logr/logr v1.4.1 // indirect
67+
github.com/gaissmai/bart v0.17.8 // indirect
6868
github.com/go-ole/go-ole v1.2.6 // indirect
6969
github.com/golang/protobuf v1.5.4 // indirect
7070
github.com/golang/snappy v0.0.4 // indirect
71-
github.com/google/go-cmp v0.6.0 // indirect
7271
github.com/google/go-github/v30 v30.1.0 // indirect
7372
github.com/google/go-querystring v1.1.0 // indirect
7473
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
7574
github.com/google/uuid v1.3.1 // indirect
76-
github.com/klauspost/compress v1.16.7 // indirect
75+
github.com/klauspost/compress v1.17.4 // indirect
7776
github.com/klauspost/pgzip v1.2.5 // indirect
7877
github.com/kr/pretty v0.3.1 // indirect
7978
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
8079
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
8180
github.com/mattn/go-colorable v0.1.13 // indirect
82-
github.com/mattn/go-isatty v0.0.19 // indirect
83-
github.com/mattn/go-runewidth v0.0.14 // indirect
81+
github.com/mattn/go-isatty v0.0.20 // indirect
82+
github.com/mattn/go-runewidth v0.0.16 // indirect
8483
github.com/mholt/archiver/v3 v3.5.1 // indirect
8584
github.com/minio/selfupdate v0.6.1-0.20230907112617-f11e74f84ca7 // indirect
8685
github.com/muesli/reflow v0.3.0 // indirect
87-
github.com/muesli/termenv v0.15.1 // indirect
86+
github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect
8887
github.com/nwaples/rardecode v1.1.3 // indirect
89-
github.com/olekukonko/tablewriter v0.0.5 // indirect
9088
github.com/pierrec/lz4/v4 v4.1.2 // indirect
9189
github.com/pkg/errors v0.9.1 // indirect
9290
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
93-
github.com/projectdiscovery/fastdialer v0.1.5 // indirect
94-
github.com/projectdiscovery/hmap v0.0.48 // indirect
91+
github.com/projectdiscovery/fastdialer v0.3.0 // indirect
92+
github.com/projectdiscovery/hmap v0.0.77 // indirect
9593
github.com/projectdiscovery/machineid v0.0.0-20240226150047-2e2c51e35983 // indirect
96-
github.com/projectdiscovery/networkpolicy v0.0.9 // indirect
97-
github.com/projectdiscovery/retryabledns v1.0.65 // indirect
98-
github.com/quic-go/quic-go v0.42.0 // indirect
99-
github.com/refraction-networking/utls v1.5.4 // indirect
100-
github.com/rivo/uniseg v0.4.4 // indirect
94+
github.com/projectdiscovery/networkpolicy v0.1.3 // indirect
95+
github.com/projectdiscovery/retryabledns v1.0.94 // indirect
96+
github.com/refraction-networking/utls v1.6.7 // indirect
97+
github.com/rivo/uniseg v0.4.7 // indirect
10198
github.com/shirou/gopsutil/v3 v3.23.7 // indirect
10299
github.com/shoenig/go-m1cpu v0.1.6 // indirect
103100
github.com/syndtr/goleveldb v1.0.0 // indirect
104101
github.com/tidwall/btree v1.6.0 // indirect
105102
github.com/tidwall/buntdb v1.3.0 // indirect
106-
github.com/tidwall/gjson v1.16.0 // indirect
103+
github.com/tidwall/gjson v1.18.0 // indirect
107104
github.com/tidwall/grect v0.1.4 // indirect
108105
github.com/tidwall/match v1.1.1 // indirect
109106
github.com/tidwall/pretty v1.2.1 // indirect
@@ -114,15 +111,17 @@ require (
114111
github.com/ulikunitz/xz v0.5.11 // indirect
115112
github.com/weppos/publicsuffix-go v0.30.2-0.20230730094716-a20f9abcc222 // indirect
116113
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
117-
github.com/yuin/goldmark v1.5.4 // indirect
118-
github.com/yuin/goldmark-emoji v1.0.1 // indirect
114+
github.com/yuin/goldmark v1.7.4 // indirect
115+
github.com/yuin/goldmark-emoji v1.0.3 // indirect
119116
github.com/yusufpapurcu/wmi v1.2.4 // indirect
120117
github.com/zcalusic/sysinfo v1.0.2 // indirect
121118
github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 // indirect
122119
github.com/zmap/zcrypto v0.0.0-20230814193918-dbe676986518 // indirect
123120
go.etcd.io/bbolt v1.3.7 // indirect
124-
golang.org/x/crypto v0.21.0 // indirect
121+
golang.org/x/crypto v0.32.0 // indirect
125122
golang.org/x/oauth2 v0.18.0 // indirect
123+
golang.org/x/sync v0.10.0 // indirect
124+
golang.org/x/term v0.28.0 // indirect
126125
golang.org/x/time v0.5.0 // indirect
127126
google.golang.org/appengine v1.6.8 // indirect
128127
google.golang.org/protobuf v1.33.0 // indirect

‎go.sum

+87-91
Large diffs are not rendered by default.

‎integration-tests/integration-test.go

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ var (
3030
"criminalip": criminalipTestcases{},
3131
"hunterhow": hunterhowTestcases{},
3232
"google": googleTestcases{},
33+
"odin": odinTestcases{},
34+
"binaryedge": binaryedgeTestcases{},
3335
// feature tests
3436
"output": outputTestcases{},
3537
}

‎integration-tests/source-test.go

+39
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,42 @@ func (h googleTestcases) Execute() error {
206206
}
207207
return expectResultsGreaterThanCount(results, 0)
208208
}
209+
210+
type odinTestcases struct{}
211+
212+
func (h odinTestcases) Execute() error {
213+
token := os.Getenv("ODIN_API_KEY")
214+
if token == "" {
215+
return errors.New("missing odin api key")
216+
}
217+
odinToken := fmt.Sprintf(`odin: [%s]`, token)
218+
if err := os.WriteFile(ConfigFile, []byte(odinToken), 0644); err != nil {
219+
return err
220+
}
221+
defer os.RemoveAll(ConfigFile)
222+
results, err := testutils.RunUncoverAndGetResults(debug, "-odin", "nginx")
223+
224+
if err != nil {
225+
return err
226+
}
227+
return expectResultsGreaterThanCount(results, 0)
228+
}
229+
230+
type binaryedgeTestcases struct{}
231+
232+
func (h binaryedgeTestcases) Execute() error {
233+
token := os.Getenv("BINARYEDGE_API_KEY")
234+
if token == "" {
235+
return errors.New("missing binaryedge api key")
236+
}
237+
238+
binaryedgeToken := fmt.Sprintf(`binaryedge: [%s]`, token)
239+
_ = os.WriteFile(ConfigFile, []byte(binaryedgeToken), 0644)
240+
defer os.RemoveAll(ConfigFile)
241+
results, err := testutils.RunUncoverAndGetResults(debug, "-binaryedge", "1.1.1.1")
242+
243+
if err != nil {
244+
return err
245+
}
246+
return expectResultsGreaterThanCount(results, 0)
247+
}

‎runner/banners.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const banner = `
1313
`
1414

1515
// Version is the current version of uncover
16-
const version = `v1.0.9`
16+
const version = `v1.0.10`
1717

1818
// showBanner is used to show the banner to the user
1919
func showBanner() {

‎runner/options.go

+89-35
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package runner
22

33
import (
4+
"encoding/json"
45
"os"
56
"path/filepath"
7+
"slices"
68

79
"errors"
810

11+
awesomesearchqueries "github.com/projectdiscovery/awesome-search-queries"
912
"github.com/projectdiscovery/goflags"
1013
"github.com/projectdiscovery/gologger"
1114
"github.com/projectdiscovery/gologger/formatter"
@@ -25,35 +28,38 @@ var (
2528

2629
// Options contains the configuration options for tuning the enumeration process.
2730
type Options struct {
28-
Query goflags.StringSlice
29-
Engine goflags.StringSlice
30-
ConfigFile string
31-
ProviderFile string
32-
OutputFile string
33-
OutputFields string
34-
JSON bool
35-
Raw bool
36-
Limit int
37-
Silent bool
38-
Verbose bool
39-
NoColor bool
40-
Timeout int
41-
RateLimit int
42-
RateLimitMinute int
43-
Retries int
44-
Shodan goflags.StringSlice
45-
ShodanIdb goflags.StringSlice
46-
Fofa goflags.StringSlice
47-
Censys goflags.StringSlice
48-
Quake goflags.StringSlice
49-
Netlas goflags.StringSlice
50-
Hunter goflags.StringSlice
51-
ZoomEye goflags.StringSlice
52-
CriminalIP goflags.StringSlice
53-
Publicwww goflags.StringSlice
54-
HunterHow goflags.StringSlice
55-
Google goflags.StringSlice
56-
DisableUpdateCheck bool
31+
Query goflags.StringSlice
32+
Engine goflags.StringSlice
33+
AwesomeSearchQueries goflags.StringSlice
34+
ConfigFile string
35+
ProviderFile string
36+
OutputFile string
37+
OutputFields string
38+
JSON bool
39+
Raw bool
40+
Limit int
41+
Silent bool
42+
Verbose bool
43+
NoColor bool
44+
Timeout int
45+
RateLimit int
46+
RateLimitMinute int
47+
Retries int
48+
Shodan goflags.StringSlice
49+
ShodanIdb goflags.StringSlice
50+
Fofa goflags.StringSlice
51+
Censys goflags.StringSlice
52+
Quake goflags.StringSlice
53+
Netlas goflags.StringSlice
54+
Hunter goflags.StringSlice
55+
ZoomEye goflags.StringSlice
56+
CriminalIP goflags.StringSlice
57+
Publicwww goflags.StringSlice
58+
HunterHow goflags.StringSlice
59+
Google goflags.StringSlice
60+
Odin goflags.StringSlice
61+
BinaryEdge goflags.StringSlice
62+
DisableUpdateCheck bool
5763
}
5864

5965
// ParseOptions parses the command line flags provided by a user
@@ -64,7 +70,8 @@ func ParseOptions() *Options {
6470

6571
flagSet.CreateGroup("input", "Input",
6672
flagSet.StringSliceVarP(&options.Query, "query", "q", nil, "search query, supports: stdin,file,config input (example: -q 'example query', -q 'query.txt')", goflags.FileStringSliceOptions),
67-
flagSet.StringSliceVarP(&options.Engine, "engine", "e", nil, "search engine to query (shodan,shodan-idb,fofa,censys,quake,hunter,zoomeye,netlas,publicwww,criminalip,hunterhow,google) (default shodan)", goflags.FileNormalizedStringSliceOptions),
73+
flagSet.StringSliceVarP(&options.Engine, "engine", "e", nil, "search engine to query (shodan,shodan-idb,fofa,censys,quake,hunter,zoomeye,netlas,publicwww,criminalip,hunterhow,google,odin, binaryedge) (default shodan)", goflags.FileNormalizedStringSliceOptions),
74+
flagSet.StringSliceVarP(&options.AwesomeSearchQueries, "awesome-search-queries", "asq", nil, "use awesome search queries to discover exposed assets on the internet (example: -asq 'jira')", goflags.FileStringSliceOptions),
6875
)
6976

7077
flagSet.CreateGroup("search-engine", "Search-Engine",
@@ -80,6 +87,8 @@ func ParseOptions() *Options {
8087
flagSet.StringSliceVarP(&options.Publicwww, "publicwww", "pw", nil, "search query for publicwww (example: -publicwww 'query.txt')", goflags.FileStringSliceOptions),
8188
flagSet.StringSliceVarP(&options.HunterHow, "hunterhow", "hh", nil, "search query for hunterhow (example: -hunterhow 'query.txt')", goflags.FileStringSliceOptions),
8289
flagSet.StringSliceVarP(&options.Google, "google", "gg", nil, "search query for google (example: -google 'query.txt')", goflags.FileStringSliceOptions),
90+
flagSet.StringSliceVarP(&options.Odin, "odin", "od", nil, "search query for odin (example: -odin 'query.txt')", goflags.FileStringSliceOptions),
91+
flagSet.StringSliceVarP(&options.BinaryEdge, "binaryedge", "be", nil, "search query for binaryedge (example: -binaryedge 'query.txt')", goflags.FileStringSliceOptions),
8392
)
8493

8594
flagSet.CreateGroup("config", "Config",
@@ -150,7 +159,9 @@ func ParseOptions() *Options {
150159
len(options.CriminalIP),
151160
len(options.Publicwww),
152161
len(options.HunterHow),
153-
len(options.Google)) {
162+
len(options.Google),
163+
len(options.Odin),
164+
len(options.BinaryEdge)) {
154165
options.Engine = append(options.Engine, "shodan")
155166
}
156167

@@ -165,6 +176,12 @@ func ParseOptions() *Options {
165176
}
166177
}
167178

179+
if len(options.AwesomeSearchQueries) > 0 {
180+
if err := options.useAwesomeSearchQueries(options.AwesomeSearchQueries); err != nil {
181+
gologger.Fatal().Msgf("could not use awesome search queries: %s\n", err)
182+
}
183+
}
184+
168185
// Validate the options passed by the user and if any
169186
// invalid options have been used, exit.
170187
if err := options.validateOptions(); err != nil {
@@ -212,7 +229,9 @@ func (options *Options) validateOptions() error {
212229
len(options.CriminalIP),
213230
len(options.Publicwww),
214231
len(options.HunterHow),
215-
len(options.Google)) {
232+
len(options.Google),
233+
len(options.Odin),
234+
len(options.BinaryEdge)) {
216235
return errors.New("no query provided")
217236
}
218237

@@ -235,7 +254,9 @@ func (options *Options) validateOptions() error {
235254
len(options.CriminalIP),
236255
len(options.Publicwww),
237256
len(options.HunterHow),
238-
len(options.Google)) {
257+
len(options.Google),
258+
len(options.Odin),
259+
len(options.BinaryEdge)) {
239260
return errors.New("no engine specified")
240261
}
241262

@@ -250,8 +271,15 @@ func versionCallback() {
250271

251272
func appendQuery(options *Options, name string, queries ...string) {
252273
if len(queries) > 0 {
253-
options.Engine = append(options.Engine, name)
254-
options.Query = append(options.Query, queries...)
274+
if !slices.Contains(options.Engine, name) {
275+
options.Engine = append(options.Engine, name)
276+
}
277+
278+
for _, query := range queries {
279+
if !slices.Contains(options.Query, query) {
280+
options.Query = append(options.Query, query)
281+
}
282+
}
255283
}
256284
}
257285

@@ -268,4 +296,30 @@ func appendAllQueries(options *Options) {
268296
appendQuery(options, "publicwww", options.Publicwww...)
269297
appendQuery(options, "hunterhow", options.HunterHow...)
270298
appendQuery(options, "google", options.Google...)
299+
appendQuery(options, "odin", options.Odin...)
300+
appendQuery(options, "binaryedge", options.BinaryEdge...)
301+
}
302+
303+
func (options *Options) useAwesomeSearchQueries(awesomeSearchQueries []string) error {
304+
data, err := awesomesearchqueries.GetQueries()
305+
if err != nil {
306+
return err
307+
}
308+
309+
var queries []awesomesearchqueries.Query
310+
if err := json.Unmarshal(data, &queries); err != nil {
311+
return err
312+
}
313+
314+
// TODO: This is ugly. Improve this by adding direct query support in awesome-search-queries.
315+
for _, query := range awesomeSearchQueries {
316+
for _, engine := range queries {
317+
if engine.Name == query {
318+
for _, engine := range engine.Engines {
319+
appendQuery(options, engine.Platform, engine.Queries...)
320+
}
321+
}
322+
}
323+
}
324+
return nil
271325
}
+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package binaryedge
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
10+
"github.com/projectdiscovery/uncover/sources"
11+
)
12+
13+
const (
14+
URL = "https://api.binaryedge.io/v2/query/ip/%s"
15+
Size = 100
16+
)
17+
18+
type Agent struct{}
19+
20+
func (agent *Agent) Name() string {
21+
return "binaryedge"
22+
}
23+
24+
func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan sources.Result, error) {
25+
if session.Keys.BinaryEdgeToken == "" {
26+
return nil, errors.New("empty binaryedge token")
27+
}
28+
29+
results := make(chan sources.Result)
30+
go func() {
31+
defer close(results)
32+
agent.query(session, query.Query, results)
33+
}()
34+
35+
return results, nil
36+
}
37+
38+
func (agent *Agent) query(session *sources.Session, searchQuery string, results chan sources.Result) {
39+
resp, err := agent.queryURL(session, URL, searchQuery)
40+
if err != nil {
41+
results <- sources.Result{Source: agent.Name(), Error: err}
42+
return
43+
}
44+
defer resp.Body.Close()
45+
46+
var apiResponse BinaryedgeResponse
47+
if err := json.NewDecoder(resp.Body).Decode(&apiResponse); err != nil {
48+
results <- sources.Result{Source: agent.Name(), Error: err}
49+
return
50+
}
51+
52+
for _, event := range apiResponse.Events {
53+
for _, item := range event.Results {
54+
output := sources.Result{
55+
Source: agent.Name(),
56+
IP: item.Target.IP,
57+
Port: item.Target.Port,
58+
}
59+
if raw, err := json.Marshal(item); err == nil {
60+
output.Raw = raw
61+
}
62+
results <- output
63+
}
64+
}
65+
}
66+
67+
func (agent *Agent) queryURL(session *sources.Session, baseURL, searchQuery string) (*http.Response, error) {
68+
urlWithQuery := fmt.Sprintf(baseURL, url.QueryEscape(searchQuery))
69+
request, err := sources.NewHTTPRequest(http.MethodGet, urlWithQuery, nil)
70+
if err != nil {
71+
return nil, err
72+
}
73+
request.Header.Set("X-Key", session.Keys.BinaryEdgeToken)
74+
return session.Do(request, agent.Name())
75+
}

‎sources/agent/binaryedge/example.json

+1,807
Large diffs are not rendered by default.

‎sources/agent/binaryedge/response.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package binaryedge
2+
3+
type BinaryedgeResponse struct {
4+
Total int `json:"total"`
5+
Query string `json:"query"`
6+
Events []BinaryedgeEvent `json:"events"`
7+
}
8+
9+
type BinaryedgeEvent struct {
10+
Results []BinaryedgeResult `json:"results"`
11+
Port int `json:"port"`
12+
}
13+
14+
type BinaryedgeResult struct {
15+
Origin BinaryedgeOrigin `json:"origin"`
16+
Target BinaryedgeTarget `json:"target"`
17+
}
18+
19+
type BinaryedgeOrigin struct {
20+
Module string `json:"module"`
21+
Port int `json:"port"`
22+
IP string `json:"ip"`
23+
Type string `json:"type"`
24+
Ts int64 `json:"ts"`
25+
Country string `json:"country"`
26+
}
27+
28+
type BinaryedgeTarget struct {
29+
Protocol string `json:"protocol"`
30+
Port int `json:"port"`
31+
IP string `json:"ip"`
32+
}

‎sources/agent/criminalip/criminalip.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import (
1212
)
1313

1414
const (
15-
URL = "https://api.criminalip.io/v1/banner/search?query=%s&offset=%d"
15+
URL = "https://api.criminalip.io/v1/banner/search?query=%s&offset=%d"
16+
offsetStep = 10
17+
maxOffset = 9900
1618
)
1719

1820
type Agent struct{}
@@ -31,7 +33,8 @@ func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan
3133
defer close(results)
3234

3335
numberOfResults := 0
34-
currentPage := 1
36+
currentPage := 0
37+
3538
for {
3639
criminalipRequest := &CriminalIPRequest{
3740
Query: query.Query,
@@ -44,7 +47,14 @@ func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan
4447
}
4548

4649
numberOfResults += len(criminalipResponse.Data.Result)
47-
currentPage++
50+
51+
nextOffset := currentPage + offsetStep
52+
53+
if nextOffset > maxOffset {
54+
break
55+
}
56+
57+
currentPage = nextOffset
4858

4959
if numberOfResults > query.Limit || criminalipResponse.Data.Count == 0 || len(criminalipResponse.Data.Result) == 0 {
5060
break
@@ -85,7 +95,7 @@ func (agent *Agent) query(URL string, session *sources.Session, criminalipReques
8595
result.IP = criminalipResult.IP
8696
result.Port = criminalipResult.Port
8797
result.Host = criminalipResult.Domain
88-
raw, _ := json.Marshal(result)
98+
raw, _ := json.Marshal(criminalipResult)
8999
result.Raw = raw
90100
results <- result
91101
}

‎sources/agent/fofa/fofa.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (agent *Agent) query(URL string, session *sources.Session, fofaRequest *Fof
8383
return nil
8484
}
8585
if fofaResponse.Error {
86-
results <- sources.Result{Source: agent.Name(), Error: fmt.Errorf(fofaResponse.ErrMsg)}
86+
results <- sources.Result{Source: agent.Name(), Error: fmt.Errorf("%s", fofaResponse.ErrMsg)}
8787
return nil
8888
}
8989

@@ -92,7 +92,7 @@ func (agent *Agent) query(URL string, session *sources.Session, fofaRequest *Fof
9292
result.IP = fofaResult[0]
9393
result.Port, _ = strconv.Atoi(fofaResult[1])
9494
result.Host = fofaResult[2]
95-
raw, _ := json.Marshal(result)
95+
raw, _ := json.Marshal(fofaResult)
9696
result.Raw = raw
9797
results <- result
9898
}

‎sources/agent/google/google.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (agent *Agent) query(session *sources.Session, googleRequest *Request, resu
104104
result.Url = googleResult.Link
105105
result.Host = agent.parseLink(googleResult.Link)
106106
result.IP = googleResult.Link
107-
raw, _ := json.Marshal(result)
107+
raw, _ := json.Marshal(googleResult)
108108
result.Raw = raw
109109
results <- result
110110
lines = append(lines, googleResult.Link)

‎sources/agent/hunter/hunter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (agent *Agent) query(URL string, session *sources.Session, hunterRequest *R
7676
result.IP = hunterResult.IP
7777
result.Port = hunterResult.Port
7878
result.Host = hunterResult.Domain
79-
raw, _ := json.Marshal(result)
79+
raw, _ := json.Marshal(hunterResult)
8080
result.Raw = raw
8181
results <- result
8282
}

‎sources/agent/hunterhow/hunterhow.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func (agent *Agent) query(URL string, session *sources.Session, results chan sou
8686
result.Host = data.Domain
8787
result.IP = data.IP
8888
result.Port = data.Port
89-
raw, _ := json.Marshal(result)
89+
raw, _ := json.Marshal(data)
9090
result.Raw = raw
9191
results <- result
9292
lines = append(lines, data.Domain)

‎sources/agent/netlas/netlas.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (agent *Agent) query(URL string, session *sources.Session, results chan sou
7272
result.IP = netlasResult.Data.IP
7373
result.Port = netlasResult.Data.Port
7474
result.Host = netlasResult.Data.Host
75-
raw, _ := json.Marshal(result)
75+
raw, _ := json.Marshal(netlasResult)
7676
result.Raw = raw
7777
results <- result
7878
}

‎sources/agent/odin/example.json

+7,962
Large diffs are not rendered by default.

‎sources/agent/odin/odin.go

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package odin
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"net/http"
9+
10+
"github.com/projectdiscovery/uncover/sources"
11+
)
12+
13+
type Agent struct{}
14+
15+
const (
16+
OdinAPIURL = "https://api.odin.io/v1/hosts/search"
17+
)
18+
19+
type OdinRequest struct {
20+
Limit int `json:"limit"`
21+
Query string `json:"query"`
22+
Start []float64 `json:"start,omitempty"`
23+
}
24+
25+
func (agent *Agent) Name() string {
26+
return "odin"
27+
}
28+
29+
func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan sources.Result, error) {
30+
if session.Keys.OdinToken == "" {
31+
return nil, errors.New("empty odin token")
32+
}
33+
34+
results := make(chan sources.Result)
35+
36+
go func() {
37+
defer close(results)
38+
39+
totalFetched := 0
40+
var startCursor []float64
41+
42+
for {
43+
reqBody := OdinRequest{
44+
Limit: query.Limit,
45+
Query: query.Query,
46+
}
47+
if len(startCursor) == 2 {
48+
reqBody.Start = startCursor
49+
}
50+
odinResp := agent.query(session, &reqBody, results)
51+
if odinResp == nil {
52+
break
53+
}
54+
55+
countData := len(odinResp.Data)
56+
totalFetched += countData
57+
58+
if countData == 0 {
59+
break
60+
}
61+
startCursor = odinResp.Pagination.Last
62+
63+
if totalFetched >= query.Limit || totalFetched >= odinResp.Pagination.Total {
64+
break
65+
}
66+
}
67+
}()
68+
69+
return results, nil
70+
}
71+
72+
func (agent *Agent) query(session *sources.Session, odinReq *OdinRequest, results chan sources.Result) *OdinResponse {
73+
reqBody, err := json.Marshal(odinReq)
74+
if err != nil {
75+
results <- sources.Result{Source: agent.Name(), Error: fmt.Errorf("failed to marshal request: %v", err)}
76+
return nil
77+
}
78+
79+
httpReq, err := sources.NewHTTPRequest(http.MethodPost, OdinAPIURL, bytes.NewReader(reqBody))
80+
if err != nil {
81+
results <- sources.Result{Source: agent.Name(), Error: err}
82+
return nil
83+
}
84+
85+
httpReq.Header.Set("X-API-Key", session.Keys.OdinToken)
86+
httpReq.Header.Set("Content-Type", "application/json")
87+
88+
resp, err := session.Do(httpReq, agent.Name())
89+
if err != nil {
90+
results <- sources.Result{Source: agent.Name(), Error: err}
91+
return nil
92+
}
93+
defer resp.Body.Close()
94+
95+
var odinResp OdinResponse
96+
if err := json.NewDecoder(resp.Body).Decode(&odinResp); err != nil {
97+
results <- sources.Result{Source: agent.Name(), Error: fmt.Errorf("failed to decode odin response: %v", err)}
98+
return nil
99+
}
100+
101+
for _, host := range odinResp.Data {
102+
for _, svc := range host.Services {
103+
result := sources.Result{
104+
Source: agent.Name(),
105+
IP: host.IP,
106+
Port: svc.Port,
107+
}
108+
rawBytes, _ := json.Marshal(host)
109+
result.Raw = rawBytes
110+
111+
results <- result
112+
}
113+
}
114+
115+
return &odinResp
116+
}

‎sources/agent/odin/response.go

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package odin
2+
3+
type OdinResponse struct {
4+
Success bool `json:"success"`
5+
Pagination Pagination `json:"pagination"`
6+
Data []HostData `json:"data"`
7+
}
8+
9+
type Pagination struct {
10+
Start []float64 `json:"start"`
11+
Last []float64 `json:"last"`
12+
Limit int `json:"limit"`
13+
Total int `json:"total"`
14+
}
15+
16+
type HostData struct {
17+
ScanID int64 `json:"scan_id"`
18+
IP string `json:"ip"`
19+
IsIPv4 bool `json:"is_ipv4"`
20+
IsIPv6 bool `json:"is_ipv6"`
21+
Services []Service `json:"services"`
22+
LastUpdatedAt string `json:"last_updated_at"`
23+
}
24+
25+
type Service struct {
26+
Port int `json:"port"`
27+
Protocol string `json:"protocol"`
28+
Name string `json:"name"`
29+
LastUpdatedAt string `json:"last_updated_at"`
30+
}

‎sources/agent/publicwww/publicwww.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (agent *Agent) query(URL string, session *sources.Session, results chan sou
9696
}
9797
result.Host = hostname
9898
result.Url = record[0]
99-
raw, _ := json.Marshal(result)
99+
raw, _ := json.Marshal(record)
100100
result.Raw = raw
101101
results <- result
102102
lines = append(lines, trimmedLine)

‎sources/agent/quake/quake.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (agent *Agent) query(URL string, session *sources.Session, quakeRequest *Re
9595
result.IP = quakeResult.IP
9696
result.Port = quakeResult.Port
9797
result.Host = quakeResult.Hostname
98-
raw, _ := json.Marshal(result)
98+
raw, _ := json.Marshal(quakeResult)
9999
result.Raw = raw
100100
results <- result
101101
}

‎sources/agent/zoomeye/zoomeye.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@ package zoomeye
33
import (
44
"encoding/json"
55
"fmt"
6-
"strings"
76
"net/http"
87
"net/url"
98
"strconv"
9+
"strings"
1010

1111
"errors"
1212

1313
"github.com/projectdiscovery/uncover/sources"
1414
)
1515

1616
var (
17-
URL = "https://api.zoomeye.org/host/search?query=%s&page=%d"
17+
URL = "https://api.zoomeye.hk/host/search?query=%s&page=%d"
1818
)
1919

2020
type Agent struct{}
@@ -25,7 +25,7 @@ func (agent *Agent) Name() string {
2525

2626
func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan sources.Result, error) {
2727
if session.Keys.ZoomEyeHost != "" {
28-
URL = strings.Replace(URL, "zoomeye.org", session.Keys.ZoomEyeHost, 1)
28+
URL = strings.Replace(URL, "zoomeye.hk", session.Keys.ZoomEyeHost, 1)
2929
}
3030

3131
if session.Keys.ZoomEyeToken == "" {

‎sources/keys.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ type Keys struct {
1616
HunterHowToken string
1717
GoogleKey string
1818
GoogleCX string
19+
OdinToken string
20+
BinaryEdgeToken string
1921
}
2022

2123
func (keys Keys) Empty() bool {
@@ -33,5 +35,7 @@ func (keys Keys) Empty() bool {
3335
keys.PublicwwwToken == "" &&
3436
keys.HunterHowToken == "" &&
3537
keys.GoogleKey == "" &&
36-
keys.GoogleCX == ""
38+
keys.GoogleCX == "" &&
39+
keys.OdinToken == "" &&
40+
keys.BinaryEdgeToken == ""
3741
}

‎sources/provider.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ type Provider struct {
3232
Publicwww []string `yaml:"publicwww"`
3333
HunterHow []string `yaml:"hunterhow"`
3434
Google []string `yaml:"google"`
35+
Odin []string `yaml:"odin"`
36+
BinaryEdge []string `yaml:"binaryedge"`
3537
}
3638

3739
// NewProvider loads provider keys from default location and env variables
@@ -80,8 +82,8 @@ func (provider *Provider) GetKeys() Keys {
8082
if len(provider.ZoomEye) > 0 {
8183
zoomeye := provider.ZoomEye[rand.Intn(len(provider.ZoomEye))]
8284
parts := strings.Split(zoomeye, ":")
85+
keys.ZoomEyeToken = parts[0]
8386
if len(parts) == 2 {
84-
keys.ZoomEyeToken = parts[0]
8587
keys.ZoomEyeHost = parts[1]
8688
}
8789
}
@@ -108,6 +110,12 @@ func (provider *Provider) GetKeys() Keys {
108110
keys.GoogleCX = parts[1]
109111
}
110112
}
113+
if len(provider.Odin) > 0 {
114+
keys.OdinToken = provider.Odin[rand.Intn(len(provider.Odin))]
115+
}
116+
if len(provider.BinaryEdge) > 0 {
117+
keys.BinaryEdgeToken = provider.BinaryEdge[rand.Intn(len(provider.BinaryEdge))]
118+
}
111119

112120
return keys
113121
}
@@ -153,6 +161,8 @@ func (provider *Provider) LoadProviderKeysFromEnv() {
153161
provider.Fofa = appendIfAllExists(provider.Fofa, "FOFA_EMAIL", "FOFA_KEY")
154162
provider.Censys = appendIfAllExists(provider.Censys, "CENSYS_API_ID", "CENSYS_API_SECRET")
155163
provider.Google = appendIfAllExists(provider.Google, "GOOGLE_API_KEY", "GOOGLE_API_CX")
164+
provider.Odin = appendIfExists(provider.Odin, "ODIN_API_KEY")
165+
provider.BinaryEdge = appendIfExists(provider.BinaryEdge, "BINARYEDGE_API_KEY")
156166
}
157167

158168
// HasKeys returns true if at least one agent/source has keys
@@ -169,6 +179,8 @@ func (provider *Provider) HasKeys() bool {
169179
len(provider.HunterHow) > 0,
170180
len(provider.Google) > 0,
171181
len(provider.Publicwww) > 0,
182+
len(provider.Odin) > 0,
183+
len(provider.BinaryEdge) > 0,
172184
)
173185
}
174186

‎sources/session.go

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ var DefaultRateLimits = map[string]*ratelimit.Options{
2828
"publicwww": {Key: "publicwww", MaxCount: 1, Duration: time.Minute},
2929
"hunterhow": {Key: "hunterhow", MaxCount: 1, Duration: 3 * time.Second},
3030
"google": {Key: "google", MaxCount: 1, Duration: 3 * time.Second},
31+
"odin": {Key: "odin", MaxCount: 1, Duration: time.Second},
32+
"binaryedge": {Key: "binaryedge", MaxCount: 1, Duration: time.Second},
3133
}
3234

3335
// Session handles session agent sessions

‎uncover.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@ import (
77

88
"github.com/projectdiscovery/gologger"
99
"github.com/projectdiscovery/uncover/sources"
10+
"github.com/projectdiscovery/uncover/sources/agent/binaryedge"
1011
"github.com/projectdiscovery/uncover/sources/agent/censys"
1112
"github.com/projectdiscovery/uncover/sources/agent/criminalip"
1213
"github.com/projectdiscovery/uncover/sources/agent/fofa"
1314
"github.com/projectdiscovery/uncover/sources/agent/google"
1415
"github.com/projectdiscovery/uncover/sources/agent/hunter"
1516
"github.com/projectdiscovery/uncover/sources/agent/hunterhow"
1617
"github.com/projectdiscovery/uncover/sources/agent/netlas"
18+
"github.com/projectdiscovery/uncover/sources/agent/odin"
1719
"github.com/projectdiscovery/uncover/sources/agent/publicwww"
1820
"github.com/projectdiscovery/uncover/sources/agent/quake"
1921
"github.com/projectdiscovery/uncover/sources/agent/shodan"
2022
"github.com/projectdiscovery/uncover/sources/agent/shodanidb"
2123
"github.com/projectdiscovery/uncover/sources/agent/zoomeye"
24+
2225
errorutil "github.com/projectdiscovery/utils/errors"
2326
stringsutil "github.com/projectdiscovery/utils/strings"
2427
)
@@ -75,6 +78,10 @@ func New(opts *Options) (*Service, error) {
7578
s.Agents = append(s.Agents, &hunterhow.Agent{})
7679
case "google":
7780
s.Agents = append(s.Agents, &google.Agent{})
81+
case "odin":
82+
s.Agents = append(s.Agents, &odin.Agent{})
83+
case "binaryedge":
84+
s.Agents = append(s.Agents, &binaryedge.Agent{})
7885
}
7986
}
8087
s.Provider = sources.NewProvider()
@@ -179,7 +186,7 @@ func (s *Service) ExecuteWithCallback(ctx context.Context, callback func(result
179186
// AllAgents returns all supported uncover Agents
180187
func (s *Service) AllAgents() []string {
181188
return []string{
182-
"shodan", "censys", "fofa", "shodan-idb", "quake", "hunter", "zoomeye", "netlas", "criminalip", "publicwww", "hunterhow", "google",
189+
"shodan", "censys", "fofa", "shodan-idb", "quake", "hunter", "zoomeye", "netlas", "criminalip", "publicwww", "hunterhow", "google", "odin", "binaryedge",
183190
}
184191
}
185192

0 commit comments

Comments
 (0)
Please sign in to comment.