
Herramienta de descubrimiento de escalada de privilegios en Windows que analiza los registros de arranque de Process Monitor para identificar secuestro de DLL, ACL débiles y otras rutas de elevación, generando automáticamente código fuente de DLL proxy.
Enable Boot Logging.

raw.PML.Ctrl-R.boot.PML.Crassus.exe boot.PML.results.csv.Accenture creó una herramienta llamada Spartacus, que encuentra oportunidades de secuestro de DLL en Windows. Usando Spartacus como punto de partida, creamos Crassus para ampliar las capacidades de descubrimiento de escalada de privilegios en Windows más allá de simplemente buscar archivos faltantes. Los ACL utilizados por los archivos y directorios de procesos privilegiados pueden encontrar más que solo buscar archivos faltantes para lograr el objetivo.
...pero con un giro, ya que Crassus utiliza el Monitor de procesos de SysInternals y analiza archivos de registro PML sin procesar. El uso típico es generar un registro de arranque usando Process Monitor y luego analizarlo con Crassus. También generará automáticamente código fuente para DLLs proxy con todas las exportaciones relevantes para DLLs vulnerables.
version.dll, Crassus creará archivos version.cpp y version.def para ti con todas las exportaciones incluidas. Por defecto, las DLLs proxy lanzarán calc.exe. Se incluyen scripts de compilación para construir las DLLs en Visual Studio o MinGW.La idea general de cómo funciona Crassus se puede resumir en este diagrama de flujo:






Crassus se desarrolló como un proyecto de Visual Studio 2019. Para compilar Crassus.exe:
Crassus.slnCtrl+Shift+B en tu tecladoSi confías en ejecutar código de otras personas sin saber qué hace, Crassus.exe se proporciona en este repositorio.
Enable Boot Logging.

Ctrl-R.boot.PML. La razón para volver a guardar el archivo de registro es doble:
| Argumento | Descripción |
|---|---|
<PMLFILE> | Ubicación (archivo) del archivo de registro de eventos de ProcMon existente. |
--verbose | Habilita la salida detallada. |
--debug | Habilita la salida de depuración. |
Analiza el registro de arranque de Process Monitor guardado en boot.PML. Todas las rutas vulnerables se guardarán como results.csv y todos los archivos fuente de DLL proxy en el subdirectorio stubs.
C:\tmp> Crassus.exe boot.PML
A continuación se muestra la plantilla que se utiliza al generar DLLs proxy. Para DLLs encontradas por Crassus, la DLL proxy contendrá los mismos nombres de exportación especificados en %_EXPORTS_%, así como los mismos ordinales especificados en el archivo .def. Crassus detectará si la DLL necesita ser compilada como una biblioteca de 32 bits o de 64 bits observando la arquitectura del proceso padre, y etiquetando el código fuente en el campo %_BUILD_AS_% en consecuencia.
Si la DLL real no se puede encontrar usando el registro de Process Monitor, o si el nombre de exportación es problemático, los scripts de compilación recurrirán a crear una DLL sin exportaciones especificadas.
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// Run your payload here.
WinExec("calc.exe", 1);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Payload();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef ADD_EXPORTS
%_EXPORTS_%
#endif
}
Para aplicaciones que utilizan de manera insegura el valor de la variable OPENSSLDIR, se puede colocar un archivo openssl.cnf manipulado en la ubicación indicada. Para este ejemplo, el software cargará C:\tmp\calc.dll. Asegúrate de usar una biblioteca de 32 bits para apuntar a procesos de 32 bits, y una biblioteca de 64 bits para apuntar a procesos de 64 bits.
[openssl_init]
# This will attempt to load the file c:\tmp\calc.dll as part of OpenSSL initialization
# Build scripts should detect whether the calc.dll library needs to be built as 32-bit or 64-bit
/tmp/calc = asdf
La compilación es posible usando el binario cl.exe incluido con Visual Studio. Específicamente:
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
Para automatizar el proceso de compilación, incluyendo especificar si la biblioteca debe ser de 64 bits o de 32 bits:
build.bat..dll.Nota: Debido a un comportamiento desafortunado con vcvarsall.bat, que definitivamente no es un error, puedes encontrar problemas al intentar ejecutar build.bat más de una vez en la misma sesión del Símbolo del sistema para desarrolladores de Visual Studio. Si encuentras un error, simplemente cierra la ventana y ábrela de nuevo.
Si Visual Studio no está disponible, las DLLs proxy se pueden compilar con MinGW-w64 en su lugar. En una plataforma Ubuntu, por ejemplo, MinGW se puede instalar mediante: sudo apt install g++-mingw-w64-x86-64-win32 g++-mingw-w64-i686-win32
# Create a 32-bit DLL
i686-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
i686-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
# Create a 64-bit DLL
x86_64-w64-mingw32-g++ -c -o <target>.o <target>.cpp -D ADD_EXPORTS
x86_64-w64-mingw32-g++ -o <target>.dll <target>.o <target>.def -s -shared -Wl,--subsystem,windows
Para automatizar el proceso de compilación, incluyendo especificar si la biblioteca debe ser de 64 bits o de 32 bits:
bash ./build.sh.dll.Como se describe en VU#114757, versiones antiguas de Acronis contienen múltiples vulnerabilidades de escalada de privilegios.
openssl.cnf en una ubicación que puede ser creada por un usuario no privilegiado.C:\ProgramData\Acronis.Crassus encuentra ambos problemas automáticamente.

