
Syscall dynamique indirect, tri des adresses SSN + Syscall via approche TartarusGate modifiée + Injection de processus distant via APC Early Bird + Génère un processus sacrificiel comme processus cible + Politique d'atténuation (ACG+BlockDll) sur le processus généré + Usurpation de PPID + Résolution d'API depuis TIB + Hachage d'API
Un outil dropper personnalisable ciblant Windows.
Inconvénient : Si les threads sont repris, tous les événements survenus pendant la suspension du journal des événements sont à nouveau enregistrés !
Donc, j'ai pensé à les tuer à la place !
"C'est plus invasif que la suspension, mais la décision revient toujours à l'opérateur. De plus, tuer des threads est journalisé au niveau du noyau" - @SEKTOR7net
Directement via le compilateur VS :


./compile.bat
PS C:> .\x64\Release\indirect.exe
[!] Wrong!
[->] Syntax: .\x64\Release\indirect.exe <PPID to spoof>
https://github.com/reveng007/DarkWidow/assets/61424547/62a90c5b-84af-4389-8ddc-9f7926debdcf

TIB :
Registres GS et FS :
Structure PEB LDR :
BlackHat - What Malware Authors Don't Want You to Know - Evasive Hollow Process Injection par @monnappa22
Une image de la mémoire du processus depuis le lien ci-dessus :

Depuis labs.cognisys.group, un blog de @D1rkMtr
:

TIB -> TEB -> PEB -> Résoudre Nt API et hachage d'API
#include <stdint.h>
#include <stdio.h>
#include <Windows.h>
DWORD64 djb2(const char* str)
{
DWORD64 dwHash = 0x7734773477347734;
int c;
while (c = *str++)
dwHash = ((dwHash << 0x5) + dwHash) + c;
return dwHash;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("[!] Wrong!\n");
printf("[->] Syntax: .\\%s <NTFuncName>\n\n", argv[0]);
return 1;
}
const char* string = argv[1];
DWORD64 hashvalue = djb2(string);
printf("Hash Value: 0x%llX\n", hashvalue);
return 0;
}
Politique d'atténuation ACG (Arbitrary Code Guard)/BlockDll :

Détection de l'usurpation de PPID :
Détection Moneta et PESieve :\
Moneta :

PESieve :

Scan Capa :

À quoi ressemble la pile de threads du processus implant :
| Processus implant | Processus Cmd légitime |
|---|---|
![]() | ![]() |
Il s'ensuit qu'en exécutant l'instruction return dans la mémoire de ntdll.dll dans le POC syscall indirect, l'adresse de retour peut être usurpée avec succès, la ntdll.dll peut être placée en haut de la pile d'appels et l'EDR interprétera une légitimité plus élevée. - @VirtualAllocEx de DirectSyscall Vs Indirect Syscall
Merci également à @peterwintrsmith !


Configuration du privilège SeDebugPrivilege :
Depuis ici :
Jusqu'à ici :

Tuer les threads du journal des événements :



Aucune alerte critique créée, sauf un journal de faible gravité !

Un journal de faible gravité => Injection APC (Comme avant)

Un autre journal de gravité moyenne est apparu pour la configuration du
SeDebugPrivilege.

Synthetic Frame Thread Stack Spoofing.Voici à quoi ressemble la pile après application du Synthetic Frame Thread Stack Spoofing.

Ceci est la pile de threads de l'API NT

Ceci est la pile de threads de la shellcode (d'ailleurs, ce n'est pas du sur-mesure, c'est la shellcode Havoc :))
Pour le développement de la shellcode, j'ai utilisé havoc et la configuration ci-dessous :

L'usurpation de l'adresse de démarrage d'un thread nouvellement créé n'était pas vraiment nécessaire dans ce projet car dans la technique d'injection APC, l'APC détourne l'exécution d'un thread déjà existant et légitime. Merci à @C5pider !

État actuel des journaux d'événements ?

Aucun journal généré. J'ai également supprimé la partie de suppression du journal des événements dans DarkWidow V2, ce qui réduit également la génération d'événements !
J'espère n'avoir oublié personne !
Une image de l'extrait du lien ci-dessus, que j'ai utilisé ici pour résoudre dynamiquement l'API sans coder en dur les offsets :

Le code de hachage d'API que j'ai appliqué :