
vsftpd 3.0.5 - उच्च - रिमोट - विशेषाधिकार शेष - ब्रेस deny_file .private/secret को छोड़ देता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-deny-file-brace-child
Class: Privilege leftover Reach: Remote
vsftpd 3.0.5 - Chris Evans
मैन पेज (vsftpd.conf.5) का उदाहरण है deny_file={*.mp3,*.mov,.private}। मेल खाते नाम "किसी भी तरह से सुलभ नहीं होने चाहिए," जिसमें "डाउनलोड, डायरेक्टरी में बदलना, डायरेक्टरी के भीतर किसी चीज़ को प्रभावित करना" शामिल है। vsf_access_check_file (access.c:16-43) क्लाइंट पाथ पर जैसा दिया गया है vsf_filename_passes_filter को कॉल करता है, फिर पूरे ब्रेस ट्यूनबल का str_locate_str करता है। फ़िल्टर अंतिम-घटक / प्रीफ़िक्स से मेल खाता है; बचा हुआ /secret विफल होता है; {*.mp3,*.mov,.private} का सबस्ट्रिंग मिस हो जाता है।
CWD .private अस्वीकृत है (बेसनेम हिट करता है)। RETR .private/secret और RETR dir/.private सफल होते हैं। यही "डायरेक्टरी के भीतर" वह चीज़ है जिसे यह leftover तोड़ता है।
CVE-2015-1419 एक सार्वजनिक डिस्ट्रो realpath/basename पैच है। आधिकारिक 3.0.5 ने इसे कभी नहीं लिया। Debian की ब्रेस ब्रांच अभी भी पूरे पाथ से मेल खाती है, इसलिए यह चाइल्ड वॉक पैच किए गए डिस्ट्रो पैकेजों पर भी बना रहता है। 2015-1419 को दोबारा फ़ाइल न करें।
यह leftover एक कॉन्फ़िग-गेटेड डिनाई-लिस्ट मिस है। यह unauth RCE नहीं है, chroot escape नहीं है, और होस्ट /etc रीड नहीं है।
| ID | अभी तक कोई CVE नहीं |
| Class | Privilege leftover |
| Reach | Remote (प्रमाणित FTP) |
| CWE | CWE-863, CWE-22 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Product | vsftpd (Chris Evans) |
| Affected | vsftpd 3.0.5 आधिकारिक tarball SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3 |
| Auth | प्रमाणित FTP USER/PASS (लैब में anonymous)। deny_file एक ब्रेस लिस्ट पर सेट (डिफ़ॉल्ट unset) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1। Anonymous read-only। Witness फ़ाइल। |
कौन: एक प्रमाणित FTP उपयोगकर्ता (लैब में anonymous ftp)। सामान्य vsftpd drop के बाद सेशन UID। deny_file वह अतिरिक्त नीति है जो उस UID से क्षमताएँ छीनने वाली थी। मैन पेज में बताए गए virtual-user रेसिपी guest_username साझा करते हैं, इसलिए Unix DAC उन्हें अलग नहीं करता। tunable_deny_file NULL के साथ स्टॉक 3.0.5 यह leftover नहीं है।
| Method + sink | Privilege |
|---|---|
RETR .private/secret प्रलेखित ब्रेस deny_file={*.mp3,*.mov,.private} के साथ | handle_retr str_open एक ऐसी फ़ाइल की जिसका डायरेक्टरी नाम deny लिस्ट पर है, सेशन uid के रूप में। लैब: 150/226, 37 बाइट्स, बॉडी VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS |
RETR dir/.private | वही sink। किसी अन्य डायरेक्टरी के अंतर्गत .private नाम की फ़ाइल (must_match_at_current_pos इंडेक्स > 0 पर मैच अस्वीकार करता है)। लैब: 150/226, बॉडी DIRDOT-VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS |
vsf_access_check_file गेट से अनुमानित; लैब read-only था)| Method + sink | Privilege |
|---|---|
STOR / APPE वही पाथ जब write_enable=YES | handle_upload_common सेशन uid के रूप में create / overwrite |
DELE / RNTO वही पाथ | str_unlink / उस नाम का rename जिसे denylist रोकने वाली थी |
| Method + sink | Privilege |
|---|---|
LIST .private/x (या denied ट्री के अंदर LIST) | handle_dir_common पूरे arg का access-check करता है (मिस), फिर स्लैश स्प्लिट के बाद .private प्रीफ़िक्स का str_opendir। केवल नाम। Unix DAC अभी भी लागू |
LIST .private/x (या denied ट्री के अंदर LIST) | handle_dir_common पूरे arg का access-check करता है (मिस), फिर स्लैश स्प्लिट के बाद .private प्रीफ़िक्स का str_opendir। केवल नाम। Unix DAC अभी भी लागू |
| Method + sink | Result |
|---|---|
CWD .private | 550 Permission denied। बेसनेम .private ब्रेस हिट करता है |
RETR song.mp3 | 550। *.mp3 एक अंतिम-घटक पैटर्न है और मैच करता है |
CWD .private स्वयं (बेसनेम हिट करता है)hide_file LIST hide (readdir से बेसनेम; छिपे नाम का RETR प्रलेखित इच्छित है)/etchttp_enable डिफ़ॉल्ट off; FTP-mode GET सेशन को मार देता है)deny_file=.private सबस्ट्रिंग फ़ॉलबैक से बच जाता है (.private/secret में .private का str_locate_str)मैंने GitHub मिरर या Debian/Fedora ट्री के बजाय आधिकारिक vsftpd 3.0.5 (SHA-256 26b602ae...c91d3) को पिन किया। उन्नीस सोर्स हंट्स। डिफ़ॉल्ट कंपाइल किए गए डेमन में कोई अप्रकाशित Critical/High leftover नहीं है। इसके लिए ऑपरेटर को मैन-पेज ब्रेस उदाहरण कॉपी करना आवश्यक है।
vsf_filename_passes_filter (ls.c) * / ? / unnested {,} से मेल खाता है और केवल अंतिम-घटक पैटर्न पर उपयोगी काम करता है। नाम .private/secret के लिए {*.mp3,*.mov,.private} के विरुद्ध:
*.mp3, *.mov, .private को .private/secret की शुरुआत में मैच किया जाता है। बचा हुआ /secret विफल होता है जब तक कि टोकन * न हो।{*.mp3,*.mov,.private} को खोजता है और मिस कर देता है।गलत मोड़ पहले से सार्वजनिक: CVE-2015-1419 केवल डिस्ट्रो realpath है। आधिकारिक Changelog में ऐसा कोई फ़िक्स नहीं है। Debian की ब्रेस ब्रांच भी पूरे normalized पाथ को कॉपी करती है, इसलिए चिल्ड्रन अभी भी वॉक करते हैं।
cd lab
./run.sh
लूपबैक कंट्रोल 127.0.0.1:18710, PASV 18711-18718। Compose प्रोजेक्ट vsftpd-deny-file-brace-child। आधिकारिक 3.0.5 tarball, anonymous read-only, deny_file={*.mp3,*.mov,.private}। Witness VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS। अंतिम पंक्ति:
SUCCESS vsftpd-deny-file-brace-child cwd-dotprivate=550 retr-child=yes retr-dir-dotprivate=yes mp3=550 VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS
ब्रेस alts को हर पाथ घटक के विरुद्ध मैच करें, या फ़िल्टर से पहले realpath / basename करें (सामान्य symlink चेतावनियों के साथ)। प्रलेखित उदाहरण को वास्तव में चिल्ड्रन को deny करना चाहिए।
Vendor intake [email protected] (vsftpd) है। किसी भी vsftpd मिरर पर सार्वजनिक GitHub issue न खोलें।
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]