Al colocar nuestro archivo curl.dll compilado en el directorio C:\ProgramData\Acronis\Agent\var\atp-downloader\ y reiniciar con un nuevo registro de arranque de Process Monitor, podemos ver que nuestra carga útil que ejecuta calc.exe se ejecuta con privilegios de SYSTEM.

El software vulnerable de Acronis intenta cargar openssl.cnf desde dos ubicaciones diferentes. Colocaremos nuestro archivo de plantilla openssl.cnf en c:\jenkins_agent\workspace\tp-openssl-win-vs2013\17\product\out\standard\vs_2013_release\openssl\ssl, y una carga útil calc.dll de 32 bits en c:\tmp.

Como se describe en VU#240785, versiones antiguas de Atlassian Bitbucket son vulnerables a escalada de privilegios debido a ACL débiles del directorio de instalación. Como con cualquier software de Windows que se instala en una ubicación fuera de C:\Program Files\ u otras ubicaciones restringidas por ACL, depende del instalador del software establecer explícitamente los ACL en el directorio de destino.
Crassus encuentra muchas formas de lograr escalada de privilegios con este software, incluyendo:

En la salida de Crassus, podemos ver que c:\atlassian\bitbucket\7.9.1\elasticsearch\bin\elasticsearch-service-x64.exe es privilegiado, pero como se está ejecutando, no podemos simplemente reemplazarlo. Sin embargo, podemos usar otro truco para secuestrarlo. Podemos renombrar el directorio en el que reside, crear un nuevo directorio con el mismo nombre y colocar nuestra carga útil con el mismo nombre.

Una vez que reiniciamos con un registro de arranque de Process Monitor, podemos ver que nuestro archivo elasticsearch-service-x64.exe colocado se está ejecutando en lugar del real, basado en el icono de la Calculadora de Windows.

Como se describe en VU#287178, versiones antiguas de software de McAfee son vulnerables a escalada de privilegios a través de openssl.cnf. Echemos un vistazo:

Para ver por qué hay dos referencias diferentes a openssl.cnf en este registro de arranque, podemos consultar el archivo results.csv:

Ten en cuenta que la carga del archivo openssl.cnf desde la ruta D:\ requerirá una investigación manual adicional, ya que la viabilidad de cargar dicha ruta depende de la plataforma en cuestión y del acceso que se tenga al sistema. Podría ser posible crear un disco óptico que proporcione un archivo openssl.cnf que también haga referencia a una ruta que se resuelva en la unidad óptica.
SQL Server 2022 no es obviamente vulnerable a escalada de privilegios debido a ACL débiles a menos que se instale en una ubicación no estándar. Si se instala en una ubicación fuera de C:\Program Files, Crassus descubrirá varias posibilidades de escalada de privilegios. La mayoría de las aplicaciones de Windows que incluyen un componente privilegiado parecen ser explotables de esta manera si se instalan en un directorio que no tiene ACL inherentemente seguros.

Si Crassus informa la carga privilegiada de un archivo que un usuario puede colocar o modificar, esto no significa necesariamente que sea un escenario explotable. Si bien Crassus busca tipos de archivo potencialmente interesantes, un archivo de registro de Process Monitor no indicará directamente qué habría hecho el proceso asociado con el archivo si estuviera allí. Podría ser algo tan simple como extraer un icono de programa. Investigar la pila de llamadas de la operación del archivo en Process Monitor puede dar una pista de lo que se habría hecho. O simplemente coloca el archivo e investiga el comportamiento con un nuevo registro de arranque de Process Monitor, si prefieres el camino más fácil de la fuerza bruta. También puedes encontrarte con una biblioteca faltante en la que Crassus no pueda encontrar la biblioteca para saber qué exportaciones deberían estar presentes, o que las exportaciones que Crassus encontró entren en conflicto de una manera que impida la compilación adecuada de la DLL. En tales casos, Crassus recurrirá a crear una DLL que no exporte ningún nombre de función. Dependiendo de cómo la aplicación de destino cargue la biblioteca, la ausencia de nombres de función y/o números ordinales esperados puede impedir que la aplicación de destino cargue la biblioteca correctamente. Este escenario requerirá un esfuerzo manual para determinar cómo debería ser la DLL proxy.
Crassus buscará operaciones de archivos privilegiados para descubrir rutas de interés. Puedes encontrarte con un escenario en el que tanto un proceso privilegiado como uno no privilegiado accedan a una ruta, pero solo el proceso no privilegiado es el que realiza la ejecución de lo que pueda estar presente. Alternativamente, puedes encontrarte con un escenario en el que un proceso padre se ejecute con privilegios, pero pueda generar explícitamente procesos hijos con privilegios más bajos.
Especialmente al instalar software por primera vez, o al instalar actualizaciones, Process Monitor puede registrar una operación de archivo que parece explotable pero que no ocurre cada vez que el sistema arranca. Explotar estas operaciones puede ser posible en el primer reinicio después de que ocurra dicho evento. Para evitar tales casos extremos, confirma que los registros de arranque posteriores contengan las mismas operaciones de archivo informadas en reinicios posteriores.
Ya sea un error tipográfico, un error o una nueva característica, Crassus está muy abierto a contribuciones siempre que estemos de acuerdo en lo siguiente: