
lighttpd 1.4.85 – Hoch – Remote – Pfad – native Win32 GET /..%20/ liest außerhalb des Document-Root
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
Klasse: Dateilesen Reichweite: Remote
lighttpd 1.4.85 (4852959) - lighttpd
Natives _WIN32 staticfile verbindet document-root mit rel_path nach buffer_path_simplify. Simplify faltet ../ nur, wenn das dritte Byte / ist. http_response_prepare_physical entfernt abschließende Leerzeichen und Punkte nur vom gesamten Pfad. GET /..%20/windows/win.ini bleibt daher /.. /windows/win.ini. _wstati64 / _wopen ohne \\?\-Präfix lassen Win32 dann das Leerzeichen pro Komponente entfernen und dieses Segment als .. behandeln.
Unauthentifiziertes GET/HEAD auf nativem Windows-lighttpd liest eine reguläre Datei außerhalb von document-root, die das Worker-Konto öffnen kann. Unix/Linux ist nicht dieser Überrest. Dateilesen, kein RCE.
Das Lab ist ein Gadget dieser Pin-Funktionen. Es ist kein laufender nativer Win32-Worker. Die letzte Zeile verwendet how=gadget.
| ID | noch keine CVE |
| Klasse | Dateilesen (Path Traversal, natives Win32 ..%20/) |
| Reichweite | Remote (unauthentifiziertes GET/HEAD) |
| CWE | CWE-22 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Produkt | lighttpd1.4 |
| Betroffen | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) natives _WIN32 |
| Auth | keine. Standard-mod_staticfile |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1, how=gadget |
Benötigt natives Windows-lighttpd, das statische Dateien ausliefert. Das Worker-Konto muss die Ziel-Regulärdatei öffnen können.
| Privileg | Methode / Sink | Im Lab bewiesen oder abgeleitet |
|---|---|---|
Eine Datei außerhalb von document-root lesen | Unauth GET /..%20/<name> | Im Lab bewiesen (Gadget). HTTP-200-Body ist das Parent-Secret |
Gleiche Klasse für anderes abschließendes ASCII-Leerzeichen/Punkt in einer nicht-finalen ..-Komponente | url-decode, dann simplify behält .. | Im Lab bewiesen für %20. Abgeleitet für anderes abschließendes Leerzeichen/Punkt |
| HEAD auf denselben Pfad | staticfile HEAD | Abgeleitet. Lab verwendete GET |
Negativ: echtes /../ | buffer_path_simplify faltet ../ | Im Lab bewiesen. 404, vereinfacht /windows/win.ini, kein Witness |
| Negativ: Unix-POSIX-open des nicht vereinfachten physischen Strings | open("/srv/htdocs/.. /windows/win.ini") | Im Lab bewiesen. ENOENT |
Geschlossen bei diesem Überrest: Unix/Linux-staticfile; Cygwin (gleicher Strip, POSIX-open); 1.4.85 %5C parseopt; CVE-2018-19052 alias; CVE-2014-2324 Host. Kein RCE. Kein Write.
Ich habe den Tag lighttpd-1.4.85 gepinnt. Zwanzig Jagden. Standard-Unix/Linux-staticfile, FastCGI, Proxy, TLS, Auth, HTTP/2, alias/rewrite: nichts auf dieser Latte. Die Parser-Welle 1.4.81-1.4.85 hatte bereits Trailer, CGI-Header-Konflikte und ungültige Backend-Content-Length geschlossen.
buffer_path_simplify faltet ../ nur, wenn walk[2] == '/'. Der WIN32-Strip in http_response_prepare_physical (src/response.c 334-360) ist der Ganzpfad-Tail. _wstati64 / _wopen (src/fs_win32.c 24-77) übergeben UTF-16 ohne \\?\, sodass Win32 abschließende Leerzeichen pro Komponente entfernt und .. zu .. wird. Der physische Join ist doc_root + rel_path ohne Post-Stat-basierte basedir-Prüfung.
Bereits festgehaltene Irrwege: Unix-ENOENT als „kein Bug" behandeln (es ist die Negativkontrolle); Cygwin als natives Win32 bezeichnen; behaupten, 1.4.85 %5C sei dieser Überrest; Dateilesen zu RCE aufblasen. Theater: eine Reverse Shell. Das Orakel ist ein 200-Body vom Parent von document-root.
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
oder
cd lab
./run.sh
Das Lab ist ein originalgetreues Gadget von buffer_urldecode_path, buffer_path_simplify (Win32-'\\'-Map), dem response.c-Tail-Strip und _wstati64 ohne \\?\. Unix-POSIX-open ist die Negativkontrolle. Win32-Resolve ist implementiert als derselbe pro-Komponente-Strip abschließender Leerzeichen, dann . / .., dann ein POSIX-open des aufgelösten Pfads. Loopback-HTTP 127.0.0.1:19400.
/index.html -> 200 public-index, kein Witness./../windows/win.ini -> 404, vereinfacht /windows/win.ini./..%20/windows/win.ini -> dekodiert /.. /windows/win.ini, simplify behielt das Leerzeichen, Unix ENOENT, Win32 aufgelöst /srv/windows/win.ini, 200 Witness.SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
Abschließende Leerzeichen und Punkte pro Pfadkomponente vor simplify entfernen, oder Win32-Opens mit \\?\ präfixen und einen physischen Pfad ablehnen, der nicht unter document-root bleibt.
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt · CVE-2018-19052 alias · CVE-2014-2324 HostGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.