
lighttpd 1.4.85 - Alta - Remota - Ruta - Win32 nativo GET /..%20/ lee fuera del document-root
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
Clase: Lectura de archivos Alcance: Remoto
lighttpd 1.4.85 (4852959) - lighttpd
El staticfile nativo _WIN32 une document-root con rel_path después de buffer_path_simplify. Simplify solo pliega ../ cuando el tercer byte es /. http_response_prepare_physical elimina los espacios y puntos finales de la ruta completa únicamente. Por lo tanto, GET /..%20/windows/win.ini permanece como /.. /windows/win.ini. _wstati64 / _wopen sin un prefijo \\?\ permiten entonces que Win32 elimine el espacio por componente y trate ese segmento como ...
GET/HEAD no autenticado en lighttpd nativo de Windows lee un archivo regular fuera de document-root que la cuenta del worker puede abrir. Unix/Linux no es este remanente. Lectura de archivos, no RCE.
El laboratorio es un gadget de esas funciones de fijación. No es un worker nativo Win32 en vivo. La última línea usa how=gadget.
| ID | sin CVE todavía |
| Clase | Lectura de archivos (path traversal, nativo Win32 ..%20/) |
| Alcance | Remoto (GET/HEAD no autenticado) |
| CWE | CWE-22 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Producto | lighttpd1.4 |
| Afectado | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) nativo _WIN32 |
| Autenticación | ninguna. mod_staticfile por defecto |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1, how=gadget |
Requiere lighttpd nativo de Windows sirviendo archivos estáticos. La cuenta del worker debe poder abrir el archivo regular objetivo.
| Privilegio | Método / sink | Probado en laboratorio o inferido |
|---|---|---|
Leer un archivo fuera de document-root | GET no autenticado /..%20/<name> | Probado en laboratorio (gadget). El cuerpo HTTP 200 es el secreto padre |
Misma clase para otro espacio/punto ASCII final en un componente .. no final | url-decode y luego simplify mantiene .. | Probado en laboratorio para %20. Inferido para otro espacio/punto final |
| HEAD en la misma ruta | staticfile HEAD | Inferido. El laboratorio usó GET |
Negativo: /../ real | buffer_path_simplify pliega ../ | Probado en laboratorio. 404, simplificado /windows/win.ini, sin testigo |
| Negativo: apertura POSIX de Unix de la cadena física no simplificada | open("/srv/htdocs/.. /windows/win.ini") | Probado en laboratorio. ENOENT |
Cerrado en este remanente: staticfile de Unix/Linux; Cygwin (mismo strip, apertura POSIX); %5C parseopt de 1.4.85; alias CVE-2018-19052; Host CVE-2014-2324. No es RCE. No es una escritura.
Fijé la etiqueta lighttpd-1.4.85. Veinte búsquedas. Staticfile por defecto de Unix/Linux, FastCGI, proxy, TLS, auth, HTTP/2, alias/rewrite: ninguno en este nivel. La oleada de parser 1.4.81-1.4.85 ya cerró trailers, conflictos de cabeceras CGI y Content-Length de backend inválido.
buffer_path_simplify solo pliega ../ cuando walk[2] == '/'. El strip WIN32 en http_response_prepare_physical (src/response.c 334-360) es la cola de la ruta completa. _wstati64 / _wopen (src/fs_win32.c 24-77) pasan UTF-16 sin \\?\, por lo que Win32 elimina los espacios finales por componente y .. se convierte en ... La unión física es doc_root + rel_path sin verificación de basedir posterior al stat.
Giros equivocados ya registrados: tratar ENOENT de Unix como "no es un bug" (es el control negativo); llamar a Cygwin nativo Win32; afirmar que %5C de 1.4.85 es este remanente; inflar la lectura de archivos a RCE. Teatro: una reverse shell. El oráculo es un cuerpo 200 desde el padre de document-root.
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
o
cd lab
./run.sh
El laboratorio es un gadget fiel de buffer_urldecode_path, buffer_path_simplify (mapa '\\' de Win32), el strip de cola de response.c, y _wstati64 sin \\?\. La apertura POSIX de Unix es el control negativo. La resolución de Win32 se implementa como el mismo strip de espacio final por componente, luego . / .., luego una apertura POSIX de la ruta resuelta. HTTP en loopback 127.0.0.1:19400.
/index.html -> 200 public-index, sin testigo./../windows/win.ini -> 404, simplificado /windows/win.ini./..%20/windows/win.ini -> decodificado /.. /windows/win.ini, simplify mantuvo el espacio, ENOENT de Unix, Win32 resolvió /srv/windows/win.ini, testigo 200.SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
Eliminar los espacios y puntos finales por componente de ruta antes de simplify, o prefijar las aperturas de Win32 con \\?\ y rechazar una ruta física que no permanezca bajo document-root.
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt de 1.4.85 · alias CVE-2018-19052 · Host CVE-2014-2324GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.