
Outil de découverte d'escalade de privilèges Windows qui analyse les journaux de démarrage de Process Monitor pour identifier les détournements de DLL, les ACL faibles et autres chemins d'élévation, générant automatiquement le code source de la DLL proxy.
Enable Boot Logging.

raw.PML.Ctrl-R.boot.PML.Crassus.exe boot.PML.results.csv.Accenture a créé un outil appelé Spartacus qui détecte les opportunités de détournement de DLL sur Windows. En utilisant Spartacus comme point de départ, nous avons créé Crassus pour étendre les capacités de découverte d'élévation de privilèges Windows au‑delà de la simple recherche de fichiers manquants. Les listes de contrôle d'accès (ACL) utilisées par les fichiers et répertoires des processus privilégiés peuvent révéler plus que la simple recherche de fichiers manquants pour atteindre l'objectif.
… mais avec une particularité : Crassus utilise le Process Monitor de SysInternals et analyse les fichiers journaux PML bruts. L'utilisation typique consiste à générer un journal de démarrage avec Process Monitor, puis à l'analyser avec Crassus. Il génère également automatiquement le code source des DLL proxy avec toutes les exportations pertinentes pour les DLL vulnérables.
version.dll, Crassus générera les fichiers version.cpp et version.def avec toutes les exportations incluses. Par défaut, les DLL proxy lancent calc.exe. Des scripts de compilation sont fournis pour compiler les DLL avec Visual Studio ou MinGW.Le principe général de fonctionnement de Crassus peut être résumé dans cet organigramme :






Crassus a été développé comme un projet Visual Studio 2019. Pour compiler Crassus.exe :
Crassus.slnCtrl+Shift+B sur votre clavierSi vous avez confiance en l'exécution de code écrit par d'autres sans savoir ce qu'il fait, Crassus.exe est fourni dans ce dépôt.
Enable Boot Logging.

