package main import ( "bufio" "encoding/json" "fmt" "net/http" "os" "strings" "sync" ) // Fingerprints struct to hold fingerprint data type Fingerprints struct { Fingerprint string `json:"Fingerprint"` Service string `json:"Service"` Cname []string `json:"Cname"` } func main() { // Okunacak dosya adı filename := "subdomains.txt" // Dosyayı aç file, err := os.Open(filename) if err != nil { fmt.Println("Dosya açılamadı:", err) return } defer file.Close() // Fingerprints map oluştur fingerprints := make(map[string]Fingerprints) // Örnek parmak izini ekle fingerprints["404 - Page Not Found` `Oops… looks like you got lost"] = Fingerprints{ Fingerprint: "404 - Page Not Found` `Oops… looks like you got lost", Service: "Frontify", Cname: []string{}, } var wg sync.WaitGroup scanner := bufio.NewScanner(file) // Satırları oku for scanner.Scan() { subdomain := scanner.Text() wg.Add(1) go func(subdomain string) { defer wg.Done() checkSubdomain(subdomain, fingerprints) }(subdomain) } wg.Wait() } func checkSubdomain(subdomain string, fingerprints map[string]Fingerprints) { // HTTP GET isteği yap resp, err := http.Get("http://" + subdomain) if err != nil { fmt.Printf("%s: Bağlantı hatası\n", subdomain) return } defer resp.Body.Close() // Eğer hedef subdomain'in response kodu 404 ise subdomain takeover zafiyeti olabilir if resp.StatusCode == http.StatusNotFound { bodyText := make([]byte, 512) _, err := resp.Body.Read(bodyText) if err != nil { fmt.Printf("%s: 404 - Subdomain takeover zafiyeti olabilir\n", subdomain) } else { bodyStr := string(bodyText) for _, fp := range fingerprints { if strings.Contains(bodyStr, fp.Fingerprint) { fmt.Printf("%s: 404 - Subdomain takeover zafiyeti olabilir (%s)\n", subdomain, fp.Service) return } } fmt.Printf("%s: 404 - Ancak subdomain takeover zafiyeti olmayabilir\n", subdomain) } } else { fmt.Printf("%s: HTTP status code %d\n", subdomain, resp.StatusCode) } }