Updated Readme to reflect new branding
This commit is contained in:
@@ -166,7 +166,11 @@ func (dcv2 *DehashedClientV2) Search(searchRequest DehashedSearchRequest) (int,
|
||||
zap.String("message", "preparing search request"),
|
||||
)
|
||||
}
|
||||
reqBody, _ := json.Marshal(searchRequest)
|
||||
|
||||
// Create a copy of the search request to avoid modifying the original
|
||||
requestCopy := searchRequest
|
||||
|
||||
reqBody, _ := json.Marshal(requestCopy)
|
||||
|
||||
if dcv2.debug {
|
||||
j := string(reqBody)
|
||||
|
||||
@@ -3,11 +3,12 @@ package dehashed
|
||||
import (
|
||||
"crowsnest/internal/debug"
|
||||
"crowsnest/internal/export"
|
||||
"crowsnest/internal/pretty"
|
||||
"crowsnest/internal/sqlite"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go.uber.org/zap"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Dehasher is a struct for querying the Dehashed API
|
||||
@@ -208,12 +209,10 @@ func (dh *Dehasher) buildRequest() {
|
||||
|
||||
// parseResults parses the results and writes them to a file
|
||||
func (dh *Dehasher) parseResults() {
|
||||
var data []byte
|
||||
|
||||
zap.L().Info("extracting_credentials")
|
||||
results := dh.client.GetResults()
|
||||
creds := results.ExtractCredentials()
|
||||
fmt.Printf("\n\t[+] Discovered %d Credentials", len(creds))
|
||||
fmt.Printf(" [+] Discovered %d Credentials\n", len(creds))
|
||||
err := sqlite.StoreDehashedCreds(creds)
|
||||
if err != nil {
|
||||
zap.L().Error("store_creds",
|
||||
@@ -234,28 +233,93 @@ func (dh *Dehasher) parseResults() {
|
||||
zap.L().Info("results_stored", zap.Int("count", len(results.Results)))
|
||||
|
||||
if len(results.Results) > 0 {
|
||||
fmt.Printf("\n\t[*] Writing entries to file: %s.%s", dh.options.OutputFile, dh.options.OutputFormat.String())
|
||||
var (
|
||||
headers = []string{"Email", "Username", "Password"}
|
||||
rows [][]string
|
||||
)
|
||||
|
||||
fmt.Printf(" [*] Writing entries to file: %s.%s\n", dh.options.OutputFile, dh.options.OutputFormat.String())
|
||||
if !dh.options.CredsOnly {
|
||||
err := export.WriteToFile(results, dh.options.OutputFile, dh.options.OutputFormat)
|
||||
if err != nil {
|
||||
fmt.Printf("\n[!] Error Writing to file: %v\n\tOutputting to terminal.", err)
|
||||
data, err = json.MarshalIndent(results, "", " ")
|
||||
fmt.Println(string(data))
|
||||
os.Exit(0)
|
||||
fmt.Printf("[!] Error Writing to file: %v Outputting to terminal.\n", err)
|
||||
zap.L().Error("write_results",
|
||||
zap.String("message", "failed to write results to file"),
|
||||
zap.Error(err),
|
||||
)
|
||||
} else {
|
||||
fmt.Println("\n\t\t[*] Success\n")
|
||||
fmt.Println(" [*] Success")
|
||||
}
|
||||
|
||||
if dh.debug {
|
||||
debug.PrintInfo("printing results table")
|
||||
}
|
||||
|
||||
headers = []string{"Name", "Email", "Username", "Password", "Address", "Phone", "Social", "Crypto Address", "Company"}
|
||||
if len(results.Results) > 50 {
|
||||
fmt.Println(" [-] Large number of results recovered, displaying first 50...")
|
||||
for i := 0; i < 50; i++ {
|
||||
r := results.Results[i]
|
||||
rows = append(rows, []string{
|
||||
strings.Join(r.Name, ", "), strings.Join(r.Email, ", "),
|
||||
strings.Join(r.Username, ", "), strings.Join(r.Password, ", "),
|
||||
strings.Join(r.Address, ", "), strings.Join(r.Phone, ", "),
|
||||
strings.Join(r.Social, ", "), strings.Join(r.CryptoCurrencyAddress, ", "),
|
||||
strings.Join(r.Company, ", ")})
|
||||
}
|
||||
} else {
|
||||
for _, r := range results.Results {
|
||||
rows = append(rows, []string{
|
||||
strings.Join(r.Name, ", "), strings.Join(r.Email, ", "),
|
||||
strings.Join(r.Username, ", "), strings.Join(r.Password, ", "),
|
||||
strings.Join(r.Address, ", "), strings.Join(r.Phone, ", "),
|
||||
strings.Join(r.Social, ", "), strings.Join(r.CryptoCurrencyAddress, ", "),
|
||||
strings.Join(r.Company, ", ")})
|
||||
}
|
||||
}
|
||||
|
||||
// Print Table
|
||||
pretty.Table(headers, rows)
|
||||
} else {
|
||||
if dh.debug {
|
||||
debug.PrintInfo("extracting credentials")
|
||||
}
|
||||
creds := results.ExtractCredentials()
|
||||
if dh.debug {
|
||||
debug.PrintInfo("writing credentials to file")
|
||||
}
|
||||
err := export.WriteCredsToFile(creds, dh.options.OutputFile, dh.options.OutputFormat)
|
||||
if err != nil {
|
||||
fmt.Printf("\n[!] Error Writing to file: %v\n\tOutputting to terminal.", err)
|
||||
data, err = json.MarshalIndent(creds, "", " ")
|
||||
fmt.Println(string(data))
|
||||
os.Exit(0)
|
||||
fmt.Printf("[!] Error Writing to file: %v\n Outputting to terminal.", err)
|
||||
zap.L().Error("write_creds",
|
||||
zap.String("message", "failed to write creds to file"),
|
||||
zap.Error(err),
|
||||
)
|
||||
} else {
|
||||
fmt.Println("\n\t\t[*] Success\n")
|
||||
fmt.Println(" [*] Success")
|
||||
}
|
||||
|
||||
if dh.debug {
|
||||
debug.PrintInfo("printing credentials table")
|
||||
}
|
||||
|
||||
headers = []string{"Email", "Username", "Password"}
|
||||
if len(creds) > 50 {
|
||||
fmt.Println(" [-] Large number of results recovered, displaying first 50...")
|
||||
for i := 0; i < 50; i++ {
|
||||
c := creds[i]
|
||||
rows = append(rows, []string{c.Email, c.Username, c.Password})
|
||||
}
|
||||
} else {
|
||||
for _, c := range creds {
|
||||
rows = append(rows, []string{c.Email, c.Username, c.Password})
|
||||
}
|
||||
}
|
||||
|
||||
// Print Table
|
||||
pretty.Table(headers, rows)
|
||||
}
|
||||
} else {
|
||||
fmt.Println(" [-] No results found")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -628,3 +628,20 @@ func StoreWhoisLookup(lookup []LookupResult) error {
|
||||
|
||||
return lastErr
|
||||
}
|
||||
|
||||
// ReverseWhoisResponse represents the response from a reverse WHOIS lookup
|
||||
type ReverseWhoisResponse struct {
|
||||
RemainingCredits int `json:"remaining_credits"`
|
||||
Data ReverseWhoisData `json:"data"`
|
||||
}
|
||||
|
||||
// ReverseWhoisData contains the domain count and list from a reverse WHOIS lookup
|
||||
type ReverseWhoisData struct {
|
||||
DomainsCount int `json:"domainsCount"`
|
||||
DomainsList []string `json:"domainsList"`
|
||||
NextPageSearchAfter *string `json:"nextPageSearchAfter"`
|
||||
}
|
||||
|
||||
func (rwd ReverseWhoisData) String() string {
|
||||
return fmt.Sprintf("Domains Count: %d\nDomains List: %v\nNext Page Search After: %v\n", rwd.DomainsCount, rwd.DomainsList, rwd.NextPageSearchAfter)
|
||||
}
|
||||
|
||||
+32
-7
@@ -298,7 +298,9 @@ func (w *DehashedWhoIs) WhoisHistory(domain string) ([]sqlite.HistoryRecord, err
|
||||
return whois.Data.Records, nil
|
||||
}
|
||||
|
||||
func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverseType string) (string, error) {
|
||||
func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverseType string) (sqlite.ReverseWhoisData, error) {
|
||||
var whois sqlite.ReverseWhoisData
|
||||
|
||||
if w.debug {
|
||||
debug.PrintInfo("performing reverse whois search")
|
||||
zap.L().Info("reverse_whois_debug",
|
||||
@@ -329,7 +331,7 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
zap.String("message", "failed to create request"),
|
||||
zap.Error(err),
|
||||
)
|
||||
return "", err
|
||||
return whois, err
|
||||
}
|
||||
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
@@ -356,7 +358,7 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
zap.String("message", "failed to perform request"),
|
||||
zap.Error(err),
|
||||
)
|
||||
return "", err
|
||||
return whois, err
|
||||
}
|
||||
if res == nil {
|
||||
if w.debug {
|
||||
@@ -365,7 +367,7 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
zap.L().Error("reverse_whois",
|
||||
zap.String("message", "response was nil"),
|
||||
)
|
||||
return "", errors.New("response was nil")
|
||||
return whois, errors.New("response was nil")
|
||||
}
|
||||
|
||||
b, err := io.ReadAll(res.Body)
|
||||
@@ -378,7 +380,7 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
zap.String("message", "failed to read response body"),
|
||||
zap.Error(err),
|
||||
)
|
||||
return "", err
|
||||
return whois, err
|
||||
}
|
||||
|
||||
// Check for HTTP status code errors
|
||||
@@ -396,7 +398,7 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
zap.String("error", dhErr.Error()),
|
||||
zap.String("body_error", string(b)),
|
||||
)
|
||||
return "", &dhErr
|
||||
return whois, &dhErr
|
||||
}
|
||||
|
||||
if w.debug {
|
||||
@@ -404,7 +406,30 @@ func (w *DehashedWhoIs) ReverseWHOIS(include []string, exclude []string, reverse
|
||||
debug.PrintJson(fmt.Sprintf("Body: %s\n", string(b[:])))
|
||||
}
|
||||
|
||||
return string(b), nil
|
||||
var whoisResponse sqlite.ReverseWhoisResponse
|
||||
err = json.Unmarshal(b, &whoisResponse)
|
||||
if err != nil {
|
||||
if w.debug {
|
||||
debug.PrintInfo("failed to unmarshal response body")
|
||||
debug.PrintError(err)
|
||||
}
|
||||
zap.L().Error("reverse_whois",
|
||||
zap.String("message", "failed to unmarshal response body"),
|
||||
zap.Error(err),
|
||||
)
|
||||
return whois, err
|
||||
}
|
||||
|
||||
if w.debug {
|
||||
debug.PrintInfo("unmarshalled response body")
|
||||
debug.PrintJson(fmt.Sprintf("Remaining Credits: %d\n", whoisResponse.RemainingCredits))
|
||||
debug.PrintJson(fmt.Sprintf("Data: %v\n", whoisResponse.Data))
|
||||
}
|
||||
w.balance = whoisResponse.RemainingCredits
|
||||
|
||||
whois = whoisResponse.Data
|
||||
|
||||
return whois, nil
|
||||
}
|
||||
|
||||
func (w *DehashedWhoIs) WhoisIP(ipAddress string) ([]sqlite.LookupResult, error) {
|
||||
|
||||
Reference in New Issue
Block a user