Ctrl-R.boot.PML. La raison de ce ré‑enregistrement est double :
| Argument | Description |
|---|---|
<PMLFILE> | Emplacement (fichier) du fichier journal ProcMon existant. |
--verbose | Active la sortie détaillée. |
--debug | Active la sortie de débogage. |
Analyse le journal de démarrage de Process Monitor sauvegardé dans boot.PML. Tous les chemins vulnérables seront sauvegardés dans results.csv et tous les fichiers source des DLL proxy dans le sous‑répertoire stubs.
C:\tmp> Crassus.exe boot.PML
Voici le modèle utilisé lors de la génération des DLL proxy. Pour les DLL trouvées par Crassus, la DLL proxy contiendra les mêmes noms d'exportation que ceux spécifiés dans %_EXPORTS_%, ainsi que les mêmes ordinaux que ceux spécifiés dans le fichier .def. Crassus détecte si la DLL doit être compilée en 32 bits ou en 64 bits en examinant l'architecture du processus parent, et marque le code source dans le champ %_BUILD_AS_% en conséquence.
Si la DLL réelle ne peut pas être trouvée à l'aide du journal Process Monitor, ou si le nom d'exportation pose problème, les scripts de compilation reviennent à la création d'une DLL sans exportations spécifiées.
#pragma once
//%_BUILD_AS%
#include <windows.h>;
extern "C" {
VOID Payload() {
// Exécutez votre charge utile ici.
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
}
Pour les applications qui utilisent de manière non sécurisée la valeur de la variable OPENSSLDIR, un fichier openssl.cnf spécialement conçu peut être placé à l'emplacement indiqué. Dans cet exemple, le logiciel chargera C:\tmp\calc.dll. Assurez-vous d'utiliser une bibliothèque 32 bits pour cibler les processus 32 bits, et une bibliothèque 64 bits pour cibler les processus 64 bits.
[openssl_init]
# Ceci tentera de charger le fichier c:\tmp\calc.dll lors de l'initialisation d'OpenSSL
# Les scripts de compilation doivent détecter si la bibliothèque calc.dll doit être compilée en 32 bits ou en 64 bits
/tmp/calc = asdf
La compilation est possible en utilisant le binaire cl.exe inclus avec Visual Studio. Spécifiquement :
cl.exe /DADD_EXPORTS /D_USRDLL /D_WINDLL <target>.cpp /LD /Fe<target>.dll /link /DEF:<target>.def
Pour automatiser le processus de construction, y compris la spécification si la bibliothèque doit être en 64 bits ou en 32 bits :
build.bat..dll.Remarque : En raison d'un comportement malheureux de vcvarsall.bat, qui n'est définitivement pas un bug, vous pourriez rencontrer des difficultés en exécutant build.bat plus d'une fois dans la même session d'invite de commandes développeur Visual Studio. Si vous rencontrez une erreur, fermez simplement la fenêtre et relancez‑la.
Si Visual Studio n'est pas facilement disponible, les DLL proxy peuvent être compilées avec MinGW-w64 à la place. Sur une plateforme Ubuntu par exemple, MinGW peut être installé via les commandes suivantes : sudo apt install g++-mingw-w64-x86-64-win32 g++-mingw-w64-i686-win32
# Créer une DLL 32 bits
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
# Créer une DLL 64 bits
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
Pour automatiser le processus de construction, y compris la spécification si la bibliothèque doit être en 64 bits ou en 32 bits :
bash ./build.sh.dll.Comme décrit dans VU#114757, les anciennes versions du logiciel Acronis contiennent plusieurs vulnérabilités d'élévation de privilèges.
openssl.cnf dans un emplacement accessible à un utilisateur non privilégié.C:\ProgramData\Acronis.Crassus détecte automatiquement ces deux problèmes.

En plaçant notre fichier curl.dll compilé dans le répertoire C:\ProgramData\Acronis\Agent\var\atp-downloader\ et en redémarrant avec un nouveau journal de démarrage Process Monitor, nous pouvons voir que notre charge utile qui exécute calc.exe s'exécute avec les privilèges SYSTEM.

Le logiciel vulnérable Acronis tente de charger openssl.cnf depuis deux emplacements différents. Nous placerons notre fichier modèle openssl.cnf dans c:\jenkins_agent\workspace\tp-openssl-win-vs2013\17\product\out\standard\vs_2013_release\openssl\ssl, et une charge utile calc.dll 32 bits dans c:\tmp.

Comme décrit dans VU#240785, les anciennes versions du logiciel Atlassian Bitbucket sont vulnérables à l'élévation de privilèges en raison d'ACL faibles sur le répertoire d'installation. Comme pour tout logiciel Windows installé en dehors de C:\Program Files\ ou d'autres emplacements à ACL restrictives, il incombe au programme d'installation de définir explicitement les ACL sur le répertoire cible.
Crassus trouve de nombreuses façons d'atteindre l'élévation de privilèges avec ce logiciel, y compris :

Dans la sortie de Crassus, nous pouvons voir que c:\atlassian\bitbucket\7.9.1\elasticsearch\bin\elasticsearch-service-x64.exe est privilégié, mais comme il est en cours d'exécution, nous ne pouvons pas simplement le remplacer. Cependant, nous pouvons utiliser une autre astuce pour le détourner. Nous pouvons simplement renommer le répertoire où il se trouve, créer un nouveau répertoire du même nom, et y placer notre charge utile sous le même nom.

Une fois que nous redémarrons avec un journal de démarrage Process Monitor, nous pouvons voir que notre fichier elasticsearch-service-x64.exe déposé s'exécute à la place du vrai, comme l'indique l'icône de la calculatrice Windows.

Comme décrit dans VU#287178, les anciennes versions du logiciel McAfee sont vulnérables à l'élévation de privilèges via openssl.cnf. Jetons un coup d'œil :

Pour comprendre pourquoi il y a deux références différentes à openssl.cnf dans ce journal de démarrage, nous pouvons consulter le fichier results.csv :

Notez que le chargement du fichier openssl.cnf depuis le chemin D:\ nécessitera une investigation manuelle supplémentaire, car la faisabilité de charger un tel chemin dépend de la plateforme concernée et de l'accès disponible au système. Il est peut-être possible de créer un disque optique qui fournit un fichier openssl.cnf référençant également un chemin résolu sur le lecteur optique.
SQL Server 2022 n'est pas évidemment vulnérable à l'élévation de privilèges en raison d'ACL faibles sauf s'il est installé dans un emplacement non standard. S'il est installé dans un répertoire autre que C:\Program Files, Crassus découvrira plusieurs possibilités d'élévation de privilèges. La plupart des applications Windows incluant un composant privilégié semblent exploitables de cette manière si elles sont installées dans un répertoire qui ne possède pas déjà des ACL intrinsèquement sécurisées.

Si Crassus signale le chargement privilégié d'un fichier qu'un utilisateur peut déposer ou modifier, cela ne signifie pas nécessairement qu'il s'agit d'un scénario exploitable. Bien que Crassus recherche les types de fichiers potentiellement intéressants, un fichier journal Process Monitor n'indique pas directement ce que le processus associé aurait fait avec le fichier s'il avait été présent. Il pourrait s'agir simplement d'extraire une icône de programme. L'examen de la pile d'appels de l'opération sur le fichier dans Process Monitor peut donner une indication sur ce qui aurait été fait. Ou simplement placer le fichier et examiner le comportement avec un nouveau journal de démarrage Process Monitor, si vous préférez la voie plus simple de la force brute. Vous pouvez également rencontrer une bibliothèque manquante pour laquelle Crassus ne peut pas trouver la bibliothèque pour connaître les exportations qui devraient être présentes, ou les exportations trouvées par Crassus entrent en conflit d'une manière qui empêche une compilation correcte de la DLL. Dans de tels cas, Crassus revient à la création d'une DLL qui n'exporte aucun nom de fonction. Selon la manière dont l'application cible charge la bibliothèque, l'absence de noms de fonctions et/ou de numéros d'ordinals attendus peut empêcher l'application cible de charger la bibliothèque avec succès. Ce scénario nécessitera un effort manuel pour déterminer à quoi la DLL proxy doit ressembler.
Crassus recherche les opérations privilégiées sur les fichiers pour découvrir les chemins d'intérêt. Vous pouvez rencontrer un scénario où un processus privilégié et un processus non privilégié accèdent tous deux à un chemin, mais seul le processus non privilégié exécute ce qui pourrait être présent. Alternativement, vous pouvez rencontrer un scénario où un processus parent s'exécute bien avec des privilèges, mais il peut explicitement générer des processus fils avec des privilèges moindres.
Surtout lors de l'installation initiale d'un logiciel ou lors de l'installation de mises à jour, Process Monitor peut enregistrer une opération sur un fichier qui semble exploitable mais qui ne se produit pas à chaque démarrage du système. L'exploitation de ces opérations peut être possible au premier redémarrage après un tel événement. Pour éviter ces cas particuliers, confirmez que les journaux de démarrage ultérieurs contiennent les mêmes opérations sur les fichiers rapportées lors des redémarrages suivants.
Qu'il s'agisse d'une faute de frappe, d'un bogue ou d'une nouvelle fonctionnalité, Crassus est très ouvert aux contributions tant que nous sommes d'accord sur les points suivants :