
Bibliothèque Nim pour le développement de la sécurité offensive
Bitmancer est une bibliothèque pour le développement d'outils de sécurité offensive pour le système d'exploitation Windows, écrite en Nim. Elle vise à fournir des API, des routines et des macros courantes avec des implémentations hautement configurables, indépendantes de la position et autonomes.
Si vous cherchez à développer un implant, tester un PoC rapide ou écrire un tout nouvel outil brillant, Bitmancer peut vous aider à démarrer !
⚠️ Ce dépôt est actuellement un énorme travail en cours ! Des problèmes peuvent survenir lors de son utilisation et aucune garantie de stabilité n'est offerte pour le moment. ⚠️
Bitmancer utilise partiellement winim pour ses types. Pour l'installer, exécutez :
nimble install winim
Bitmancer ne fait pas encore partie du dépôt nimble. Pour le moment, vous pouvez l'installer depuis Github en exécutant simplement :
nimble install https://github.com/zimawhit3/Bitmancer
MingW et Nim introduiront des dépendances sur MSVCRT et Kernel32, ainsi que des variables globales utilisées par le module System de Nim. Si vous souhaitez les éviter pour du code indépendant de la position, utilisez le nim.cfg fourni.
Pour compiler :
nim c -d:mingw <Votre_Fichier_Nim>
Pour tous les modules :
import Bitmancer
Si vous n'avez pas besoin des routines NTDLL ou des syscalls, vous pouvez simplement utiliser :
import Bitmancer/core
Pour seulement les procédures de hachage :
import Bitmancer/core/obfuscation/hash
Si vous souhaitez qu'une fonctionnalité ou une technique soit implémentée, faites-le-moi savoir !
Stack Strings :
var wStr {.stackStringW.} = "Hello!"
var cStr {.stackStringA.} = "World!"
Si vous cherchez à générer un wrapper autour d'un syscall actuellement indisponible, le flux de base est le suivant :
## Importer les syscalls
import Bitmancer/syscalls
## Pour le hachage
import Bitmancer/core/obfuscation/hash
## Définir votre type
type NtClose = proc(h: HANDLE): NTSTATUS {.stdcall, gcsafe.}
## Générer le wrapper
genSyscall(NtClose)
## Définir les configurations pour récupérer et exécuter le syscall
## La méthode d'énumération du symbole de la procédure - les options disponibles sont :
## UseEAT - utiliser la table des adresses d'exportation pour résoudre le symbole
## UseIAT - utiliser la table des adresses d'importation pour résoudre le symbole
## UseLdrThunks - utiliser les LdrThunkSignatures du NTLoader pour mapper un NTDLL propre et résoudre les symboles
const symEnum = SymbolEnumeration.UseEAT
## La méthode d'énumération SSN - les options disponibles sont :
## HellsGate
## HalosGate
## TartarusGate
## ZwCounter
const ssnEnum = SsnEnumeration.HellsGate
## Enfin, la méthode d'exécution - les options disponibles sont :
## Direct - utiliser le stub de syscall direct
## Indirect - utiliser le stub de syscall indirect
const exeEnum = SyscallExecution.Indirect
## Définir un identifiant pour identifier le symbole
const NtCloseHash = ctDjb2 "NtClose"
## Récupérer NTDLL
let Ntdll = ? NTDLL_BASE()
## Appeler ctGetNtSyscall, récupérant l'objet NtSyscall contenant le SSN, le pointeur vers l'adresse de la fonction
## et un stub casté vers votre type.
let NtSyscall = ctGetNtSyscall[NtClose](Ntdll, ModuleHandle(NULL), NtCloseHash, symEnum, ssnEnum, exeEnum)
## Enfin, appeler le wrapper !
NtCloseWrapper(h, NtSyscall.wSyscall, NtSyscall.pSyscall, NtSyscall.pFunction)
Consultez l'exemple runShellcode pour un exemple complet.
D'autres exemples sont également disponibles dans ntdll.