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-2023-24329-lab — Laboratorio Docker autocontenido que demuestra CVE-2023-24329, un diferencial del analizador urllib de Python que evade los filtros de esquema y host de URL, con entornos vulnerables y parcheados para educación práctica en seguridad. | Kitploit
Herramientas/GitHubGitHub/jithinodattu/cve-2023-24329-lab
Análisis de VulnerabilidadesExplotaciónSeguridad WebCTFPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

Laboratorio Docker autocontenido que demuestra CVE-2023-24329, un diferencial del analizador urllib de Python que evade los filtros de esquema y host de URL, con entornos vulnerables y parcheados para educación práctica en seguridad.

Ver Repositorio
4hace 4 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

CVE-2023-24329 — Laboratorio de Diferencial de Analizador (Parser Differential)

Solo con fines educativos. Este laboratorio existe para demostrar una vulnerabilidad real en un entorno seguro y aislado. No lo ejecutes nunca contra sistemas que no te pertenezcan. No reutilices el código de filtro intencionalmente roto en ningún sistema de producción.

Un laboratorio Docker autocontenido que demuestra CVE-2023-24329 — un diferencial de analizador en urllib.parse.urlparse() de Python que permite eludir filtros de esquema URL y host en Python < 3.11.4.

El laboratorio muestra una API que bloquea explícitamente las URL file:// y los nombres de host internos, siendo engañada para leer /etc/passwd desde su propio contenedor y acceder a un servicio privado interno — luego demuestra que el mismo exploit falla en Python parcheado.


La Vulnerabilidad

urlparse() de Python y los recuperadores HTTP/archivo subyacentes no se ponen de acuerdo sobre cómo manejar las URL con espacios en blanco al inicio. En versiones afectadas:

root@kitploit:~
from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (vacío — el filtro pasa)
urlparse(" file:///etc/passwd").hostname # → None (vacío — el filtro pasa)

Pero urllib.request.urlopen(" file:///etc/passwd") elimina el espacio y obtiene file:///etc/passwd de todas formas.

Esa brecha entre lo que el analizador ve y lo que el recuperador hace — esa es la vulnerabilidad.

Python 3.11.4 corrigió esto eliminando los espacios en blanco y caracteres de control al inicio antes de analizar, cerrando la brecha.


Demo — Tres Pasos

PasoLo que vesLo que enseña
1 — Línea basefile:///etc/passwd → 403 esquema bloqueadoEl filtro parece razonable
2 — ExploitMisma URL con un prefijo de espacio → 200 + contenido de /etc/passwd y secreto internoUn solo espacio derrota todo el filtro
3 — ParcheMisma carga útil contra Python 3.11.4 → 403 bloqueadourlparse parcheado elimina espacios primero; el filtro lo captura correctamente

Arquitectura

Cuatro servicios en una red Docker puente aislada (cve-lab-net):

ServicioVersión de PythonRolPuerto del host
vulnerable-api3.11.3API objetivo con filtro URL ingenuo8000
fixed-api3.11.4Mismo código, intérprete parcheado8000
internal-service3.12Punto final falso de metadatos internosninguno
attacker3.12Controlador de exploitninguno

internal-service no tiene mapeo de puertos host — solo es accesible desde dentro de la red Docker, simulando un límite de confianza real.


Requisitos Previos

  • Docker Desktop (o Docker Engine + plugin Compose)
  • ~500 MB de espacio en disco para las imágenes

Inicio Rápido

root@kitploit:~
git clone <url-del-repositorio>
cd CVE-2023-24329-lab

Paso 1 — Línea base: el filtro debe mantenerse

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

Paso 1 — el filtro de línea base se mantiene

Paso 2 — Exploit: eludir el filtro

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

Paso 2 — exploit exitoso, /etc/passwd y secreto interno expuestos

Paso 3 — Parche: misma carga útil, Python parcheado

root@kitploit:~
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

Paso 3 — el parche se mantiene en Python 3.11.4

Limpiar

root@kitploit:~
docker compose -f docker-compose.fixed.yml down

Estructura de Directorios

root@kitploit:~
CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3 (afectado)
├── docker-compose.fixed.yml        # Python 3.11.4 (parcheado)
├── vulnerable-api/
│   ├── app.py                      # API Flask con el filtro ingenuo
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # Punto final falso de metadatos internos
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # Controlador de demo (línea base / exploit / verificar)
    ├── requirements.txt
    └── Dockerfile

Los servicios de API vulnerable y fija comparten el mismo código fuente — solo difiere la versión de Python de la imagen base. Esta es la propiedad clave de control científico del laboratorio.


Cómo Funciona la Evasión

El filtro de la API vulnerable (simplificado):

root@kitploit:~
parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # bloqueado

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # bloqueado

urllib.request.urlopen(url)  # obtiene la cadena original sin modificar

La carga útil de evasión es un único espacio al inicio:

root@kitploit:~
 file:///etc/passwd
^
espacio (0x20)

En Python ≤ 3.11.3, urlparse ve un esquema vacío y ningún hostname → el filtro pasa. urlopen elimina el espacio → obtiene file:///etc/passwd.

En Python ≥ 3.11.4, urlparse primero elimina el espacio → ve correctamente scheme=file → el filtro bloquea con 403.


La Corrección (Lo Que Hace Python Parcheado)

CPython issue #102153 — la corrección elimina los caracteres de control C0 y espacios del inicio de la URL antes de analizar. Después del parche, tanto el analizador como el recuperador coinciden en cuál es la URL, por lo que el filtro no puede ser evadido de esta manera.

El patrón defensivo correcto independientemente de la versión de Python:

root@kitploit:~
# Analizar → reconstruir a partir de partes → pasar la URL reconstruida downstream.
# Tanto el filtro como el recuperador operan sobre la misma cadena.
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # reconstruida a partir de componentes
urllib.request.urlopen(safe_url)

Puntos Clave de Enseñanza

  1. Los diferenciales de analizador son una clase de vulnerabilidad, no un error aislado. La misma idea impulsa el contrabando de solicitudes HTTP, los ataques de confusión SAML y las evasiones de ${jndi:...} de log4j.
  2. Las listas negras fallan cuando el analizador te miente. Enumerar entradas maliciosas es un juego perdido.
  3. Valida la URL reconstruida, no la cadena de entrada cruda.
  4. Una versión menor, un pequeño parche, una consecuencia masiva. La corrección de CPython son unas pocas líneas.

Referencias

  • NVD: CVE-2023-24329
  • CPython issue: github.com/python/cpython/issues/102153
  • Divulgación original: Yebo Cao — busca "CVE-2023-24329 Yebo Cao"
  • Clase más amplia: PortSwigger — técnicas de evasión de filtros SSRF
  • Clase más amplia: James Kettle — Ataques de Desincronización HTTP

Vallas de Seguridad

  • No expongas nunca los puertos de internal-service al host.
  • No ejecutes este laboratorio en una máquina conectada a una red de producción.
  • El código de filtro en vulnerable-api/app.py está intencionalmente roto con fines educativos — no lo copies en ningún sistema real.

Licencia

MIT — libre de usar, compartir y adaptar con fines educativos con atribución.

Descargar herramienta