
https://hackerone.com/reports/863553
/appsuite/api/oxodocumentfilter&action=addfile को संभालते समय लागू की गई URL सत्यापन तर्क में तीन दोष हैं जिनका उपयोग टाइम ऑफ़ चेक टाइम ऑफ़ यूज़ (ToCToU) SSRF हमले को निष्पादित करने के लिए किया जा सकता है। यह समस्या दुर्भावनापूर्ण अभिनेताओं को आंतरिक नेटवर्क सेवाओं पर HTTP GET अनुरोध निष्पादित करने की अनुमति देती है और संरक्षित जानकारी के रिसाव का कारण बन सकती है।
URITools.getFinalURL विधि में URL सत्यापन तर्क यहाँ लागू किया गया है, ToCToU भेद्यता से ग्रस्त है
URL u = new URL(url);
if (validator.isPresent()) {
Optional<OXException> exception = validator.get().apply(u);
if (exception.isPresent()) {
throw exception.get();
}
}
URLConnection urlConnnection = u.openConnection();
उपरोक्त कोड में, InetAddress.getByName विधि को कॉल करके जांच के समय (validator.get().apply(u)) और उपयोग के समय (u.openConnection()) दोनों पर इनपुट URL होस्टनाम का DNS रिज़ॉल्यूशन किया जाता है। इसलिए यदि कोई हमलावर जांच के समय और उपयोग के समय के बीच DNS रिज़ॉल्यूशन परिणाम को बदल सकता है, तो वह सत्यापक को बायपास कर सकता है। यह दोष अकेले निम्नलिखित सीमाओं के कारण शोषण करना अत्यंत कठिन है
InetAddress.getByName DNS रिज़ॉल्यूशन सफल होने पर 30 सेकंड के लिए और DNS रिज़ॉल्यूशन विफल होने पर 10 सेकंड के लिए DNS रिज़ॉल्यूशन परिणामों को कैश करता है।validator.get().apply(u) और u.openConnection() के बीच समय अंतराल अत्यंत छोटा है (सामान्य URL के लिए एक मिलीसेकंड से भी कम)। इस सीमा को बायपास करने के लिए दोष #2 का उपयोग किया जाता हैAddFileAction.validator URL सत्यापक यहाँ लागू किया गया है, इनपुट URL की लंबाई को मान्य नहीं करता है। बड़े आकार का URL प्रदान करके, हमलावर जांच के समय और उपयोग के समय InetAddress.getByName विधि कॉल के बीच समय अंतराल बढ़ा सकता है। बड़ा समय अंतराल हमलावर को दोष #1 का आसानी से शोषण करने की अनुमति देता है
HostList.contains विधि यहाँ लागू की गई है, यदि इनपुट URL होस्टनाम का DNS रिज़ॉल्यूशन विफल होता है तो गलत (false) लौटाती है
// Need to resolve as last resort
try {
return contains(InetAddress.getByName(toCheck), false);
} catch (UnknownHostException e) {
// Cannot be resolved
return false;
}
AddFileAction.validator यह जांचने के लिए blackImageUrlHostlist.contains विधि को कॉल करता है कि इनपुट URL होस्टनाम या वह IP पता जिसे वह हल करता है, ब्लैकलिस्ट में है या नहीं। यदि कोई हमलावर होस्टनाम के DNS रिज़ॉल्यूशन को विफल कर देता है, तो IP पते की जाँच छोड़ दी जाती है और URL स्वीकार कर लिया जाता है।
एक होस्टनाम randomid.dns.pointer.pw पर विचार करें जिसका आधिकारिक नेमसर्वर हमलावर द्वारा नियंत्रित है। हमले की रणनीति randomid.dns.pointer.pw के DNS रिज़ॉल्यूशन को जांच के समय (validator.get().apply(u);) विफल करना और उपयोग के समय (u.openConnection()) सफल करना है। यह हमलावर को IP पता ब्लैकलिस्ट फ़िल्टर को बायपास करने और किसी भी ब्लैकलिस्टेड IP पते पर HTTP GET अनुरोध निष्पादित करने की अनुमति देता है। हमलावर इस हमले को निष्पादित करने के लिए निम्नलिखित चरणों का पालन कर सकता है
{"add_imageurl": "http://randomid.dns.pointer.pw"} के साथ addfile क्रिया निष्पादित करके सर्वर पर InetAddress.getByName कैश को ट्रिगर करें। इस समय, आधिकारिक DNS सर्वर SERVFAIL स्थिति लौटाकर randomid.dns.pointer.pw के DNS रिज़ॉल्यूशन को विफल करने के लिए सेट किया जाएगा। InetAddress.getByName इस विफलता परिणाम को 10 सेकंड के लिए कैश करेगाpointer.pw के आधिकारिक नेम सर्वर को बताएं कि होस्टनाम randomid.dns.pointer.pw के टाइप A DNS अनुरोधों के लिए 127.0.0.1 लौटाएInetAddress.getByName जांच के समय कैश्ड प्रतिक्रिया (SERVFAIL) लौटाए और उपयोग के समय (url.openConnection()) 127.0.0.1 लौटाएadd_imageurl मान को http://u{25MB}:[email protected]/path/to/internal/resource.png प्रारूप पर सेट करके SSRF अनुरोध निष्पादित करें। यहाँ u{25MB} का अर्थ है कि उपयोगकर्ता नाम भाग 25 x 1024 x 1024 वर्णों की एक स्ट्रिंग हैhttps://golang.org/dl/ से golang स्थापित करें
कम से कम 4GB RAM वाली वर्चुअल मशीन में गाइड https://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Installation_Guide_for_Debian_9.0 और https://oxpedia.org/wiki/index.php?title=AppSuite:Documents_Installation_ Guide#Debian_GNU.2FLinux_9.0_.28valid_from_v7.10.29 का पालन करके Open-Xchange और Documents स्थापित करें
poc.zip फ़ाइल डाउनलोड और निकालें
टर्मिनल / कमांड लाइन खोलें और वर्तमान निर्देशिका को निकाले गए poc.zip फ़ोल्डर पर सेट करें
कमांड चलाएँ
go run . -serverRoot="http://172.16.66.130" -username="testuser" -password="secret" -targetPath="appsuite/v=7.10.3-9.20200409.083030/apps/themes/logo.png" -targetPort="80" -payloadSize=25 -startSleepDuration=6600
जहाँ 172.16.66.130 VM का IP पता है