
Framework d'évasion AV/EDR piloté par modèles
🚩 Ceci est le dépôt public d'Inceptor, pour la dernière version et les mises à jour, veuillez envisager de nous soutenir via https://porchetta.industries/
Si vous souhaitez sponsoriser ce projet et obtenir les dernières mises à jour d'Inceptor, les derniers correctifs, les dernières fonctionnalités, veuillez nous soutenir sur https://porchetta.industries/
Venez traîner sur Discord !
NW : Nous travaillons actuellement à l'amélioration du moteur de templates ! Dès que nous publierons la prochaine version, des instructions sur la façon d'utiliser, de personnaliser et d'étendre l'outil seront disponibles dans le Wiki.
Les tests de pénétration modernes et le Red Teaming nécessitent souvent de contourner les appliances AV/EDR courantes afin d'exécuter du code sur une cible. Avec le temps, les défenses deviennent plus complexes et intrinsèquement plus difficiles à contourner de manière cohérente. Inceptor est un outil qui peut aider à automatiser une grande partie de ce processus, espérons-le sans nécessiter d'efforts supplémentaires.
Inceptor est un packer PE basé sur des templates pour Windows, conçu pour aider les testeurs de pénétration et les red teamers à contourner les solutions AV et EDR courantes. Inceptor a été conçu avec un accent sur la convivialité et pour permettre une personnalisation extensive par l'utilisateur.
Pour avoir un bon aperçu de ce qui a été implémenté et pourquoi, il peut être utile de jeter un coup d'œil aux ressources suivantes :
Inceptor est capable de convertir des EXE/DLL existants en shellcode en utilisant divers convertisseurs open source :
Inceptor peut encoder, compresser ou crypter du shellcode en utilisant différents moyens. En développant l'outil, j'ai commencé à différencier ce que j'appelle l'encodage indépendant du chargeur (LI) et l'encodage dépendant du chargeur (LD).
L'encodage indépendant du chargeur est un type d'encodage non géré par le template choisi par l'utilisateur (chargeur). Cela signifie généralement que le stub de décodage ne fait pas partie du template, mais est intégré dans le shellcode lui-même. Inceptor offre ce type de fonctionnalité en utilisant l'outil open source sgn, qui est utilisé pour rendre la charge utile polymorphe et indétectable par la détection de signature courante.
Même s'il est puissant, Shikata-Ga-Nai n'est pas vraiment adapté à certains templates. Pour cette raison, Inceptor implémente également des encodeurs dépendants du chargeur, qui sont conçus pour laisser le chargeur s'occuper du décodage. Ainsi, les encodeurs LD installent le stub de décodage directement dans le template. Ce type d'encodeurs, tels qu'implémentés dans Inceptor, sont également « chaînables », ce qui signifie qu'ils peuvent être enchaînés pour encoder une charge utile.
Bien que l'utilisation d'une chaîne d'encodeurs puisse parfois améliorer l'obscurcissement d'une charge utile donnée, cette technique peut également exposer plusieurs routines de décodage, ce qui peut aider les défenseurs à concevoir des signatures contre elles. Pour cette raison, Inceptor offre plusieurs façons d'obscurcir les artefacts finaux, durcissant le processus de rétro-ingénierie.
Au moment de la rédaction, la version publique d'Inceptor a été fournie avec les encodeurs/compresseurs/crypteurs suivants :
Inceptor peut valider une chaîne d'encodage à la fois statiquement et dynamiquement, en vérifiant statiquement les types d'entrée/sortie des décodeurs, et aussi en vérifiant dynamiquement l'implémentation avec une implémentation indépendante. À tout moment, un utilisateur peut facilement valider une chaîne en utilisant l'utilitaire chain-validate.py.
Inceptor implémente également nativement des mécanismes d'évasion AV, et en tant que tel, il offre la possibilité d'inclure des fonctionnalités d'évasion AV à la charge utile sous forme de « modules » (plugins).
Les plugins qui peuvent être intégrés sont :
Inceptor implémente également des mécanismes d'évasion EDR, tels que le déhooking complet, l'invocation directe de syscall et le mappage manuel de DLL. Les syscalls directs sont implémentés en C# en utilisant l'excellent projet DInvoke, encore par TheWover. En C/C++, les syscalls sont implémentés en utilisant les projets SysWhispers et SysWhispers2, par Jackson_T. De plus, Inceptor prend en charge nativement les syscalls x86 également.
Comme les fonctionnalités de contournement d'AV, ces fonctionnalités peuvent être activées en tant que modules, avec la seule différence qu'elles nécessitent de travailler sur un template qui les supporte. Les techniques implémentées jusqu'à présent sont :
Inceptor prend en charge l'obscurcissement de la charge utile en utilisant des utilitaires externes, tels que ConfuserEx et Chameleon, et fournit un support pour l'obscurcissement C/C++ en utilisant LLVM-Obfuscator, qui est un obscurcisseur basé sur IR utilisant la plateforme de compilation LLVM.
Une autre fonctionnalité d'Inceptor est qu'il peut signer le binaire/DLL résultant en utilisant l'outil CarbonCopy. Généralement, les fichiers signés avec des certificats de signature de code sont analysés moins strictement. De nombreux produits anti-malware ne valident/vérifient pas ces certificats.
Le flux de travail complet peut être résumé dans le schéma simplifié et de haut niveau suivant :

Inceptor a été conçu pour fonctionner sur Windows. L'utilitaire update-config.py peut localiser les binaires Microsoft requis et mettre à jour la configuration en conséquence. Il peut être nécessaire d'installer Microsoft Build Tools, le Windows SDK et Visual Studio. update-config.py guidera l'utilisateur sur la façon d'installer les dépendances requises.
git clone --recursive https://github.com/klezVirus/inceptor.git
cd inceptor
virtualenv venv
venv\Scripts\activate.bat
pip install -r requirements.txt
cd inceptor
python update-config.py
La version actuelle d'Inceptor localise un template spécifique en utilisant une convention de nommage simple (ne modifiez pas les noms des templates), et l'ensemble des arguments donnés par l'utilisateur. Parmi les arguments, il y a aussi le chargeur (-t). S'il n'est pas spécifié, le chargeur sera sélectionné en fonction du fichier à packer, suivant ce schéma simple :
$ python inceptor.py -hh
[*] Default Loaders
Input File Extension SpecialCondition Guessed Filetype Default Loader Default Template
0 .raw NaN Shellcode Simple Loader Classic
1 .exe .NET Dotnet Executable Donut Classic
2 .exe NaN Native Executable Pe2Shellcode PE Load
3 .dll NaN Native Library sRDI Classic
Il est très important de comprendre également la convention de nommage des templates, pour éviter d'interpréter incorrectement le comportement d'un artefact.
$ usage: inceptor.py [-h] [-hh] [-Z] {native,dotnet,powershell} ...
inceptor: A Windows-based PE Packing framework designed to help
Red Team Operators to bypass common AV and EDR solutions
positional arguments:
{native,dotnet,powershell}
native Native Binaries Generator
dotnet .NET Binaries Generator
powershell PowerShell Wrapper Scripts Generator
optional arguments:
-h, --help show this help message and exit
-hh Show functional table
-Z, --check Check file against ThreatCheck