11package censys
22
33import (
4+ "context"
45 "encoding/json"
5- "fmt"
6- "net/http"
7- "net/url"
86
97 "errors"
108
9+ censyssdkgo "github.com/censys/censys-sdk-go"
10+ "github.com/censys/censys-sdk-go/models/components"
11+ "github.com/censys/censys-sdk-go/models/operations"
1112 "github.com/projectdiscovery/uncover/sources"
1213)
1314
1415const (
15- URL = "https://search.censys.io/api/v2/hosts/search?q=%s&per_page=%d&virtual_hosts=INCLUDE"
1616 MaxPerPage = 100
1717)
1818
@@ -23,9 +23,10 @@ func (agent *Agent) Name() string {
2323}
2424
2525func (agent * Agent ) Query (session * sources.Session , query * sources.Query ) (chan sources.Result , error ) {
26- if session .Keys .CensysToken == "" || session .Keys .CensysSecret == "" {
26+ if session .Keys .CensysToken == "" || session .Keys .CensysOrgId == "" {
2727 return nil , errors .New ("empty censys keys" )
2828 }
29+
2930 results := make (chan sources.Result )
3031
3132 go func () {
@@ -39,76 +40,77 @@ func (agent *Agent) Query(session *sources.Session, query *sources.Query) (chan
3940 PerPage : MaxPerPage ,
4041 Cursor : nextCursor ,
4142 }
42- censysResponse := agent .query (URL , session , censysRequest , results )
43+ censysResponse := agent .query (session , censysRequest , results )
4344 if censysResponse == nil {
4445 break
4546 }
46- nextCursor = censysResponse .Results . Links . Next
47- if nextCursor == "" || numberOfResults > query .Limit || len (censysResponse .Results .Hits ) == 0 {
47+ nextCursor = censysResponse .ResponseEnvelopeSearchQueryResponse . Result . NextPageToken
48+ if nextCursor == "" || numberOfResults > query .Limit || len (censysResponse .ResponseEnvelopeSearchQueryResponse . Result .Hits ) == 0 {
4849 break
4950 }
50- numberOfResults += len (censysResponse .Results .Hits )
51+ numberOfResults += len (censysResponse .ResponseEnvelopeSearchQueryResponse . Result .Hits )
5152 }
5253 }()
5354
5455 return results , nil
5556}
5657
57- func (agent * Agent ) queryURL (session * sources.Session , URL string , censysRequest * CensysRequest ) (* http.Response , error ) {
58- censysURL := fmt .Sprintf (URL , url .QueryEscape (censysRequest .Query ), censysRequest .PerPage )
59- if censysRequest .Cursor != "" {
60- censysURL += fmt .Sprintf ("&cursor=%s" , censysRequest .Cursor )
61- }
62- request , err := sources .NewHTTPRequest (http .MethodGet , censysURL , nil )
63- if err != nil {
64- return nil , err
65- }
66- request .Header .Set ("Accept" , "application/json" )
67- request .SetBasicAuth (session .Keys .CensysToken , session .Keys .CensysSecret )
68- return session .Do (request , agent .Name ())
58+ func (agent * Agent ) queryURL (session * sources.Session , censysRequest * CensysRequest ) (* operations.V3GlobaldataSearchQueryResponse , error ) {
59+ ctx := context .Background ()
60+
61+ s := censyssdkgo .New (
62+ censyssdkgo .WithOrganizationID (session .Keys .CensysOrgId ),
63+ censyssdkgo .WithSecurity (session .Keys .CensysToken ),
64+ censyssdkgo .WithClient (
65+ session .Client .HTTPClient ,
66+ ),
67+ )
68+
69+ return s .GlobalData .Search (ctx , operations.V3GlobaldataSearchQueryRequest {
70+ SearchQueryInputBody : components.SearchQueryInputBody {
71+ PageSize : censyssdkgo .Int64 (MaxPerPage ),
72+ Query : censysRequest .Query ,
73+ PageToken : & censysRequest .Cursor ,
74+ },
75+ })
76+
6977}
7078
71- func (agent * Agent ) query (URL string , session * sources.Session , censysRequest * CensysRequest , results chan sources.Result ) * CensysResponse {
79+ func (agent * Agent ) query (session * sources.Session , censysRequest * CensysRequest , results chan sources.Result ) * operations. V3GlobaldataSearchQueryResponse {
7280 // query certificates
73- resp , err := agent .queryURL (session , URL , censysRequest )
81+ resp , err := agent .queryURL (session , censysRequest )
7482 if err != nil {
7583 results <- sources.Result {Source : agent .Name (), Error : err }
7684 // httputil.DrainResponseBody(resp)
7785 return nil
7886 }
7987
80- censysResponse := & CensysResponse {}
81- if err := json .NewDecoder (resp .Body ).Decode (censysResponse ); err != nil {
82- results <- sources.Result {Source : agent .Name (), Error : err }
83- return nil
84- }
88+ if result := resp .ResponseEnvelopeSearchQueryResponse .Result ; result != nil {
89+ for _ , censysResult := range result .Hits {
8590
86- for _ , censysResult := range censysResponse .Results .Hits {
87- result := sources.Result {Source : agent .Name ()}
88- if ip , ok := censysResult ["ip" ]; ok {
89- result .IP = ip .(string )
90- }
91- if name , ok := censysResult ["name" ]; ok {
92- result .Host = name .(string )
93- }
94- if services , ok := censysResult ["services" ]; ok {
95- for _ , serviceData := range services .([]interface {}) {
96- if serviceData , ok := serviceData .(map [string ]interface {}); ok {
97- result .Port = int (serviceData ["port" ].(float64 ))
98- raw , _ := json .Marshal (censysResult )
99- result .Raw = raw
100- results <- result
91+ for _ , host := range censysResult .WebpropertyV1 .Resource .Endpoints {
92+ result := sources.Result {Source : agent .Name ()}
93+ if host .IP != nil {
94+ result .IP = * host .IP
95+ }
96+ if host .Hostname != nil {
97+ result .Host = * host .Hostname
10198 }
99+ if host .Port != nil {
100+ result .Port = * host .Port
101+ }
102+ if host .HTTP != nil && host .HTTP .URI != nil {
103+ result .Url = * host .HTTP .URI
104+ }
105+ raw , _ := json .Marshal (host )
106+ result .Raw = raw
107+ results <- result
102108 }
103- } else {
104- raw , _ := json .Marshal (censysResult )
105- result .Raw = raw
106- // only ip
107- results <- result
109+
108110 }
109111 }
110112
111- return censysResponse
113+ return resp
112114}
113115
114116type CensysRequest struct {
0 commit comments