En ce moment,pour ma future certification, je craft des malwares et j'apprends aussi à bypass les EDR.
J'ai donc décidé de mettre à l'épreuve mon AV : le fameux ***Kasperski Anti-Virus***.
***Spoiler : c'est de la m*******.
Pour commencer, on va faire un peu de théorie.
> ## METASPLOIT
> Framework d'exploitation / intrusion d'un SI. Permet de générer des shellcodes/payloads.
{.is-info}
> ## SHELLCODE
> Code malveillant détournant l'application de son fonctionnement d'origine, généralement écrit dans un language d'Assemblage
{.is-info}
> ## PAYLOAD
> La commande malveillante qu'on veut exécuter sur la machine cible. Un simple listing de répertoire peut être considéré comme un payload. Parfois payload et shellcode sont confondus, car une fois l'application cible détournée, on peut de suite exécuter ce qu'on veut.
{.is-info}
> ## STAGED / NON STAGED
> Dans metasploit, un staged payload est un payload découpé en plusieurs parties. Le code est chargé bout par bout, à l'inverse du non-staged qui est chargé en entier.
{.is-info}
> ## PROCESS HOLLOWING
> Cette technique consiste à créer un processus, le mettre dans un état suspendu, remplacer le code dans son entrypoint par du code malveillant. Ici ça sera un payload/shellcode généré par metasploit.
{.is-info}
> ## REFLECTION
> Charger du code managé (ici en C#) dans la mémoire pour appeler dynamiquement ces classes et méthodes. On peut donc charger du code C# pré-compilé et appeler ces fonctions (.exe, .dll etc... tant que c'est du C#/.NET).
{.is-info}
## KASPERSKY PWN PLAN
Maintenant qu'on sait tout ça, on attaque.
Ce qu'on va faire :
1. On va générer notre shellcode et on prépare l'écoute
2. Créer une DLL qui, lors de l'appel, spawn un process svchost puis insère du code à son entrypoint. En plus, svchost est connu pour communiquer sur le réseau.
3. Charger la DLL via powershell, sans rien écrire sur le disque.
## C'EST PARTI
- Premièrement, on va compiler notre assembly en x64 (Ici on va faire une DLL, mais ça aurait très bien pu être un exécutable classique).
//Les AV savent pas gérer les native API. Du coup souvent ça retourne une erreur. Si c'est le cas, on quitte
IntPtr mem = VirtualAllocExNuma(GetCurrentProcess(), IntPtr.Zero, 0x1000, 0x3000, 0x4, 0);
if (mem == null)
{
return;
}
byte[] buf = new byte[585] {
//shellcode généré avec msfvenom
};
//Ici les choses compliqués commencent, mais pour faire simple, on lance svchost dans un état suspendu, on trouve son entrypoint, on remplace par notre shellcode et on resume son execution