ALLERTA PERICOLI INFORMATICI

Zerologon: hacking dei server Windows con un mucchio di zeri

Zerologon: hacking dei server Windows con un mucchio di zeri
Scritto da gestore

Il bug della settimana si chiama Zerologon ed รจ un by-pass di autenticazione.

Lo vedrai anche indicato come CVE-2020-1472 e la buona notizia รจ che รจ stato correttoย nell’aggiornamentoย diย agosto 2020 diย Microsoftย .

Intermezzo promozionale ... continua la lettura dopo il box:

In altre parole, se pratichi il corretto patching, non devi andare nel panico.ย (Sรฌ, questo รจ un indizio non mascherato: se non hai ancora patchato i tuoi server Windows dall’agosto 2020, per favore fallo ora, per il bene di tutti, non solo per il tuo.)

Tuttavia, Zerologon รจ una storia affascinante che ricorda a tutti noi due lezioni molto importanti, ovvero che:

La crittografia รจ difficile da ottenere correttamente.
Gli errori crittografici possono richiedere anni per essere individuati.
I dettagli cruenti del bug non sono stati divulgati da Microsoft nell’agosto 2020, ma i ricercatori della societร  olandese di sicurezza informatica Secura hanno scavato nel componente Windows interessato, Netlogon, e hanno individuato una serie di graviย buchi crittograficiย nella versione senza patch e come farlo sfruttarli.

In questo articolo, non costruiremo un attacco o mostreremo come creare pacchetti di rete per sfruttare il difetto, ma esamineremo i problemi crittografici che sono rimasti inosservati nel protocollo Microsoft Netlogon Remote per molti anni.

Dopo tutto, coloro che non ricordano la storia sono condannati a ripeterla.

Autenticazione tramite Netlogon
Netlogon รจ un protocollo di rete che, nelle sue stesse parole, “รจ un’interfaccia di chiamata di procedura remota (RPC) utilizzata per l’autenticazione di utenti e macchine su reti basate su dominio”.

A 280 pagine, laย specifica del protocollo remoto Netlogonย – รจ una specifica aperta al giorno d’oggi, non proprietaria di Microsoft – รจ molto piรน breve del Bluetooth, ma molto piรน lunga di quanto qualsiasi team di programmazione possa sopportare per un periodo di mesi o anni, figuriamoci giorni o settimane.

La sua lunghezza deriva in parte dal fatto che ci sono spesso molti modi diversi di fare la stessa cosa, a volte con piรน algoritmi di fallback diversi che sono stati mantenuti per garantire la retrocompatibilitร  con i dispositivi piรน vecchi.

Ironia della sorte, forse, la sezione 5,ย Considerazioni sulla sicurezzaย , ha solo due brevi parti: una sottosezione di una pagina intitolataย Considerazioni sulla sicurezza per gli implementatoriย e una breve tabella (sebbene certamente utile) chiamataย Indice dei parametri di sicurezzaย che si collega a varie sezioni importanti nelle specifiche. .

Elenco dei parametri di sicurezza del protocollo Netlogon.
Gli elementi evidenziati sono quelli che esaminiamo in questo articolo.
Iniziare con Netlogon
Un computer client che desidera comunicare con un server Netlogon come un controller di dominio Windows inizia inviando otto byte casuali (ciรฒ che viene spesso chiamatoย nonceย , abbreviazione diย numero utilizzato una voltaย ) al server.

Il server risponde con 8 byte casuali, come spiegato nella sezione 3.1.4.1,ย Negoziazione chiave di sessioneย :

RICHIESTA -> ClientChallenge (8 byte casuali, ad esempio 452fdbfd2e38b9e0) ->
REPLY <- ServerChallenge (8 byte casuali, ad esempio 7696398fe5417372) <-
Come mostrato sopra, Microsoft si riferisce a queste nonce rispettivamente comeย ClientChallenge(CC) eย ServerChallenge(SC), se si desidera abbinare questa discussione alla documentazione del protocollo.

Entrambe le parti poi mescolano le due stringhe casuali insieme a un segreto condiviso per inventare una chiave di crittografia una tantum, nota comeย SessionKey(SK).

