
lighttpd 1.4.85 - High - Remote - Path - native Win32 GET /..%20/ document-root के बाहर पढ़ता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
राइट-अप: https://abraxaslabs.tech/research/lighttpd-win32-dotdot-space
वर्ग: फ़ाइल पठन पहुँच: रिमोट
lighttpd 1.4.85 (4852959) - lighttpd
नेटिव _WIN32 staticfile, buffer_path_simplify के बाद document-root को rel_path से जोड़ता है। Simplify केवल तब ../ को फोल्ड करता है जब तीसरा बाइट / हो। http_response_prepare_physical केवल पूरे पथ से अनुगामी स्पेस और डॉट्स को हटाता है। इसलिए GET /..%20/windows/win.ini /.. /windows/win.ini ही रहता है। फिर \\?\ प्रीफ़िक्स के बिना _wstati64 / _wopen Win32 को प्रति-घटक स्पेस हटाने देते हैं और उस सेगमेंट को .. मान लेते हैं।
नेटिव Windows lighttpd पर अनप्रमाणित GET/HEAD, document-root के बाहर की उस नियमित फ़ाइल को पढ़ता है जिसे वर्कर अकाउंट खोल सकता है। Unix/Linux इस अवशेष में नहीं आता। यह फ़ाइल पठन है, RCE नहीं।
लैब उन पिन फ़ंक्शन्स का एक गैजेट है। यह लाइव नेटिव Win32 वर्कर नहीं है। अंतिम पंक्ति how=gadget का उपयोग करती है।
| ID | अभी कोई CVE नहीं |
| वर्ग | फ़ाइल पठन (पथ ट्रैवर्सल, नेटिव Win32 ..%20/) |
| पहुँच | रिमोट (अनप्रमाणित GET/HEAD) |
| CWE | CWE-22 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| उत्पाद | lighttpd1.4 |
| प्रभावित | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) नेटिव _WIN32 |
| प्रमाणीकरण | कोई नहीं। डिफ़ॉल्ट mod_staticfile |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1, how=gadget |
नेटिव Windows lighttpd की आवश्यकता है जो स्टैटिक फ़ाइलें सर्व कर रहा हो। वर्कर अकाउंट को लक्ष्य नियमित फ़ाइल खोलने में सक्षम होना चाहिए।
| विशेषाधिकार | विधि / सिंक | लैब-प्रमाणित या अनुमानित |
|---|---|---|
document-root के बाहर की फ़ाइल पढ़ना | अनप्रमाणित GET /..%20/<name> | लैब-प्रमाणित (गैजेट)। HTTP 200 बॉडी पैरेंट सीक्रेट है |
गैर-अंतिम .. घटक पर अन्य अनुगामी ASCII स्पेस/डॉट के लिए समान वर्ग | url-decode फिर simplify .. रखता है | %20 के लिए लैब-प्रमाणित। अन्य अनुगामी स्पेस/डॉट के लिए अनुमानित |
| उसी पथ पर HEAD | staticfile HEAD | अनुमानित। लैब ने GET का उपयोग किया |
नकारात्मक: वास्तविक /../ | buffer_path_simplify ../ को फोल्ड करता है | लैब-प्रमाणित। 404, सरलीकृत /windows/win.ini, कोई विटनेस नहीं |
| नकारात्मक: अनसिम्प्लिफ़ाइड भौतिक स्ट्रिंग का Unix POSIX open | open("/srv/htdocs/.. /windows/win.ini") | लैब-प्रमाणित। ENOENT |
इस अवशेष पर बंद: Unix/Linux staticfile; Cygwin (समान स्ट्रिप, POSIX open); 1.4.85 %5C parseopt; CVE-2018-19052 alias; CVE-2014-2324 Host। RCE नहीं। राइट नहीं।
मैंने टैग lighttpd-1.4.85 को पिन किया। बीस शिकार। डिफ़ॉल्ट Unix/Linux staticfile, FastCGI, proxy, TLS, auth, HTTP/2, alias/rewrite: इस बार पर कोई नहीं। 1.4.81-1.4.85 पार्सर लहर ने पहले ही trailers, CGI हेडर विरोधाभास, और अमान्य बैकएंड Content-Length को बंद कर दिया था।
buffer_path_simplify केवल तब ../ को फोल्ड करता है जब walk[2] == '/' हो। http_response_prepare_physical (src/response.c 334-360) में WIN32 स्ट्रिप पूरे-पथ का टेल है। _wstati64 / _wopen (src/fs_win32.c 24-77) \\?\ के बिना UTF-16 पास करते हैं, इसलिए Win32 प्रति-घटक अनुगामी स्पेस हटाता है और .. .. बन जाता है। भौतिक जॉइन doc_root + rel_path है जिसमें स्टैट के बाद कोई basedir जाँच नहीं है।
गलत मोड़ जो पहले से दर्ज हैं: Unix ENOENT को "बग नहीं" मानना (यह नकारात्मक नियंत्रण है); Cygwin को मूल Win32 कहना; यह दावा करना कि 1.4.85 %5C यही अवशेष है; फ़ाइल पढ़ने को RCE तक बढ़ा-चढ़ाकर बताना। नाटक: एक रिवर्स शेल। ओरेकल document-root के पैरेंट से आने वाला 200 बॉडी है।
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
या
cd lab
./run.sh
लैब buffer_urldecode_path, buffer_path_simplify (Win32 '\\' मैप), response.c टेल स्ट्रिप, और \\?\ के बिना _wstati64 का एक निष्ठावान गैजेट है। Unix POSIX open नकारात्मक नियंत्रण है। Win32 resolve को समान प्रति-घटक ट्रेलिंग-स्पेस स्ट्रिप, फिर . / .., फिर resolved पथ के POSIX open के रूप में लागू किया गया है। लूपबैक HTTP 127.0.0.1:19400।
/index.html -> 200 public-index, कोई witness नहीं।/../windows/win.ini -> 404, सरलीकृत /windows/win.ini।/..%20/windows/win.ini -> डिकोड किया गया /.. /windows/win.ini, simplify ने स्पेस रखा, Unix ENOENT, Win32 ने /srv/windows/win.ini resolve किया, 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
simplify से पहले प्रत्येक पथ घटक के अनुसार अनुगामी स्पेस और डॉट्स को हटा दें, या Win32 ओपन को \\?\ के साथ उपसर्ग करें और ऐसे भौतिक पथ को अस्वीकार करें जो document-root के अंतर्गत न रहे।
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. देखें LICENSE. केवल लूपबैक लैब। कोई वारंटी नहीं।