Jak ominąć Windows 11 Defender i użyć ligolo-ng do pivotingu: Analiza narzędzi ThreatCheck i Ligolo-ng
Podczas testów red team, po uzyskaniu dostępu do pierwszej maszyny, warto zestawić tunel w celu ułatwienia i przyspieszenia dalszego rozpoznania sieci wewnętrznej. Wykorzystanie SOCKS proxy w połączeniu z Metasploit nie jest optymalnym rozwiązaniem, ponieważ skanowanie sieci w poszukiwaniu kolejnego celu zajmuje bardzo dużo czasu. W takiej sytuacji warto poszukać alternatywnego rozwiązania, które zwiększy efektywność pracy. Idealnym narzędziem w tym przypadku okazuje się Ligolo-ng - proste, lekkie i szybkie narzędzie umożliwiające ustanowienie tuneli TCP/TLS za pomocą interfejsu tun, bez konieczności korzystania z SOCKS.
Jednak narzędzie to jest dobrze znane nie tylko pentesterom, ale również analitykom cyberbezpieczeństwa, przez co łatwo podlega detekcji przez różne programy antywirusowe, w tym Windows Defender.
W tym artykule pokażę, jak ominąć detekcję Windows Defendera, korzystając z dodatkowego narzędzia, jakim jest ThreatCheck. Opisana metoda sprawdziła się w mojej pracy podczas ostatnich testów.
Zanim jednak przejdziemy do tego, jak ominąć detekcję na najnowszej wersji systemu operacyjnego w chwili pisania tego artykułu Windows 11 (Rys. 1), przeanalizujmy wynik skanowania za pomocą narzędzia VirusTotal. VirusTotal to internetowa platforma służąca do analizy plików, adresów URL, domen oraz adresów IP w celu wykrycia złośliwego oprogramowania, zagrożeń bezpieczeństwa i innych podejrzanych aktywności. Jest to popularne narzędzie wykorzystywane przez specjalistów ds. bezpieczeństwa, analityków złośliwego oprogramowania oraz pentesterów.
Detekcja złośliwego oprogramowania może odbywać się na różne sposoby, takie jak analiza sygnatur, heurystyka, analiza behawioralna i inne. Przechodząc dalej, jak wynika z Rys. 2, skompilowany agent Ligolo-ng pobrany bezpośrednio z repozytorium projektu jest wykrywany przez 15 silników antywirusowych, w tym przez silnik Microsoft. Oznacza to, że w obecnej postaci, przy włączonym Windows Defenderze, uruchomienie połączenia zwrotnego jest niemożliwe, ponieważ agent zostanie wykryty i zablokowany (Rys. 3).
Kolejnym krokiem, który podjąłem w celu ominięcia detekcji przez Windows Defendera, była próba ręcznego zbudowania agenta Ligolo-ng za pomocą poniższego polecenia:
GOOS=windows go build -ldflags "-s -w" -o agent2.exe cmd/agent/main.go
GOOS=windows
- Określa system operacyjny, dla którego ma być skompilowany program. W tym przypadku ustawione jest na windows, co oznacza, że kompilator wygeneruje plik wykonywalny zgodny z systemem Windows.go build
- To polecenie kompilatora Go, które buduje aplikację na podstawie kodu źródłowego.-ldflags "-s -w"
- To flaga, która przekazuje dodatkowe opcje do linkera:-s
: Usuwa tablice symboli z pliku wykonywalnego.-w
: Usuwa informacje o debugowe
-o agent2.exe
- Określa nazwę wyjściowego pliku wykonywalnego. W tym przypadku jest to agent2.exe.cmd/agent/main.go
- Ścieżka do głównego pliku źródłowego aplikacji, który ma być skompilowany.
Kompilację przeprowadzałem na systemie macOS. Liczyłem, że ustawienie tych opcji zmieni część sygnatur, dzięki czemu agent2.exe będzie wykrywany przez mniejszą liczbę silników antywirusowych. Rzeczywiście, liczba detekcji zmniejszyła się o trzy (Rys. 4), jednak silnik Microsoftu, który był dla mnie kluczowy, nadal wykrywał agenta jako złośliwe oprogramowanie.
W tym momencie z pomocą przyszło narzędzie ThreatCheck. ThreatCheck umożliwia sprawdzenie, czy dany plik, payload lub kod jest wykrywany przez oprogramowanie antywirusowe, takie jak Windows Defender. Analizuje on plik i wskazuje konkretne fragmenty (bajty) kodu, które powodują detekcję przez antywirusy, dzięki czemu możliwe jest ich modyfikowanie w celu ominięcia detekcji.
Po pobraniu kodu z repozytorium GitHub i skompilowaniu narzędzia, uruchomiłem ThreatCheck na pliku agent2.exe:
.\ThreatCheck.exe -f "Z:\art-blog\ligolo-ng\agent2.exe"
Moja pierwsza próba została jednak zablokowana przez Windows Defender (Rys. 5).
Aby kontynuować, chwilowo wyłączyłem Windows Defender (Rys. 6).
Po ponownym uruchomieniu ThreatCheck otrzymałem informację o bajtach w pliku, które powodują detekcję przez Windows Defendera (Rys. 7). Z analizy wynikało, że są to fragmenty klucza publicznego oraz łańcuchy znaków.
Próbując znaleźć wspomniane miejsce w kodzie źródłowym, przeszukałem wszystkie pliki za pomocą grepa, ale ciąg znaków “client finished” nie zwrócił żadnych rezultatów (Rys. 8). Najprawdopodobniej pochodzi on z zewnętrznej biblioteki wykorzystywanej przez aplikację.
Stwierdziłem, że spróbuję zmodyfikować bajty w pliku exe. Wybrałem adres 0x5B07D8
, gdzie zaczynał się łańcuch “client finished” i zmieniłem 10 bajtów (0xA
) na wartość 0xFF
. Wynik wyglądał następująco:
005b07d7: 00ff ffff ffff ffff ffff ff69 7368 6564 ...........ished
Poniżej znajduje się kod w Pythonie, który modyfikuje plik binarny:
def modify_binary(input_file, output_file, offset, length):
with open(input_file, "rb") as f:
data = bytearray(f.read())
file_size = len(data)
print("File size:", file_size)
print("Offset:", offset)
print("Length:", length)
if offset + length > file_size:
print("Error: Offset + length exceeds file size.")
return
for i in range(length):
data[offset + i] = 0xFF
with open(output_file, "wb") as f:
f.write(data)
print("Binary file modified successfully. Output saved as:", output_file)
input_file = "agent2.exe"
output_file = "agent3.exe"
offset = 0x5B07D8
length = 0xA
modify_binary(input_file, output_file, offset, length)
Zmodyfikowany plik ponownie przeskanowałem za pomocą ThreatCheck. Tym razem narzędzie wyświetliło komunikat: “No Threat found!” (Rys. 9).
Aby upewnić się co do efektu, wrzuciłem plik na VirusTotal (Rys. 10). Liczba wykryć zmniejszyła się o jeden, w tym ten kluczowy - Microsoft.
Na zakończenie włączyłem Windows Defender, skopiowałem zmodyfikowany plik i uruchomiłem go. Agent działał poprawnie i nawiązał połączenie z moim serwerem C2 (Rys. 11 i 12).
Całe demo można zobaczyć na poniższym filmie:
Podsumowując, wystarczyła drobna zmiana, aby plik przestał być wykrywany przez Windows Defendera jako złośliwy. W przypadku innych aplikacji problem może wyglądać inaczej i wymagać większej liczby iteracji. Należy też pamiętać, że zmiana bajtów może wpłynąć na działanie aplikacji, a w skrajnych przypadkach doprowadzić do jej uszkodzenia.