
Cobalt Strike Beacon Object File che implementa l'escalation dei privilegi locale SMBGhost CVE-2020-0796 con doppio percorso di weaponization per furto di token ed elevazione della sessione.
Questa è la sperimentazione di Raphael con l'LPE SMBGhost.
Ho iniziato con il codice sorgente del Metasploit Framework:
cve-2020-0796: Buffer Overflow della Compressione SMBv3 (SMBGhost) (CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [Sotto licenza BSD]
E, ecco cosa ho fatto:
Questo ha richiesto di dichiarare diverse API Win32 nel formato Dynamic Function Resolution MODULE$Function. Dal lato positivo, questo ha ridotto parte del codice per chiamare funzioni in NTDLL, dato che DFR lo gestisce per noi. :)
Ho rimosso l'array di puntatori non usato da 1.000 elementi da get_handle_addr. Questo faceva sì che cl.exe inserisse una funzione __chkstk a causa delle variabili locali che superavano il limite di 8KB. I BOF non hanno questa funzione a disposizione.
Ho poi introdotto alcune API specifiche di Beacon (es., BeaconPrintf, BeaconInjectProcess, ecc.) per fare le cose nel modo nativo di Beacon.
Ho dovuto scrivere alcune funzioni per sopperire alla roba libc che non ho (a causa... dei BOF).
Usa l'alias 'smbghost' in Beacon, senza argomenti, per eseguire questo exploit e impattare il token di processo del Beacon. Se l'exploit ha successo, il tuo token di processo corrente avrà super poteri che prima non aveva. Per esempio, ora puoi iniettare in altri processi (anche in altre sessioni desktop) o generare un processo figlio sotto winlogon.exe. Potresti dover eseguire smbghost più volte poiché l'exploit non riesce sempre al primo tentativo.
In alternativa, usa 'elevate smbghost' per ottenere una nuova sessione Beacon usando l'API di elevazione dei privilegi disponibile nell'Aggressor Script di Cobalt Strike. Va bene per una demo veloce, si adatta ai flussi di lavoro del prodotto, ecc. ma... inietta in winlogon.exe. Iniettare in winlogon.exe non è un invariante di questa particolare elevazione. Sospetto che tutti i POC pubblici lo facciano perché CreateRemoteThread non funziona attraverso i confini dei processi e chi vuole scrivere il boilerplate extra per lo spoofing del processo padre? winlogon.exe è il frutto più facile da cogliere per dimostrare che abbiamo diritti elevati.
Per compilare questo con Visual Studio:
Usa make.bat dal prompt dei comandi x64 Cross Tools.
Questo genererà expoit.x64.o in dist/
Ho usato Visual Studio 2013. Gli altri compilatori/versioni non sono stati testati. Non ho provato/testato x86.