Su una rete Windows, il componente segreto รจ la password di dominio del computer da cui ti connetti.

Sul client, questo viene archiviato in modo sicuro da Windows nel registro;ย sul controller di dominio, รจ archiviato nel database di Active Directory.

Questoย SessionKeyrimescolamento viene eseguito utilizzando l’hash crittografico con chiave chiamatoย HMAC-SHA256ย .

L’algoritmo รจ specificato nella sezione 3.1.4.3.1,ย AES Session-Keyย , e nello pseudocodice ha questo aspetto:

Supponendo che il client che richiede l’accesso abbia la stessa password memorizzata localmente come il server Netlogon ha registrato centralmente e dato che ogni parte ha giร  detto all’altro la sua sfida casuale di 8 byte, entrambe le parti dovrebbero ora essere arrivate allo stesso, uno- offย SessionKeyvalue (SK) per proteggere il resto della loro comunicazione.

Questa configurazione della chiave di sessione evita di utilizzare la password segreta direttamente nella crittografia del traffico Netlogon e garantisce una chiave univoca per ogni sessione, in cui entrambe le parti iniettano la propria casualitร .ย (Questo รจ un approccio comune: la configurazione di una connessione wireless WPA-2 utilizzando una chiave precondivisa segue unย processo simileย .)

In teoria, il server potrebbe presumere ciecamente che il client conosca la vera password semplicemente accettando immediatamente chiamate di funzioni crittografate;ย se il client avesse imbrogliato finora utilizzando una password inventata, le richieste non sarebbero state decriptate correttamente e lo stratagemma fallirebbe.

La buona pratica, tuttavia, dice che ciascuna estremitร  deve verificare prima l’altra, ad esempio crittografando una stringa di test nota che l’altra estremitร  puรฒ convalidare, e questo รจ ciรฒ che accade dopo.

Ovviamente, il client non puรฒ condividere direttamente la chiave di sessione perchรฉ ciรฒ consentirebbe a chiunque altro sulla rete di rilevarla e dirottare la sessione.

Invece, il client dimostra di conoscere la chiave di sessione crittografando la chiave aย ClientChallengecui si รจ impegnato all’inizio, utilizzando laย chiaveย SessionKeyappena calcolata.

Microsoft chiama questoย calcolo delle credenziali di accessoย allaย reteย , descritto in dettaglio nella sezione 3.1.4.4.1:

All’altra estremitร , il server fa la stessa cosa al contrario e verifica che l’originaleย ClientChallengeesca correttamente quando il testo cifrato viene decrittografato con la chiave di sessione.

A questo punto, sembra che un cliente impostore sia bloccato.

Senza la password segreta corretta, che puoi ottenere solo disponendo giร  dell’accesso a livello di amministratore a un computer attendibile sulla rete, non otterrai la stessa chiave di sessione del server.

Senza la chiave di sessione corretta, non si produrrร  una versione crittografata della stringa casuale di 8 byte originale che il server accetterร  per l’autenticazione.

Uno spiraglio nell’armatura
A questo punto, se sei interessato alla crittografia, probabilmente ti starai chiedendo: “Che diavolo รจ l’algoritmo di crittografia soprannominatoย AES-128-CFB8nello pseudocodice sopra?”

Investighiamo.

AES, abbreviazione diย Advanced Encryption Standard,ย sembra una buona scelta perchรฉ รจ attualmente accettato come un algoritmo potente senza falle di sicurezza note.

Inoltre, una chiave da 128 bit รจ attualmente considerato soddisfacente perchรฉ ci vorrebbe troppo tempo per provare tutte le possibili 2ย 128ย chiavi, anche se sfruttata tutta la potenza di calcolo del mondo per te.

Per la cronaca: AES non utilizza calcoli interni che potrebbero essere accelerati con i cosiddettiย algoritmi quantisticiย , quindi รจ consideratoย sicuro post-quantisticoย .ย Anche se un computer quantistico veramente potente venisse costruito domani, non sarebbe di alcun uso speciale, per quanto ne sappiamo, per crackare AES piรน velocemente di quanto possiamo fare con i normali computer oggi.

Ma algoritmi come AES possono essere utilizzati in molte modalitร  diverse e non tutti sono adatti a tutti gli scopi.

