Upload
others
View
27
Download
0
Embed Size (px)
Citation preview
CMD Hijack a command/argument confusion with path traversal in cmd.exe
Julian Horoszkiewicz: Researcher
لورقة البحثية: رابط ا
https://vxug.fakedoma.in/papers/VXUG/Mirrors/CmdHijackacommandargumentconfusionwithpa
thtraversalincmdexe.pdf
.أسألكم الدعاءهذا العمل تطوعي بهدف نشر هذه األبحاث للعالم العربي،
.0x1411أنا لست خبيراً في الترجمة، إن رأيت أي خطأ أو ترغب في االقتراح أو التواصل، قم بإرسال رسالة على تويتر
https://twitter.com/julianpentesthttps://vxug.fakedoma.in/papers/VXUG/Mirrors/CmdHijackacommandargumentconfusionwithpathtraversalincmdexe.pdfhttps://vxug.fakedoma.in/papers/VXUG/Mirrors/CmdHijackacommandargumentconfusionwithpathtraversalincmdexe.pdfhttps://twitter.com/0x1411
بعد عدة أسابيع من البحث المتقطع. cmd.exeوجدته في سأشرح في هذه الورقة تصرف غريب ومدهش
في هذه الفترة كنت أحاول:
( بين أوامر التحقق من/فلترة الكود Encoding Mismatch)العثور على عدم تطابق في التشفير -١
Existing Commandلفواصل األمر الحالي ) ASCIIوباقي البرنامج، مما يتيح لي تهريب ال
Separators ).في البايت الثانية ألحد الكاركترز، للحظة ظننت أني تمكنت من ذلك لكني كنت مخطأ
.Unix shell’s backtrick operatorالغير ظاهرة ل cmd.exeإكتشاف بعض نظائر -٢
والذي تسبب سابقاً في العثور على ثغرة ال زالت موجودة لكن n\ ,& ,|العثور على أمر فاصل مشابه ل -۳
https://vuldb.com/?id.93602 نادرة وهي
https://vuldb.com/?id.93602
للكسالى الذين ليس لديهم صبر لقراءة الورقة البحثية كاملة، هذا ما اكتشفت:
ندوز بالخصائص التالية:يتمت التجربة على إصدار و١- Windows 10 Pro x64 (Microsoft Windows [Version 10.0.18363.836])
٢- cmd.exeversion: 10.0.18362.449
۳- CMD SHA256:FF79D3C4A0B7EB191783C323AB8363EBD1FD10BE58D8BCC96B07067743CA81D5
ومن المفترض أن تعمل على اإلصدارات السابقة.
شرح بعض التفاصيل لنبدأ ."cmd.exe /c "ping 127.0.0.1بهذا األمر: بداية
وشبيهاتها(. ()PHP shell_execبالتحديد يُستخدم من البرامج لتنفيذ أوامر للنظام مثل الدالة )هذا األمر
.pingيتم اختياره من المستخدم في برنامج يقوم بتشغيل أمر آخر، في حالتنا هذه هو 127.0.0.1الحد
عن pingة بدالً من األمر بتشغيل تطبيق اآللة الحاسب (cmd.exe)اآلن يستطيع المستخدم خداع موجه األوامر
أو بإضافة windows/system32/calc.exe/../../../../../../../../../../127.0.0.1طريق إضافة الحد
مسار أي تطبيق آخر، وموجه األوامر سيقوم بتنفيذه.
"cmd.exe /c "ping 127.0.0.1/../../../../../../../../../../windows/system32/calc.exeاألمر الكامل:
يمكن استخدام هذه الخدعة في العديد من الهجمات مثل:
1- Denial of Service.
2- Information Disclosure.
3- Arbitrary Code Execution.
التالي: PHPسأقوم بتجربة هذه الطريقة على تطبيق ويب، ألق نظرة على كود
هذا الكود ليس به ثغرة معروفة تمكننا من حقن موجه األوامر )بإستثناء ()escapeshellcmdبسبب استخدام الدالة
(.RCEحقن الحدود لكنه لن يمكننا من العثور على ثغرة
بدالً من تلك، وأنتم محقون، هذه الخدعة ()escapeshellargبعض منكم جاء في باله أنه من الممكن استخدام الدالة
كانت الحدود المحقونة بين عالمات تنصيص.لن تعمل في حالة
أكثر شيوعاً، والذي الحظته ()escapeshellarg بدالً من ()escapeshellcmdعلى أي حال، استخدام الدالة
والذي CVE-2020-12743و CVE-2020-12742و CVE-2020-12669أثناء العثور وتسجيل الثغرات
في برامج مفتوحة المصدر PHP( أكواد Scan)انتهى بقضاء أسبوع أخر في تشغيل أكواد أوتوماتيكية لتقوم بمسح
من التطبيقات ، أنا متأكد من أن هناك العديدSCA toolوالتدقيق في النتائج، تم هذا باستخدام األداة التي قمت بتطويرها
المصابة بهذا النوع من الثغرات، لكن ليس لدي وقت للبحث أكثر.
https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-12669https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-12742https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-12742https://cve.mitre.org/cgi-bin/cvename.cgi?name=2020-12742https://github.com/ewilded/SCARY
An extended PoC:
. RCEخطورة إستخدام هذه الثغرة في العثور على
بدون الحاجة للتحكم في أي ملف في الجهاز الضحية وبدالً من RCEأنا متأكد من إمكانية تحويل تلك الثغرة ل
ذلك سيتم إرسال البايلود في موجه األوامر مباشرة.
على سبيل المثال:
يقوم بتنفيذ:
c:\windows\system32\calc.exe with command line equal ping 127.0.0.1/../../../../../../../windows/system32/calc.exe
وكما تم التوضيح سابقاً، من الممكن اإلستيالء على تنفيذ البرامج حتى في حال إضافة العديد من الحدود، والذي
سيؤدي لشبيه باألمر التالي:
ping THE PLACE FOR THE RCE PAYLOAD ARGS 127.0.0.1/../../path/to/lol.bin
كاملة، الذي RCEمناسب للتعامل مع الحدود الغير صحيحة من الممكن أن يؤدي إلى ثغرة LOLBinباستخدام
يجب أن يستقبل/يتجاهل الحد األول )والذي يكون مكتوب مسبقاً، كما في LOLBinنحتاجه في مثالنا السابق من
ضاُ أن يستقبل/يتجاهل الحد األخير.(، ويجب أيpingمثالنا
والذي يستقبل أكثر /project.github.io/lolbas/Binaries/Ieexec-https://lolbasعلى سبيل المثال:
من حد ويقوم بتجاهل الغير صحيح منهم.
https://lolbas-project.github.io/https://lolbas-project.github.io/lolbas/Binaries/Ieexec/
استخدام باورشل، فمثالً تنفيذ األمر التالي:أيضاً كنت أفكر في
يجعل باورشل يقوم باألمر:
، نعم أعلم أن الفاصلة ping.exeبعد تشغيل calc.exeتوقعت أن يقوم بمعاملة األمر كنص وأن يقوم بتشغيل
Command، لكنها ليست أمر فاصل )calcعن ping( مستخدمة هنا لفصل Semicolonالمنقوطة )
Separator في )cmd.exe في الباورشل، على أي حال تقريباً كل أنظمة التشغيل تقوم بتصفيتها وحظرها ألن
الفاصلة المنقوطة هي أمر فاصل في أنظمة تشغيل يونكس.
، EncodedCommand–كما في أمر الباورشل base64للحصول على أمر حقن مدعوم يجب أن يكون مشفر ب
غيله حتى وإن جاء بعد نص ال يمكننا التحكم به، تلك المحاولة أدت لتشغيل الباورشل في وضع لقد عثرت على طريقة لتش
interactive .بدالً من معاملة النص المدخل كمجموعة من األوامر للتنفيذ
تحليل أعمق
وتحليل النتائج باستخدام HTTP with Burpعن طريق PHPعثرت على تلك الخدعة أثناء تجربتي لبعض كود
Procmon بعد إضافة بعض الفالتر المناسبة، كما قمت بكتابةcmd.exe fuzzer بعد الحصول على بعض النتائج ،
.x64dbgو Ghidraستاتيكي باستخدام ر أسابيع من التحليل االالمحبطة والمملة على مدا
، mainوالتي تُستدعى من Initوالتي يتم استدعائها من CheckSwitchesيبدأ بالدالة cmd.exeأمر تنفيذ
للتنفيذ معه، مثل cmd.exe( تم استدعاء Switchمسئولة عن تحديد أي محول ) CheckSwitchesالدالة
(/c, /k, /v:on etc الالئحة الكاملة للخيارات يمكن العثور عليها عن طريق ،)cmd.exe /? help استغرقت ،
عملية التحليل الكثير من الوقت للعثور على محوالت مخفية أو مشاكل في المنطق تمكنني من إدخال بعض
المحوالت عن طريق إخراجها من عالمات التنصيص.
https://github.com/ewilded/shelling/blob/master/fuzzing/cmd-fuzzing.c
بة إلى األمر المفترض تنفيذه )بداخل عالمات التنصيص(، والذي يكون تنتقل عملية الحوس c/إذا تم كشف المحول
من أشهر المحوالت استخداماً وسأناقش في باقي الورقة هذا المحول بتفصيل أكبر.
r/يمكن الحصول على نفس الوضع باستخدام المحول
افات من بداية األوامر(، وجدت دالة بعد القليل من التحليل والتجربة وإضافة بعض التعديالت )مثل إزالة المس
موضحة لنفسها
mainCRTStartupنقطة البداية دعن breakpoint، قمت بوضع debuggingمشوق! حان وقت بعض ال
Debug > Restartعن طريق cmd.exeثم بداية
SearchForExecutableعند الدالة breakpointسأقوم أيضاً بوضع
باإلضافة cmd.exe /cيقوم بتجاوز cmd.exeالمناسب )بعد عالمة التنصيص الثنائية ذاكما نرى أن األمر
.CheckSwitches(، أيضاً القيمة الموجودة في أعلى الستاك تحتوي على عنوان يشير للدالة R15و RBXل
ي هذه ، لكن فSearchForExecutable، سنقوم بتشغيل العنصر الثاني من F9إذا قمنا بالضغط على زر
، في حين أن اإلستدعاء األصلي كان من دالة أخرى تسمى RAX, RDI, R11المرة سيُخزن نص األمر في
ECWork.
ping.exeالعنصر الثاني يقوم بإعادة المسار الكامل ل
.SearchForExecutable، مع إستدعاء للدالة ECWorkإذا نظرنا على الصورة القادمة سنجد الدالة
، الحظ Returnقام باإلعادة SearchForExecutableاآلن إذا نظرنا للصورة القادمة سنجد أن إستدعاء الدالة
أمراً ستجد إستدعاء للدالة ١٥، بعد R14والمشار إليه في العنوان الموجود في ping.exeالمسار الكامل ل
ExecPgm .والتي ستقوم بإستخدام المسار الجديد إلنشاء عملية حوسبة جديدة
، ping 127.0.0.1باإلضافة للنص الكامل ل SearchForExecutableمن هنا، رؤية إستدعاء الدالة
يوضح خلل بين األمر الكامل وإسم الملف الحقيقي، لذا أردت التأكد من إمكانية اإلستيالء على تنفيذ العملية عن
طريق إنشاء واحد إضافي بنفس اإلسم الموجود في أمر التنفيذ والذي سيمكننا من تشغيل:
باستخدام أن يفتحها cmd.exeحتى أرى ما الملفات التي حاول Procmonمشوق! قررت أن ألقي نظرة على
CreateFile.
في ping .PNGبإستخدام اسم ملف اسمه حرفياً calc.exeلذا نعم، النتائج أكدت من فتح ملفات نسخ من
المجلد الحالي.
لو لم أنشأ الملف في البداية. Operation = CreateFileلم يكن بإمكاني مشاهدة النتائج باستخدام الفلتر
، NAME NOT FOUNDوتكون النتيجة CreateFileتقوم بإستدعاء cmd.exeقد يتوقع أحدهم أن يرى
يقوم بالتأكد من cmd.exe، لكن ليس في هذه الحالة، ألن potential DLLتيادية هي البحث عن الطريقة االع
.QueryDirectoryعن طريق استدعاء الدالة CreateFileوجود الملف قبل استدعاء الدالة
Payload’s Magic Stringمن األفضل تحديد الفلتر بناء على Procmonلهذا السبب، أثناء استخدام
الواقعة في المسار بدالً من الفلترة بناء على العملية.
حتى أتمكن من إدخال بعض البايلودس المجهزة لهذا السبب بإستخدام cmd.exe fuzzerفكرت في تعديل
psychoPATH علىcmd.exe لكن لم يحدث هذا بعدما رأيت عند ضغطي مرة أخرى على ،F9.
Subdirectoryوالذي يتشابه مع ال c:\windows\system32\calc.exeفي calc.exeيتواجد
الموجودة!!
https://github.com/ewilded/shelling/blob/master/fuzzing/cmd-fuzzing.chttps://github.com/ewilded/psychoPATH
.SearchForExecutableقمت بالبحث أكثر في الدالة
path-us/dotnet/standard/io/file-https://docs.microsoft.com/en-في هذه األثناء قابلني
formats .)يحتوي على إجابة لمعظم تساؤالتي(
ليه ومن ثم التبليغ لمايكروسوفت، بعد أقل من أسبوع تم مراجعة بعد االكتشاف، قمت بكتابة تقرير عما توصلت إ
بحثي، بعد أسبوع آخر جاء الرد منهم أن هذا البحث ال يتطابق مع معايير مايكروسوفت حتى يُعد مصدر تهديد.
https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formatshttps://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formatshttps://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats
لم تتناسب تلك الثغرة معهم!! CVEلقد خاب ظني، بعد أن توقعت إستالم
لعدم نشر ما توصلت إليه وأعتقد أنه يمكننا اللعب بهذه الخدعة لبعض الوقت، بما على األقل ال يوجد ما يدعوني
أنها ليست ثغرة، إذاً فهي طريقة جديدة.
-----
تم بحمد هللا وتوفيقه.كثر في مثل هذه األبحاث بطريقة أخالقية تعود بالنفع وتساهم في بناء عالم أ الموجودة الرجاء استخدام المعلومات
دم إستخدامها في إحداث أي ضرر أو إنتهاك خصوصية أحدهم، أنتم المسئولون أمام هللا.عوأماناً،