
🐩 Attacco Poodle (Padding Oracle On Downgraded Legacy Encryption) CVE-2014-3566 🐩
Una prova di concetto dell'attacco Poodle (Padding Oracle On Downgraded Legacy Encryption) :
un exploit man-in-the-middle che sfrutta il fallback a SSL 3.0 dei client di software Internet e di sicurezza
L'attacco Poodle consente di recuperare i dati cifrati inviati da un client a un server se il Transport Layer Security utilizzato è SSLv3. Non consente di recuperare la chiave privata usata per cifrare la richiesta.

SSLv3 è un protocollo per cifrare/decifrare e proteggere i tuoi dati. Nel nostro caso, utilizza la modalità di cifratura a blocchi CBC. Il plaintext viene diviso in blocchi in base all'algoritmo di cifratura (AES, DES, 3DES) e la lunghezza è un multiplo di 8 o 16. Se il plaintext non riempie la lunghezza, viene aggiunto un padding alla fine per completare lo spazio mancante. Ti consiglio vivamente di aprire queste immagini di cifratura e decifratura per leggere questo readme.
In pratica è solo un semplice XOR, puoi anche guardare questo video (non il mio) https://www.youtube.com/watch?v=0D7OwYp6ZEc.
Una richiesta inviata su HTTPS utilizzando SSLv3 verrà cifrata con AES/DES e la modalità CBC. La particolarità di SSLv3 rispetto a TLS1.x è il padding. In SSLv3 il padding è riempito con byte casuali, tranne l'ultimo byte che è uguale alla lunghezza del padding.
Esempio:
T|E|X|T|0xab|0x10|0x02 dove 0xab|0x10|0x02 è il padding.
T|E|X|T|E|0x5c|0x01 dove 0x5c|0x01 è il padding.
Inoltre l'ultimo blocco può essere riempito con un blocco intero di padding, il che significa che l'ultimo blocco può essere pieno di byte casuali, tranne l'ultimo byte.
T|E|X|T|E|0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 dove |0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 è il padding; solo il 0x07 è noto all'attaccante. Quindi se un attaccante è in grado di influenzare il blocco di padding, potrà sapere che l'ultimo byte dell'ultimo blocco è uguale alla lunghezza di un blocco.
Un attaccante deve essere in grado di far inviare richieste alla vittima (usando javascript, ad esempio sfruttando una XSS). Poi può controllare il percorso (path) e i dati di ogni richiesta:
Esempio: aggiungendo un byte "A" al percorso della richiesta GET / HTTP/1.1\r\nSECRET COOKIE\r\n\r\n GET /AAA HTTP/1.1\r\nSECRET COOKIE\r\n\r\nDATA
Con questa tecnica può influenzare il padding.
SSLv3 usa anche HMAC per verificare l'integrità e autenticare il plaintext.
keyed-hash message authentication code (HMAC) è un tipo specifico di message authentication code (MAC) che coinvolge una funzione di hash crittografica (da qui la 'H') in combinazione con una chiave crittografica segreta
Con questo, un attaccante non può intercettare e alterare la richiesta per poi rinviarla. Se il server incontra un problema, invierà un errore HMAC.
Il protocollo SSLv3 usa la seguente routine: riceve i dati dal client, decifra i dati, verifica l'integrità con l'HMAC.
MAC-then-Encrypt: Non fornisce alcuna integrità sul ciphertext, poiché non abbiamo modo di sapere, finché non decifriamo il messaggio, se era effettivamente autentico o spoofato. Integrità del plaintext. Se lo schema di cifratura è malleabile, potrebbe essere possibile alterare il messaggio per farlo sembrare valido e avere un MAC valido. Questo è un punto teorico, ovviamente, poiché in pratica il segreto del MAC dovrebbe fornire protezione. Qui, il MAC non può fornire alcuna informazione sul plaintext, poiché anche questo è cifrato.
https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac
Questo significa che possiamo alterare il testo cifrato senza che il server lo sappia. È fantastico, davvero :)
Prima di tutto, l'ultimo blocco deve essere pieno di padding; come visto in precedenza, l'attaccante usa il percorso della richiesta e controlla la lunghezza della richiesta.
Poiché l'ultimo blocco, tranne l'ultimo byte, è pieno di byte casuali, può sostituire quest'ultimo blocco Cn con il blocco che vuole decifrare Ci. La richiesta alterata viene inviata al server.
Il server:
Sostituendo l'ultimo blocco, l'attaccante cambia anche l'ultimo byte dell'ultimo blocco (la lunghezza del padding). C'è 1/256 di probabilità che l'ultimo byte sostituito nel blocco di padding sia lo stesso dell'originale; in questo caso non ci sarà alcun errore di padding e l'attaccante può usare questa operazione XOR per recuperare l'ultimo byte del blocco Ci seguendo questa operazione:
Pn = Dk(Cn) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
xxxxxxx7 = Dk(Ci) ⊕ Cn-1
Dk(Ci) = xxxxxxx7 ⊕ Cn-1
Pi ⊕ Ci-1 = xxxxxxx7 ⊕ Cn-1
Pi = Ci-1 ⊕ xxxxxxx7 ⊕ Cn-1
(xxxxxxx7 o xxxxxxx15, dove x è un byte casuale)
L'ultimo byte del blocco può essere recuperato: Pi[7] = Ci-1[7] ⊕ xxxxxxx7 ⊕ Cn-1[7] In caso di errore di padding, l'attaccante deve chiudere la sessione SSL per effettuare un'altra handshake (nuova chiave AES) e ottenere un nuovo cipher, quindi sostituire l'ultimo blocco, ecc. (in genere sono necessarie +300 handshake)
Una volta recuperato un byte, otterrà tutti gli altri byte del blocco aggiungendo un byte nel percorso e rimuovendo un byte dai dati:
| Richiesta per recuperare i byte E,I,K,O |
|---|
| GET /a SECRET_COOKIE dataazerty PADDING_7 |
| GET /aa SECRET_COOKIE dataazert PADDING_7 |
| GET /aaa SECRET_COOKIE dataazer PADDING_7 |
| GET /aaaa SECRET_COOKIE dataaze PADDING_7 |
Anche se le specifiche TLS richiedono che i server controllino il padding, alcune implementazioni non lo validano correttamente, il che rende alcuni server vulnerabili a POODLE anche se disabilitano SSL 3.0
TLS è normalmente sicuro contro Poodle, ma alcune implementazioni non controllano il padding; è come se si usasse SSLv3, ed è per questo che alcune versioni di TLS sono vulnerabili.
Ci sono tre file in questo repository:
Questa PoC esplora la crittografia dietro l'attacco. Questo file ci permette di capire in modo semplice come funziona l'attacco.
python3 poodle-poc.py
Il file parallelization-poodle.py è un progetto, un'idea :) controlla https://github.com/mpgn/poodle-PoC/issues/1
python3 parallelization-poodle.py
Questo è il vero exploit. Molto utile se vuoi fare una prova di concetto sull'attacco Poodle per un cliente durante un pentest, se usa server e browser vecchi. Basta inserire l'IP del tuo proxy malintenzionato nella configurazione del browser con la porta corretta, il proxy si occuperà del resto.
Requisiti:
security.tls.version.min: 0. In alternativa, se il client usa anche TLS, puoi forzare il downgrade
💀 Se hai questi prerequisiti puoi iniziare l'attacco 💀:
Due opzioni sono disponibili per questo exploit:
$> echo 1 > /proc/sys/net/ipv4/ip_forward
$> iptables -i vmnet1 -t nat -A PREROUTING -p tcp --dport 1337 -j REDIRECT --to-ports 1337
arpspoof, ettercap o bettercap per eseguire un attacco ARP spoofing$> bettercap -iface vmnet1
net.show
set arp.spoof.internal true
arp.spoof on
⋊> ~/T/poodle-Poc on master ⨯ python3 poodle-exploit.py -h 13:10:24
usage: poodle-exploit.py [-h] [--start-block START_BLOCK]
[--stop-block STOP_BLOCK] [--simpleProxy SIMPLEPROXY]
proxy port server rport
Poodle Exploit by @mpgn_x64
positional arguments:
proxy ip of the proxy
port port of the proxy
server ip of the remote server
rport port of the remote server
optional arguments:
-h, --help show this help message and exit
--start-block START_BLOCK
start the attack at this block
--stop-block STOP_BLOCK
stop the attack at this block
--simpleProxy SIMPLEPROXY
Direct proxy, no ARP spoofing attack
$> python3 poodle-exploit.py 192.168.13.1 4443 192.168.13.133 443 --start-block 46 --stop-block 50
Scegliere un blocco: se non specifichi l'opzione del blocco, tutti i blocchi verranno decifrati, ma può richiedere molto tempo. Ti consiglio vivamente di 'sapere' come sarà formattata la richiesta e di usare lo script request-splitter.py per conoscere il blocco che vuoi decifrare (idealmente il blocco del cookie! :)
Poi inserisci il codice javascript dannoso (poodle.js) nel sito web vulnerabile usando, ad esempio, una XSS. Avvia lo script python e digita help, poi search e infine active. Durante questo periodo, saranno necessarie solo due interazioni con il javascript (i comandi search e active).
Aggiornamento 01/04/2018: è stata aggiunta l'opzione di downgrade all'exploit. Quando l'exploit rileva il protocollo TLS, inserisci il comando downgrade per effettuare il downgrade a SSLv3.0.
Come funziona? durante l'handshake (dopo l'hello client), l'exploit invia una handshake_failure 15030000020228, poi il browser dovrebbe rinviare un hello client con SSLv3.0 come protocollo predefinito. Testato su Chrome versione 15 ma non funziona su Firefox (penso che non supporti la rinegoziazione del protocollo), vedi #4
Video completo dell'exploit:

Asciinema:
| Cifratura | Decifratura |
|---|
| Ci = Ek(Pi ⊕ Ci-1), e C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, e C0 = IV |