La modalitร  piรน nota, che si puรฒ pensare come “crittografia diretta”, รจ chiamataย AES-128-ECB, e codifica 16 byte di input alla volta, producendo direttamente 16 byte di output.

Si noti che abbiamo semplificato questi diagrammi fingendo che AES-128 funzioni su 4 byte (32 bit) alla volta invece che su 16 byte (128 bit), ma i principi sottostanti sono ancora perfettamente chiari:

 

ECB sta perย Electronic Code Bookย , perchรฉ il cifrario in questa modalitร  funziona davvero come un codebook di dimensioni inimmaginabili.

Il moniker del codebook รจ del tutto teorico.ย In pratica, avresti bisogno di un codebook diverso per ognuna delle 2ย 128ย chiavi diverse, con ogni libro che elenca tutti i valori di crittografia per ciascuna delle 2ย 128ย diverse stringhe di input di 16 byte.ย E avresti bisogno di altri 2ย 128ย (ovvero 300 milioni di milioni di milioni di milioni di milioni) di codebook per elencare anche tutte le possibili decifrazioni, se mai avessi lo spazio o il tempo per decodificare ciรฒ che avevi precedentemente crittografato.

Sfortunatamente, anche la semplicitร  della modalitร  libro dei codici รจ un punto debole, perchรฉ ogni volta che c’รจ testo ripetuto in uno dei blocchi di input, lo saprai perchรฉ otterrai una ripetizione anche nel testo cifrato:

 

Nella migliore delle ipotesi, la BCE rivela se ci sono modelli nell’input, qualcosa che un algoritmo di crittografia dovrebbe nascondere.

Nel peggiore dei casi, significa che se mai riuscissi a capire quale fosse il testo in chiaro in una parte dell’input – un’intestazione di capitolo, ad esempio, o parte di un indirizzo Bitcoin – sarai automaticamente in grado di decrittografare quel testo ovunque appaia.

Esistono varie soluzioni per utilizzare algoritmi di crittografia basati su blocchi in modo che non rivelino schemi ripetuti, e una di queste รจ la modalitร ย Cipher Feedbackย (CFB), che funziona in questo modo:

 

Invece di crittografare i blocchi di testo in chiaro con AES ogni volta, crittografate invece l’ultimo blocco di testo cifrato, quindi XOR quel “flusso di chiavi” con il successivo blocco di testo in chiaro.

In questo modo, anche se ottieni due blocchi di testo in chiaro identici di seguito, il testo cifrato non si ripeterร .

Ovviamente, non esiste un blocco di testo cifrato da utilizzare all’inizio, quindi laย AES-128-CFBmodalitร  richiede non solo una chiave di 16 byte per il motore di crittografia, ma anche unย vettore di inizializzazioneย (IV) di 16 byte come input iniziale per ottenere il keystream iniziato.

Notare che l’IV puรฒ, e di solito รจ, condiviso insieme al testo cifrato: l’IV non ha bisogno di essere tenuto segreto, perchรฉ la segretezza della crittografia รจ fornita dalla chiave che controlla il motore di crittografia AES.

Tuttavia, un vettore di inizializzazione CFB dovrebbe essere scelto in modo casuale e non dovrebbe mai essere riutilizzato, specialmente con la stessa chiave AES.

CFB8 spiegato
Uno svantaggio che AES-ECB e AES-CFB hanno in comune รจ che finchรฉ non si dispone di un blocco di input completo di 16 byte, non รจ possibile produrre alcun output, perchรฉ non possono funzionare su blocchi parziali: AES รจ progettato per mescolare -e-scambia-e-trita-e-munge blocchi di 128 bit alla volta.

Ciรฒ significa anche che sei bloccato se hai byte rimanenti alla fine, ad esempio se hai 67 byte da crittografare, che รจ 4 ร— 16 + 3.

รˆ necessario trovare un modo per riempire l’ultimo blocco alla dimensione corretta e quindi determinare in modo affidabile se sono stati aggiunti byte aggiuntivi che devono essere rimossi quando si decrittografano i dati.

