
Abusa dei ticket Kerberos per bypassare l'UAC di Windows e ottenere privilegi SYSTEM iniettando un fake MachineID nei ticket di servizio, sfruttando il trucco tgtdeleg e l'accesso SCM.
Questo POC è ispirato da James Forshaw (@tiraniddo) condiviso al BlackHat USA 2022 intitolato “Taking Kerberos To The Next Level ”, ha condiviso una demo dell'abuso dei ticket Kerberos per ottenere un bypass UAC. Aggiungendo un KERB-AD-RESTRICTION-ENTRY al ticket di servizio, ma inserendo un MachineID falso, possiamo facilmente bypassare UAC e ottenere privilegi SYSTEM accedendo al SCM per creare un servizio di sistema. James Forshaw ha spiegato la logica alla base di ciò in un post dal titolo "Bypassing UAC in the most Complex Way Possible!", cosa che mi ha molto interessato. Sebbene non abbia fornito il codice completo dell'exploit, ho costruito un POC basato su Rubeus. Come set di strumenti C# per l'interazione diretta con Kerberos e l'abuso di ticket, Rubeus fornisce un'interfaccia semplice che ci permette di avviare facilmente richieste Kerberos e manipolare ticket Kerberos.
Puoi vedere articoli correlati su KRBUACBypass nel mio blog "Revisiting a UAC Bypass By Abusing Kerberos Tickets", inclusi il principio di base e come è implementato. Come detto nell'articolo, questo articolo è stato ispirato dal lavoro di @tiraniddo "Taking Kerberos To The Next Level" (non lo avrei fatto senza la sua condivisione) e l'ho semplicemente implementato come strumento prima di laurearmi.
Non possiamo generare manualmente un TGT poiché non abbiamo e non abbiamo accesso alle credenziali dell'utente corrente. Tuttavia, Benjamin Delpy (@gentilkiwi) ha aggiunto un trucco (tgtdeleg) nel suo Kekeo che permette di abusare della delega non vincolata per ottenere un TGT locale con una chiave di sessione.
Tgtdeleg abusa della GSS-API di Kerberos per ottenere TGT disponibili per l'utente corrente senza ottenere privilegi elevati sull'host. Questo metodo utilizza la funzione AcquireCredentialsHandle per ottenere l'handle delle credenziali di sicurezza Kerberos per l'utente corrente, e chiama la funzione InitializeSecurityContext per HOST/DC.domain.com usando il flag ISC_REQ_DELEGATE e lo SPN target per preparare il contesto di pseudo-delega da inviare al controller di dominio. Questo fa sì che il KRB_AP-REQ nell'output GSS-API includa il KRB_CRED nell'Authenticator Checksum. La chiave di sessione del ticket di servizio viene quindi estratta dalla cache Kerberos locale e utilizzata per decifrare il KRB_CRED nell'Authenticator per ottenere un TGT utilizzabile. Anche il set di strumenti Rubeus incorpora questa tecnica. Per dettagli, fare riferimento a “Rubeus – Now With More Kekeo”.
Con questo TGT, possiamo generare il nostro ticket di servizio, e il processo operativo fattibile è il seguente:
KERB-AD-RESTRICTION-ENTRY, ma inserisci un MachineID falso.Una volta ottenuto un ticket di servizio, puoi utilizzare l'autenticazione Kerberos per accedere alle Named Pipe o TCP di Service Control Manager (SCM) tramite SPN HOST/HOSTNAME o RPC/HOSTNAME. Nota che l'API Win32 di SCM utilizza sempre l'autenticazione Negotiate. James Forshaw ha creato un semplice POC: SCMUACBypass.cpp, tramite le due API HOOK AcquireCredentialsHandle e InitializeSecurityContextW, il nome del pacchetto di autenticazione chiamato da SCM (pszPack age ) viene cambiato in Kerberos per consentire a SCM di utilizzare Kerberos durante l'autenticazione locale.
Per maggiori dettagli leggere:
Ora diamo un'occhiata all'effetto in esecuzione, come mostrato nella figura qui sotto. Prima richiedi un ticket per il servizio HOST del server corrente tramite la funzione asktgs, e poi crea un servizio di sistema tramite krbscm per ottenere il privilegio SYSTEM.
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
