Verificare se un sottodominio può essere preso in possesso perché ha:
un CNAME pendente che punta a un provider CMS (Heroku, Github, Shopify, Amazon S3, Amazon CloudFront, ecc.) che può essere preso in possesso.
un CNAME pendente che punta a un nome di dominio inesistente
uno o più record NS errati/digitati male che puntano a un nameserver che può essere preso in possesso da un attaccante per ottenere il controllo dei record DNS del sottodominio
Prendere effettivamente possesso di quei sottodomini fornendo un flag -takeover. Attualmente, il takeover è supportato solo per Github Pages e Heroku Apps e di default la funzionalità di takeover è disattivata.
Specificare i propri provider CMS e verificarli tramite il file providers-data.csv. In quel file, inserirai il nome del CMS, il suo valore CNAME, la stringa che vuoi cercare e se funziona solo su HTTP o meno. Dai un'occhiata per alcuni esempi.
Avvertenza: NON ESSERE UN IDIOTA!
Inutile dirlo, per favore usa questo strumento con molta attenzione. Gli autori non saranno responsabili per eventuali conseguenze.
Di default, questo strumento non permette il takeover dei sottodomini. Se vuoi farlo, specifica il flag -takeover.
Prerequisiti
È necessario avere GO installato. Una volta che hai GO, digita per scaricare lo strumento.
go get github.com/anshumanbh/tko-subs
Una volta scaricato lo strumento, digita tko-subs -h.
La prossima cosa da fare è ottenere le seguenti informazioni:
Token di accesso personale di Github - Assicurati che questo token abbia i diritti per creare repository, riferimenti, contenuti, ecc. Puoi creare questo token qui - https://github.com/settings/tokens
Nome utente e chiave API di Heroku
Nome dell'app Heroku - Puoi creare un'app statica su Heroku con ciò che vuoi venga visualizzato nella sua homepage seguendo le istruzioni qui - https://gist.github.com/wh1tney/2ad13aa5fbdd83f6a489. Una volta creata l'app, usa quel nome dell'app nel flag (vedi sotto). Useremo quell'app per prendere possesso del dominio (con il CNAME pendente verso un'altra app Heroku).
NOTA - Hai bisogno di questi valori solo se vuoi prendere possesso dei sottodomini. Di default, non sono richiesti.
Pacchetti Go richiesti per compilare.
root@kitploit:~
go get github.com/bgentry/heroku-go
go get github.com/gocarina/gocsv
go get github.com/google/go-github/github
go get github.com/olekukonko/tablewriter
go get golang.org/x/net/publicsuffix
go get golang.org/x/oauth2
go get github.com/miekg/dns
Come eseguire?
Una volta che hai tutto installato, cd nella directory e digita:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv
Se vuoi anche prendere possesso, il comando sarebbe:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv -takeover -githubtoken=<github-token> -herokuusername=<heroku-username> -herokuapikey=<heroku-api-key> -herokuappname=<heroku-app-name>
Se vuoi solo controllare un singolo dominio, digita:
tko-subs -domain <nome-dominio>
Se vuoi controllare più domini, digita:
tko-subs -domain <nome-dominio-1>,<nome-dominio-2>
Di default:
il flag domains è impostato su domains.txt
il flag data è impostato su providers-data.csv
il flag output è impostato su output.csv
il flag takeover non è impostato, quindi nessun takeover di default
il flag domain NON è impostato, quindi controllerà sempre tutti i domini menzionati nel file domains.txt. Se il flag domain è menzionato, controllerà solo quel dominio e ignorerà il file domains.txt, anche se presente.
il flag threads è impostato su 5
Quindi, eseguire semplicemente tko-subs funzionerà con i valori predefiniti sopra menzionati.
Com'è formattato providers-data.csv?
name,cname,string,http
name: Il nome del provider (es. github)
cname: Il CNAME usato per mappare un sito web al contenuto del provider (es. github.io)
string: Il messaggio di errore restituito per un sottodominio non rivendicato (es. "There isn't a GitHub Pages site here")
http: Se usare http (non https, che è il default) per connettersi al sito (true/false)
Provider: Il provider che il dominio è risultato utilizzare
IsVulnerable: Se il dominio è risultato vulnerabile o no (true/false)
IsTakenOver: Se il dominio è stato preso in possesso o no (true/false)
Response: Il messaggio contro cui è stato controllato il sottodominio
Se viene trovato un record DNS morto, Provider viene lasciato vuoto.
Se viene trovato un nameserver malfunzionante, Provider e CNAME vengono lasciati vuoti.
Cosa succede sotto il cofano?
Questo itererà su tutti i domini (concorrentemente usando GoRoutines) nel file subdomains.txt e:
Verifica se hanno un nameserver autoritativo malfunzionante; se sì, contrassegna quel dominio come vulnerabile.
Verifica se hanno record CNAME pendenti (record DNS morti); se sì, contrassegna quel dominio come vulnerabile.
Se un sottodominio supera questi due test, prova a fare curl e ottenere una risposta e poi cerca di vedere se quella risposta corrisponde a una qualsiasi delle stringhe dei provider dati menzionate nel file providers-data.csv.
Se la risposta corrisponde, contrassegna quel dominio come vulnerabile.
Successivamente, a seconda se il flag takeover è menzionato o no, proverà a prendere possesso di quel sottodominio vulnerabile.
Ad esempio, per prendere possesso di una Github Page, il codice:
Crea un repo
Crea un ramo gh-pages in quel repo
Carica CNAME e index.html nel ramo gh-pages di quel repo. Qui, CNAME contiene il dominio che deve essere preso in possesso. index.html contiene il testo This domain is temporarily suspended che verrà visualizzato una volta preso possesso del dominio.
Similmente, per le app Heroku, il codice:
Aggiunge il dominio pendente alla tua app Heroku (di cui fornirai il nome nel file .env)
E, questo è tutto!
Lavori Futuri
Prendere il nome del CMS e l'espressione regolare dall'utente o dal file .env e poi agganciarli automaticamente allo strumento per essere in grado di trovarli. FATTO
Aggiungere takeover per più CMS
Aggiungere più provider CMS
Crediti
Grazie a Luke Young (@TheBoredEng) per avermi aiutato con la libreria go-github.
Grazie a Frans Rosen (@fransrosen) per avermi aiutato a capire i dettagli tecnici necessari per alcuni dei takeover.
Grazie a Mohammed Diaa (@mhmdiaa) per aver dedicato del tempo per implementare la funzionalità dei dati dei provider e far funzionare il codice.
Grazie a high-stakes per un rinfresco di codice tanto necessario.
Changelog
5/27
Aggiunto nuovo Dockerfile riducendo le dimensioni dell'immagine
Aggiunto file domains.txt di esempio per testare
mhmdiaa ha aggiunto la logica per i takeover di DNS morti. Documentazione aggiornata. Grazie mille!
11/6
high-stakes ha inviato una PR con un mucchio di nuovo codice che corregge alcuni bug e rende il codice più pulito
9/22
Aggiunto un flag opzionale per controllare un singolo dominio
Reso più semplice da installare ed eseguire
6/25
Reso il codice molto più veloce implementando goroutine
Invece di controllare usando la funzione LookupCNAME dei pacchetti net di Golang, fatto in modo da usare solo dig poiché fornisce anche record DNS morti. Più superficie di attacco!!