Una soluzione a questo รจ AES-CFB8, una modalitร  che non abbiamo mai sentito prima di nessuno nella vita reale, ma progettata per utilizzare un ciclo di missaggio AES completo a 128 bit per ogniย byteย di input, quindi puoi crittografare anche solo un singolo carattere senza imbottitura.

Invece di crittografare l’ultimo blocco completo di testo cifrato per creare il successivo blocco completo di dati keystream, si utilizza ogni volta solo il primo byte del keystream e lo XOR con un byte di testo in chiaro anzichรฉ un blocco di testo in chiaro a 16 byte.

Quindi tagli il byte del keystream che hai appena usato e aggiungi il nuovo byte del testo cifrato alla fine del keystream, dandoti un blocco completo di dati da crittografare per generare il prossimo byte del keystream:

 

Netlogon CFB8 considerato dannoso
Purtroppo, il modo in cui Netlogon utilizzaย AES-128-CFB8รจ significativamente meno sicuro di quanto dovrebbe essere.

I ricercatori di Secura hanno individuato il problema molto rapidamente leggendo la documentazione di Microsoft, dove l’algoritmo non รจ definito genericamente (come lo abbiamo elencato sopra), ma dato in una forma pericolosamente semplificata.

La sezione 3.1.4.4.1 specifica ilย processoย [Calcolo] delle credenziali AESย come segue:

Se il supporto AES viene negoziato tra il client e il server,
le credenziali di accesso alla rete vengono calcolate utilizzando la crittografia AES-128
algoritmo in modalitร  CFB a 8 bit con vettore di inizializzazione zero.
[Sk sotto รจ l’abbreviazione di SessionKey]

ComputeNetlogonCredential (Input, Sk, Output)
SET IV = 0
CALL AesEncrypt (Input, Sk, IV, Output)
Probabilmente hai giร  notato l’errore crittografico: “le credenziali sono calcolate […]ย con un vettore di inizializzazione zeroย “.

Come abbiamo giร  accennato, gli IV dovrebbero essere scelti casualmente e usati solo una volta con qualsiasi chiave – in effetti, รจ per questo che sono spesso indicati comeย nonceย , per iย numeri usati una voltaย .

Ma c’รจ un problema ancora piรน grande con un IV tutto zero in modalitร  CFB8, come ha scoperto Secura.

Puoi visualizzare il problema se usi un IV tutto zero piรน un blocco tutto zero di byte di testo in chiaro:

 

Poichรฉ AES รจ un codice di alta qualitร  senza pregiudizi statistici noti, puoi inserire qualsiasi input e crittografarlo con qualsiasi chiave e la possibilitร  che ogni singolo bit nell’output sia zero (o uno) รจ del 50%.

Il valore di ogni bit di uscita รจ come il lancio di una moneta digitale.

Quindi la possibilitร  che il primo byte di output sia zero รจ uguale alla possibilitร  che i primi 8 bit di output siano tutti zero, che รจ 50% ร— 50% ร— 50% … otto volte (50% รจ solo un altro modo di scrivere 0,50 , che รจ uguale a 1/2).

50%ย 8ย รจ 2ย -8ย , o 1/256.

Ricorda quella probabilitร .

Nel diagramma sopra abbiamo ipotizzato che il primo byte di output sia effettivamente risultato zero, e puoi vedere che se ciรฒ accade, l’intero processo di crittografia viene essenzialmente “bloccato” in uno stato completamente zero.

Il byte keystream (nero) risulta come 00, quindi quando lo XOR con il primo byte di testo in chiaro (rosa) di 00 ottieni un byte di testo cifrato (rosso) di 00.

Quindi, quando tagli il primo 00 dall’estremitร  sinistra dell’IV (bianco) e aggiungi il nuovo testo cifrato 00 alla fine, sei esattamente di nuovo dove hai iniziato, con un altro IV tutto zero e un buffer di testo in chiaro rimanente di tutti zeri.

Quando si crittografa il “nuovo” IV con la chiave, si ottiene esattamente lo stesso risultato di prima, perchรฉ tutti gli input sono di nuovo uguali e ne esce un altro byte di 00, che XOR con il successivo testo in chiaro 00 per produrre un altro testo cifrato byte di 00, che ritorna nell’IV per riportarlo a zero.

