
Bypass UAC dirottando una DLL situata nel Native Image Cache
Bypassa il Controllo dell'Account Utente (UAC) per ottenere privilegi elevati (Amministratore) ed eseguire qualsiasi programma a un livello di integrità elevato.

Ho deciso di aggiornare ByeIntegrity per renderlo molto più veloce, leggero e affidabile. Si tratta di una revisione significativa, quindi ho creato un nuovo progetto nella soluzione VS chiamato "ByeIntegrity2021", che è la versione aggiornata di questo attacco. Ovviamente, la versione originale è ancora presente. Per maggiori informazioni sulla nuova versione, espandi i dettagli qui sotto.
La nuova versione ora è in grado di dirottare la NIC senza dipendere dalle immagini native esistenti installate nella NIC. Lo fa creando i propri descrittori di immagini native e payload, quindi spostandoli nella NIC, eliminando la necessità di:
*.ni esistenti prodotte da NGEN.exeIl CLR carica le immagini native dalla NIC eseguendo una scansione ricorsiva delle directory di ogni voce, e poi leggendo il suo file *.aux. Questo file contiene informazioni sull'immagine nativa e sulle sue dipendenze. In base alle informazioni nel file AUX, il CLR caricherà l'immagine o la rifiuterà, e poi passerà al candidato successivo. Se non si trovano candidati validi, carica l'immagine standard e usa il jit per compilarla normalmente. Nessuna parte dell'immagine nativa effettiva viene letta (viene solo verificata la sua esistenza), quindi ByeIntegrity posiziona semplicemente la DLL del payload con lo stesso nome che avrebbe l'immagine nativa.
La versione aggiornata di ByeIntegrity include uno strumento chiamato AUXGen, che riceve il nome di un assembly dal GAC e genera il corrispondente file AUX. Il file AUX viene generato in modo da corrispondere ai controlli del CLR e il CLR caricherà l'"immagine nativa" descritta dal file AUX. Nota: AUXGen non gestisce le dipendenze durante la generazione del file AUX. Fa solo quanto necessario affinché il CLR carichi l'immagine. Pubblicherò i dettagli del formato del file AUX in seguito.
ByeIntegrity ora utilizza ISecurityEditor, proprio come fa UACMe, il che riduce il codice necessario. Richiede anche che tu abbia generato il file AUX per l'assembly MMCEx e lo abbia posizionato nella stessa directory di ByeIntegrity. MMCEx è ora l'immagine target a causa del suo ordine di caricamento e del nome più breve.
ByeIntegrity dirotta una DLL situata nella Cache delle Immagini Native (NIC). La NIC viene utilizzata dal .NET Framework per memorizzare assembly .NET ottimizzati generati da programmi come Ngen, il Generatore di Immagini Native del .NET Framework. Poiché Ngen viene solitamente eseguito con l'utente corrente con privilegi di Amministratore tramite l'Utilità di pianificazione, la NIC concede l'accesso in modifica ai membri del gruppo Administrators.
Lo snap-in del Firewall di Windows della Console di Gestione Microsoft (MMC) utilizza il .NET Framework e, al momento dell'inizializzazione, i moduli della NIC vengono caricati nel processo MMC. L'eseguibile MMC utilizza AutoElevate, un meccanismo che Windows utilizza per elevare automaticamente il token di un processo senza richiesta UAC.
ByeIntegrity dirotta una DLL specifica situata nella NIC denominata Accessibility.ni.dll. Scrive del shellcode in un'area di padding di dimensioni appropriate situata nella sezione .text della DLL. Il punto di ingresso della DLL viene quindi aggiornato per puntare al shellcode. Al caricamento della DLL, viene eseguito il punto di ingresso (che in realtà è il shellcode). Il shellcode calcola l'indirizzo di kernel32!CreateProcessW, crea una nuova istanza di cmd.exe in esecuzione come Amministratore, e poi restituisce semplicemente TRUE. Questo vale solo per la ragione DLL_PROCESS_ATTACH; tutte le altre ragioni restituiranno immediatamente TRUE.
Questo attacco è implementato in UACMe come metodo #63. Se vuoi provare questo attacco, per favore, usa prima UACMe. L'attacco è lo stesso, tuttavia UACMe utilizza un metodo diverso per modificare la NIC. ByeIntegrity usa IFileOperation mentre UACMe usa ISecurityEditor. Inoltre, UACMe sceglie il file Accessibility.ni.dll corretto per il tuo sistema ed esegue le attività di manutenzione del sistema se necessario (per generare i componenti NIC). ByeIntegrity sceglie semplicemente la prima voce NIC esistente (che potrebbe o meno essere quella corretta usata da MMC) e non esegue le attività di manutenzione del sistema. ByeIntegrity contiene significativamente più codice di UACMe, quindi leggere l'implementazione di UACMe sarà molto più facile che leggere il codice di ByeIntegrity. Infine, ByeIntegrity avvia un processo figlio durante l'attacco mentre UACMe no.
tl;dr: UACMe è più semplice ed efficace di ByeIntegrity, quindi usa prima UACMe.
Se stai leggendo questo, probabilmente sai come compilare il sorgente. Tieni presente che non è stato testato o progettato affatto per x86, e probabilmente non funzionerà su x86 comunque.
Proprio come UACMe, non caricherò mai binari compilati in questo repository. Ci sono sempre persone che vogliono che il mondo crolli e bruci, e non fornirò una via facile per eseguire questo su un computer di qualcun altro e causare danni intenzionali. Inoltre, non voglio che script-kiddies utilizzino questo attacco senza capire cosa fa e i danni che può causare.
Questo attacco funziona da Windows 7 (7600) fino all'ultima versione di Windows.