add zoomeye domain api source

dnsrepo-source
M09ic 2021-12-21 00:34:49 +08:00
parent 17fd08b034
commit 63f09328ec
4 changed files with 89 additions and 0 deletions

View File

@ -36,6 +36,7 @@ import (
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/virustotal"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/waybackarchive"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/zoomeye"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping/sources/zoomeyeapi"
)
// DefaultSources contains the list of fast sources used by default.
@ -114,6 +115,7 @@ var DefaultAllSources = []string{
"virustotal",
"waybackarchive",
"zoomeye",
"zoomeyeapi",
"fofa",
}
@ -205,6 +207,8 @@ func (a *Agent) addSources(sources []string) {
a.sources[source] = &waybackarchive.Source{}
case "zoomeye":
a.sources[source] = &zoomeye.Source{}
case "zoomeyeapi":
a.sources[source] = &zoomeyeapi.Source{}
case "fofa":
a.sources[source] = &fofa.Source{}
}

View File

@ -47,6 +47,7 @@ type ConfigFile struct {
URLScan []string `yaml:"urlscan"`
Virustotal []string `yaml:"virustotal"`
ZoomEye []string `yaml:"zoomeye"`
ZoomEyeApi []string `yaml:"zoomeyeapi"`
Fofa []string `yaml:"fofa"`
// Version indicates the version of subfinder installed.
Version string `yaml:"subfinder-version"`
@ -199,6 +200,9 @@ func (c *ConfigFile) GetKeys() subscraping.Keys {
keys.ZoomEyePassword = parts[1]
}
}
if len(c.ZoomEyeApi) > 0 {
keys.ZoomEyeKey = c.ZoomEyeApi[rand.Intn(len(c.ZoomEyeApi))]
}
if len(c.Fofa) > 0 {
fofaKeys := c.Fofa[rand.Intn(len(c.Fofa))]
parts := strings.Split(fofaKeys, ":")

View File

@ -0,0 +1,80 @@
package zoomeyeapi
import (
"context"
"encoding/json"
"fmt"
"net/http"
"github.com/projectdiscovery/subfinder/v2/pkg/subscraping"
)
//type loginResp struct {
// JWT string `json:"access_token"`
//}
// search results
type zoomeyeResults struct {
Status int `json:"status"`
Total int `json:"total"`
List []struct {
Name string `json:"name"`
Ip []string `json:"ip"`
} `json:"list"`
}
// Source is the passive scraping agent
type Source struct{}
// Run function returns all subdomains found with the service
func (s *Source) Run(ctx context.Context, domain string, session *subscraping.Session) <-chan subscraping.Result {
results := make(chan subscraping.Result)
go func() {
defer close(results)
if session.Keys.ZoomEyeKey == "" {
return
}
headers := map[string]string{
"API-KEY": session.Keys.ZoomEyeKey,
"Accept": "application/json",
"Content-Type": "application/json",
}
var pages = 1
for currentPage := 1; currentPage <= pages; currentPage++ {
api := fmt.Sprintf("https://api.zoomeye.org/domain/search?q=%s&type=1&s=1000&page=%d", domain, currentPage)
resp, err := session.Get(ctx, api, "", headers)
isForbidden := resp != nil && resp.StatusCode == http.StatusForbidden
if err != nil {
if !isForbidden && currentPage == 0 {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
session.DiscardHTTPResponse(resp)
}
return
}
var res zoomeyeResults
err = json.NewDecoder(resp.Body).Decode(&res)
if err != nil {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Error, Error: err}
resp.Body.Close()
return
}
resp.Body.Close()
pages = int(res.Total/1000) + 1
for _, r := range res.List {
results <- subscraping.Result{Source: s.Name(), Type: subscraping.Subdomain, Value: r.Name}
}
currentPage++
}
}()
return results
}
// Name returns the name of the source
func (s *Source) Name() string {
return "zoomeyeapi"
}

View File

@ -61,6 +61,7 @@ type Keys struct {
Virustotal string `json:"virustotal"`
ZoomEyeUsername string `json:"zoomeye_username"`
ZoomEyePassword string `json:"zoomeye_password"`
ZoomEyeKey string `json:"zoomeye_key"`
FofaUsername string `json:"fofa_username"`
FofaSecret string `json:"fofa_secret"`
}