Come ingannare Netlogon
I ricercatori di Secura si sono subito resi conto di cosa sarebbe successo se avessero tentato di autenticarsi su un server Netlogon piรน e piรน volte utilizzando unย ClientChallengenonce composto da 8 zeri.

Circa una volta ogni 256 volte il server inventerebbe in modo casuale una chiave di sessione per la quale la versione correttamente crittografata del loro tutto zeroย ClientChallenge…

… sarebbe esso stesso tutti zeri.

Abbiamo provato un IV al-zero con un ClientChallenge tutto zero 2560 volte.
Una su 256 volte la chiave scelta ha dato anche un output tutto zero.
In altre parole, inviando unย ClientChallengedi 0000000000000000 e poi ciecamente anche inviando unย Netlogon Credential Computationย (vedi sopra) di 0000000000000000, avrebbero ottenuto il calcolo delle credenziali corretto per caso 1/256 delle volte, anche se non avevano idea di cosa il ilย SessionKeyvaloreย correttoย dovrebbe essere perchรฉ non avevano idea di quale password segreta usare.

In poche parole, 1/256 delle volte, sono finiti in una situazione in cui potevano sempre produrre dati crittografati correttamente da trasmettere al server, senza avere la piรน pallida idea di quale fosse la password o la chiave di sessione,ย purchรฉ ne avessero solo bisogno crittografare gli zeriย !

Meglio ancora, il server li avviserebbe automaticamente quando hanno vinto il jackpot accettando la loro presentazione delle credenziali.

Sicuramente non รจ sfruttabile?
A questo punto probabilmente starai pensando: “Qual รจ la possibilitร  che ogni volta che hanno bisogno di inviare un token di autenticazione crittografato o di fornire dati di password crittografati, avrebbero solo bisogno di crittografare gli zeri?”

Ce lo chiedevamo anche noi, ma i nostri intrepidi ricercatori hanno trovato un modo.

Una delle funzioni della password di Netlogon,ย NetrServerPasswordSet2(sezione 3.4.5.2.5), puรฒ essere chiamata in remoto da una sessione Netlogon che ha giร  superato ilย controllo delย calcolo delle credenziali di Netlogonย .

Questa funzione, che fa quello che suggerisce il nome e cambia la password del server, richiede al chiamante di crittografare correttamente due blocchi di dati:

L’originaleย ClientChallenge, trattato come un numero a 64 bit, con l’ora corrente (in quello che รจ noto come “Secondi Posix” o forma di epoca Unix) aggiunta ad esso.ย Questi dati vengono utilizzati come controllo di autenticazione per assicurarsi che sia sempre lo stesso programma client che tenta di modificare la password.
Un buffer di 516 byte che specifica la nuova password, formattata come (512-N) byte di dati casuali, seguita da N byte che specificano la password, seguita dalla lunghezza della password N espressa come numero di 4 byte.
Ilย ClientChallengeรจ tutti gli zeri, perchรฉ ciรฒ che era necessario per ottenere l’exploit iniziato, in primo luogo, ma il tempo corrente in POSIX secondi รจ qualcosa di simile a questo:

$ date –utc +% s
1600300026
Il tempo Posix denota il numero di secondi dall’inizio dell’epoca Unix, che iniziรฒ, per definizione, alle 1970-01-01T00: 00: 00Z, una data ormai piรน di 50 anni fa.

I ricercatori si sono trovati sulle corna di un dilemma:ย ClientChallengeera zero, ma il tempo no, quindi la somma di quei due numeri non poteva essere zero, e quindi non sarebbe stata crittografata a zero …

… e quindi gli aggressori avrebbero bisogno della chiave di sessione originale, dopotutto, e per ottenere la chiave di sessione avrebbero bisogno di conoscere una password valida per un computer adatto sulla rete.

Cosa fare?

Bene, i ricercatori hanno semplicemente fatto finta che fosse di nuovo il 1970, hanno usato un timestamp di zero aggiunto a unoย ClientChallengedi zero …

… e al server non importava: apparentemente non c’era alcun controllo per vedere se il timestamp era di decenni nel passato.

