Add recon network batch 1: stack banners and smart port profiles.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

Parse technology stack from crawl headers, grab SSH/HTTP/WinRM banners, merge smart port bundles with FleetPorts, and suggest deploy-kit lane plus SSM for EC2 metadata targets.
This commit is contained in:
AetherForge
2026-06-07 12:04:04 -07:00
parent 6122c3ebfc
commit 11c15cdcfb
21 changed files with 3314 additions and 51 deletions

View File

@@ -25,6 +25,8 @@ func Crawl(host string, port int, scheme string, seedPaths []string) (*CrawlRepo
}
report := &CrawlReport{}
var headerSnaps []HTTPHeaderSnap
var htmlBodies []string
visited := map[string]bool{}
queue := []queuedURL{}
for _, p := range seeds {
@@ -44,7 +46,7 @@ func Crawl(host string, port int, scheme string, seedPaths []string) (*CrawlRepo
}
visited[key] = true
status, body, err := fetchPage(item.url)
status, body, headers, err := fetchPage(item.url)
if err != nil {
continue
}
@@ -54,6 +56,8 @@ func Crawl(host string, port int, scheme string, seedPaths []string) (*CrawlRepo
title = root
}
report.Pages = append(report.Pages, PageFinding{URL: item.url, StatusCode: status, Title: title})
if len(headers) > 0 { headerSnaps = append(headerSnaps, HTTPHeaderSnap{URL: item.url, Headers: headers}) }
htmlBodies = append(htmlBodies, body)
files, multi, fields, pageScore, cms := ParseHTML(item.url, body)
report.FileInputs = append(report.FileInputs, files...)
@@ -84,6 +88,7 @@ func Crawl(host string, port int, scheme string, seedPaths []string) (*CrawlRepo
report.SSRFScore = 100
}
report.CMSFingerprints = mergeCMS(nil, report.CMSFingerprints)
report.Stack = BuildStack(headerSnaps, htmlBodies)
return report, nil
}
@@ -92,26 +97,28 @@ type queuedURL struct {
depth int
}
func fetchPage(rawURL string) (int, string, error) {
func fetchPage(rawURL string) (int, string, map[string]string, error) {
if fetchPageFn != nil {
return fetchPageFn(rawURL)
s,b,e:=fetchPageFn(rawURL); return s,b,nil,e
}
client := &http.Client{Timeout: DefaultPortDialTimeout}
req, err := http.NewRequest(http.MethodGet, rawURL, nil)
if err != nil {
return 0, "", err
return 0, "", nil, err
}
req.Header.Set("User-Agent", "AetherForge-Recon/1.0")
resp, err := client.Do(req)
if err != nil {
return 0, "", err
return 0, "", nil, err
}
defer resp.Body.Close()
body, err := readBodyLimited(resp.Body, maxHTMLBytes)
if err != nil {
return resp.StatusCode, "", err
return resp.StatusCode, "", nil, err
}
return resp.StatusCode, body, nil
headers:=map[string]string{}
for k,v:=range resp.Header { if len(v)>0 { headers[k]=v[0] } }
return resp.StatusCode, body, headers, nil
}
func normalizeScheme(scheme string, port int) string {