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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
kibana-prototype-pollusion — PoC وتحليل لـ Kibana Prototype Pollution RCE (CVE-2019-7609). | Kitploit
أدوات/GitHubGitHub/aleister1102/kibana-prototype-pollusion
تحليل الثغرات الأمنيةتحليل الكودالاستغلالاستغلال تطبيقات الويبالأوراق والأبحاثالتعلم والتعليم
GitHubaleister1102/kibana-prototype-pollusion

kibana-prototype-pollusion

PoC وتحليل لـ Kibana Prototype Pollution RCE (CVE-2019-7609).

عرض المستودع
11منذ 2 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

CVE-2019-7609

إصدارات Kibana قبل 5.6.15 و 6.6.1 تحتوي على ثغرة تنفيذ كود عشوائي في أداة التصور Timelion. يمكن للمهاجم الذي لديه وصول إلى تطبيق Timelion إرسال طلب يحاول تنفيذ كود JavaScript. قد يؤدي ذلك إلى قيام المهاجم بتنفيذ أوامر عشوائية بصلاحيات عملية Kibana على النظام المضيف.

CVSS:

cvss

المدونة: https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/

الحمولة: https://github.com/mpgn/CVE-2019-7609

الهدف

الإعداد:

  • Docker: https://www.elastic.co/guide/en/kibana/8.14/docker.html
  • Docker Compose

الاستخدام:

  • Kibana: https://www.elastic.co/guide/en/kibana/current/development-getting-started.html
  • Timelion: https://www.elastic.co/guide/en/kibana/5.4/timelion.html

التحليل

Timelion

بعد تحليل الورقة:

alt text

بعد معالجة الورقة مسبقًا، لدينا كائن queries:

alt text

ثم، نقوم بالتكرار على مصفوفة queries (التي يتم تحويلها إلى مصفوفة باستخدام طريقة values) ونمرر إلى invoke كلًا من query.function و query.arguments لاستدعاء الدالة.

في دالة invoke، أولاً نحصل على تعريف الدالة بناءً على اسمها (query.function):

alt text

يتضمن تعريف الدالة هذا ثلاثة أنواع من الدوال: fn و originalFn و timelionFn. ثم، يقوم بالتكرار على args (وهي query.arguments) ويحل الوسائط:

alt text

في هذه الحالة، الوسيط في args هو كائن من النوع 'literal' لذلك يقوم فقط بإرجاع القيمة الحرفية:

alt text

في الواقع، القيمة مغلفة في وعد (Promise).

alt text

الوسيط المفهرس هو وسيط يحتوي على كائن byName بداخله مصفوفة q:

alt text

بعد ذلك، ستقوم دالة invoke باستدعاء functionDef.fn، وهي دالة من فئة Timelion، مع جميع الوسائط المفهرسة:

alt text

ستستدعي دالة fn الدالة originalFn، التي تأتي من config.fn حيث config هو tlConfig. وهذه الدالة هي fn من فئة Datasource extends Timelion:

alt text

كما نرى، تستدعي دالة originalFn أخرى تُسمى esFn والتي تُرجع كائن seriesList:

alt text

تُستخدم هذه الدالة لـ "سحب البيانات من مثيل elasticsearch" عن طريق استدعاء دالة callWithRequest.

يبدو seriesList هكذا في Datasource.fn:

alt text

ويبدو هكذا في Timelion.fn:

alt text

بعد معالجة الورقة مسبقًا، قائمة السلسلة (chain) هي:

alt text

وسوف يستدعي الكود resolveChainList لحل قائمة السلسلة:

alt text

سيتم ربط كل سلسلة بوعد (Promise) يتم إرجاعه من دالة تستدعي invoke مع 'first' كـ fnName والسلسلة نفسها كـ args.

يتم الحصول على تعريف الدالة مرة أخرى بالاسم:

alt text

هذه المرة، تتلقى resolveArguments args كمصفوفة وستقوم باستدعاء resolveArguments بشكل متكرر لحل كل وسيط. لكن لدينا وسيط واحد فقط بالفهرس 0. وهذا الوسيط هو كائن به type == chain.

لذا، في حالة التبديل (switch)، ستستدعي دالة invokeChain وتمرر كائن السلسلة إليها:

alt text

داخل استدعاء السلسلة، ستقوم بـ shift على مصفوفة chain. دالة shift ستعيد العنصر الذي تمت إزالته لذا سيكون link هو كائن es:

alt text

لأن نوع es ليس 'chain' (إنه 'function') و !result هو صحيح (truthy)، يستدعي الكود دالة invoke مع 'first' كـ fnName وكائن es كـ args:

هذه المرة، الإجراء هو نفسه كما سبق لذا نتخطى إلى استدعاء invokeChain مع link هو كائن props:

alt text

مرة أخرى، يستدعي الكود دالة invoke مع 'first' كـ fnName وكائن props كـ args:

alt text

originalFn لـ props الآن هي firstFn بدلاً من fn مثل es وتقبل وسيطًا واحدًا فقط:

alt text

تلك الدالة الأصلية ستستدعي في النهاية الدالة الضعيفة unflatten. في الواقع، ستستدعي أولاً دالة fn الخاصة بـ Timelion. ثم fn ستستدعي originalFn الخاصة بـ props:

alt text

firstFn لـ props ستتجاهل الخصائص inputSeries و global في كائن byName الخاص بـ args:

alt text

لذا فإن data التي تم تمريرها إلى unflatten ستكون:

{
    label.__proto__.env.AAA: "a"
}

الإثبات:

alt text

Unflatten

استخدم props(label.__proto__.env.AAA="a"). ستبدو data هكذا:

alt text

في التكرار الأول، prop = '' غير موجود، فسيقوم بتعيين cur[''] = {}. هذا يعني أن result سيكون له أيضًا خاصية باسم '' بقيمة كائن فارغ. بعد ذلك، يتم تعيين cur على {}، وهي القيمة المرجعة من التعيين السابق (كل من cur و cur[prop] يشيران إلى نفس الكائن):

alt text

الآن، ستصبح prop هي 'label':

alt text

كما في السابق، سيكون لـ result خاصية 'label' وستصبح prop هي __proto__:

alt text

تنزيل الأداة