Ovviamente, i 516 byte tutto zero che i ricercatori dovevano ora fornire nel buffer delle password crittografate li costringevano a specificare una lunghezza della password pari a zero, che potresti pensare non sarebbe stata consentita dal server.

Ma i ricercatori ci hanno provato comunque …

… e al server non importava neanche quello, impostando la propria password di Active Directory su <nessuna password>.

E dopo?
Fortunatamente, o forse un po ‘meno sfortunatamente, la modifica della password che sono stati in grado di apportare non ha ripristinato la password di accesso effettiva del server, quindi i ricercatori non hanno potuto semplicemente accedere direttamente e assumere il controllo del server tramite un desktop Windows convenzionale.

Tuttavia, hanno segnalato che modificando la password di Active Directory del controller di dominio stesso,ย erano in grado diย :

estrarre tutti gli hash degli utenti dal dominio tramite il protocollo DRS (Domain Replication Service).ย Ciรฒ include gli hash dell’amministratore di dominio (inclusa la chiave “krbtgt”, che puรฒ essere utilizzata per creare biglietti d’oro) che potrebbero quindi essere utilizzati per accedere al controller di dominio (utilizzando un attacco pass-the-hash standard) e aggiornare la password del computer memorizzata in registro locale dei controller di dominio.
In altre parole, completa compromissione della rete.

Tutto a causa di una specifica crittografica eccessivamente semplificata che comportava ogni volta il peccato cardinale di un vettore di inizializzazione completamente zero.

Ovviamente, quel difetto รจ stato aggravato da molte altre sviste programmatiche in cui una maggiore attenzione alla sicurezza e alla correttezza avrebbe potuto impedire questo attacco, tra cui:

Consentendo un tutto zeroย ClientChallengein primo luogo.ย Partiamo dal presupposto che la causa piรน probabile di un buffer tutto zero all’inizio del processo di Netlogon sarebbe un programma client inizializzato in modo errato o con errori, quindi lo rifiuteremmo comunque come precauzione.
Consentire una password di lunghezza zero.ย Dato che Windows ha giร  un meccanismo sicuro per la memorizzazione dei segreti condivisi, e comunque fa molto affidamento su di esso, non sembra necessario consentire password vuote, anche per account in cui non ci si aspetta che nessun essere umano acceda.
Consentire un campo di autenticazione basato sulla data in cui il timestamp potrebbe non essere corretto.ย Saremmo propensi a considerare questo come un avvertimento di un cliente difettoso o un tentativo di tirare fuori un trucco di sicurezza.
Cosa fare?
Questo bug apre una grave falla di sicurezza per chiunque sia giร  all’interno della tua organizzazione e forse anche per gli estranei, a seconda della topologia della tua rete.

Se non hai ancora applicato la patch di agosto 2020, devi farlo: non stai solo deludendo te stesso, stai deludendo anche tutti gli altri rendendo la tua rete un bersaglio piรน facile per i truffatori, e quindi rendendola di piรน probabilmente sarai la fonte di problemi di sicurezza per altre persone.

Inoltre:

Non prendere scorciatoie crittograficheย come la scelta di una modalitร  di crittografia conveniente per la tua applicazione, ma poi prenditi delle libertร  su come la usi perchรฉ รจ conveniente per i tuoi programmatori.
Programma in modo difensivo ogni volta che accetti dati non attendibili,ย soprattutto se i dati possono essere facilmente controllati per valori chiaramente falsificati o errati come timestamp di 50 anni nel passato.
Ritira le parti vecchie dei tuoi prodotti o delle tue specifiche il prima possibile dopo che saranno disponibili di migliori.ย Sebbene l’exploit in questo caso si basasse su parti aggiornate del protocollo Netlogon, come l’utilizzo di AES invece di ricadere su algoritmi meno recenti, si puรฒ sostenere che questo bug potrebbe essere stato trovato molto prima se le specifiche del protocollo non fossero gravate da cosรฌ tante alternative modi per eseguire tutti i tipi di controlli relativi alla sicurezza.
Ma la cosa importante da ricordare qui รจ:ย patch presto, patch spessoย .

Fonte : https://nakedsecurity.sophos.com/2020/09/17/zerologon-hacking-windows-servers-with-a-bunch-of-zeros/