
Exploit proof-of-concept per escalation dei privilegi locale di Windows (CVE-2023-21746) che abusa dell'autenticazione locale NTLM per ottenere privilegi SYSTEM tramite accesso a condivisioni SMB e DLL hijacking.
Una vulnerabilità di escalation dei privilegi locali (LPE) in Windows è stata segnalata a Microsoft il 9 settembre 2022 da Andrea Pierini (@decoder_it) e Antonio Cocomazzi (@splinter_code). La vulnerabilità consentirebbe a un attaccante con un account a bassi privilegi su un host di leggere/scrivere file arbitrari con privilegi di SYSTEM.
Sebbene la vulnerabilità in sé non consenta direttamente di eseguire comandi come SYSTEM, possiamo combinarla con diversi vettori per ottenere questo risultato. Opportunamente, il 13 febbraio è stato pubblicato da BlackArrowSec un altro PoC di escalation dei privilegi che abusa del servizio StorSvc, consentendo a un attaccante di eseguire codice come SYSTEM purché possa scrivere un file DLL in qualsiasi directory del PATH.
Il PoC LocalPotato sfrutta un difetto in un caso speciale dell'autenticazione NTLM chiamato autenticazione locale NTLM per indurre un processo privilegiato ad autenticare una sessione che l'attaccante avvia contro il server SMB locale. Di conseguenza, l'attaccante ottiene una connessione che gli garantisce l'accesso a qualsiasi condivisione con i privilegi del processo raggirato, incluse condivisioni speciali come C$ o ADMIN$.
Il processo seguito dall'exploit è il seguente:
Avendo una connessione privilegiata alle condivisioni SMB, l'attaccante può leggere o scrivere file sulla macchina target in qualsiasi posizione. Sebbene questo non ci consenta di eseguire comandi direttamente contro la macchina vulnerabile, combineremo questo con un diverso vettore di attacco per raggiungere tale obiettivo.
Nota che la vulnerabilità è nel protocollo NTLM piuttosto che nel server SMB, quindi questo stesso vettore di attacco potrebbe teoricamente essere usato contro qualsiasi servizio che sfrutta l'autenticazione tramite NTLM. In pratica, tuttavia, bisogna gestire alcune avvertenze quando si seleziona il protocollo da attaccare. Il PoC usa il server SMB per evitare alcune protezioni extra presenti per altri protocolli contro vettori di attacco simili e implementa persino un rapido bypass per far funzionare l'exploit contro il server SMB. Post dell'autore originale dell'exploit - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
Finora abbiamo usato LocalPotato per scrivere file arbitrari sulla macchina target. Per ottenere una shell privilegiata, dobbiamo ancora capire come usare la scrittura arbitraria per eseguire un comando.
Recentemente è stato trovato un altro vettore di escalation dei privilegi, in cui un attaccante potrebbe dirottare una DLL mancante per eseguire comandi arbitrari con privilegi SYSTEM. L'unico problema con questo vettore era che un attaccante avrebbe dovuto scrivere una DLL nel PATH di sistema per attivarlo. Per impostazione predefinita, il PATH di Windows include solo directory che possono essere scritte solo da account privilegiati. Sebbene possa essere possibile trovare macchine in cui l'installazione di applicazioni specifiche ha alterato la variabile PATH e reso la macchina vulnerabile, il vettore di attacco si applica solo a scenari particolari. Combinando questo attacco con LocalPotato possiamo superare questa restrizione e avere un exploit di escalation dei privilegi completamente funzionante.
StorSvc e DLL Hijacking Come scoperto da BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc), un attaccante può inviare una chiamata RPC al metodo "SvcRebootToFlashingMode" fornito dal servizio "StorSvc", che a sua volta finirà per innescare un tentativo di caricare una DLL mancante chiamata "SprintCSP.dll". Se non hai familiarità con RPC, consideralo come un'API che espone funzioni in modo che possano essere usate in remoto. In questo caso, il servizio StorSvc espone il metodo SvcRebootToFlashingMode, che chiunque abbia accesso alla macchina può chiamare. Poiché StorSvc viene eseguito con privilegi SYSTEM, creare SprintCSP.dll da qualche parte nel PATH la farà caricare ogni volta che viene effettuata una chiamata a SvcRebootToFlashingMode.
Compilazione dell'Exploit Link dell'exploit - (https://github.com/decoder-it/LocalPotato) Per utilizzare questo exploit, dovrai prima compilare entrambi i file forniti:
Iniziamo occupandoci di "RpcClient.exe". Come accennato in precedenza, dovremo modificare l'exploit a seconda della versione di Windows della macchina target. Per fare ciò, dovremo modificare le prime righe di "LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c" in modo che venga scelto il sistema operativo corretto. Questo imposterà l'exploit per utilizzare il corretto identificatore di interfaccia RPC. Ora che il codice è stato corretto, apriamo un prompt dei comandi per sviluppatori e compiliamo il progetto eseguendo il seguente comando: Comandi: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (The compiled executable will be found on your desktop.)
Ora per compilare "SprintCSP.dll", dobbiamo solo modificare la funzione "DoStuff()" in "C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c" in modo che esegua un comando che ci conceda accesso privilegiato alla macchina. Per semplicità, faremo in modo che la DLL aggiunga il nostro utente corrente al gruppo Administrators. Possiamo anche ottenere una reverse shell dal target verso la nostra macchina. Ora compiliamo la DLL eseguendo il seguente comando e spostiamo il risultato sul nostro desktop: Comandi: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
Ora siamo pronti a lanciare l'exploit. Assicurati di avere l'exploit "LocalPotato.exe", "RpcClient.exe" e il file "SprintCSP.dll".
Rilevamento e Mitigazione
Rilevamento Ora che abbiamo capito come funziona l'exploit localpotato e come può essere concatenato con il servizio StorSrv per eseguire codice come SYSTEM, è il momento di vedere come questo può essere rilevato nel sistema e come prevenire tali attacchi.
Regola YARA: Poiché questo attacco coinvolge un eseguibile che gira nel terminale della riga di comando con argomenti, due modi comuni per rilevare questa attività sarebbero l'uso dello strumento di pattern matching YARA per rilevare i pattern dei file e l'esame degli eventi generati dall'esecuzione di questo hack tool localpotato.exe. Poiché l'attacco utilizza l'hack tool noto come localpotato.exe, possiamo creare una regola YARA per rilevare la presenza di questo strumento nel sistema usando YARA o altri strumenti di rilevamento come THOR per scansionare l'host. (La regola YARA è allegata in questo repository, questa regola minima cerca pattern di stringhe comuni nell'eseguibile localpotato).
Regola Sigma: SIGMA è un linguaggio di firma generico utilizzato per scrivere regole di rilevamento basate sui pattern trovati nei log degli eventi. Per rilevare localpotato nella rete, è previsto che sia abilitato il monitoraggio centralizzato dei log. La seguente regola SIGMA è tratta dal repository ufficiale SIGMA (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml).
Possiamo usare queste regole sigma per convertirle nello strumento di Rilevamento/Monitoraggio in uso e cercare nei log degli eventi potenziali attacchi.
Mitigazione