Jak ominąć Windows 11 Defender i użyć ligolo-ng do pivotingu: Analiza narzędzi ThreatCheck i Ligolo-ng

Jak ominąć Windows 11 Defender i użyć ligolo-ng do pivotingu?

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.

Rys 1. Wersja systemu operacyjnego.
Rys 1. Wersja systemu operacyjnego.

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).

Rys 2. Wynik VirusTotal dla agenta Ligolo-ng pobranego bezpośrednio z repozytorium GitHub.
Rys 2. Wynik VirusTotal dla agenta Ligolo-ng pobranego bezpośrednio z repozytorium GitHub.

Rys 3. Zablokowanie agenta Ligolo-ng, pobranego bezpośrednio z repozytorium GitHub, przez Windows Defender.
Rys 3. Zablokowanie agenta Ligolo-ng, pobranego bezpośrednio z repozytorium GitHub, przez Windows Defender.

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.

Rys 4. Wynik VirusTotal dla agenta Ligolo-ng skompilowanego samodzielnie z kodu źródłowego.
Rys 4. Wynik VirusTotal dla agenta Ligolo-ng skompilowanego samodzielnie z kodu źródłowego.

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).

Rys 5. Pierwsza próba użycia ThreatCheck zablokowana przez Windows Defendera.
Rys 5. Pierwsza próba użycia ThreatCheck zablokowana przez Windows Defendera.

Aby kontynuować, chwilowo wyłączyłem Windows Defender (Rys. 6).

Rys 6. Wyłączenie Windows Defendera na czas przygotowywania zmodyfikowanej wersji agenta.
Rys 6. Wyłączenie Windows Defendera na czas przygotowywania zmodyfikowanej wersji agenta.

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.

Rys 7. Bajty, które zostały oznaczone przez Windows Defender, wskazane przez ThreatCheck.
Rys 7. Bajty, które zostały oznaczone przez Windows Defender, wskazane przez ThreatCheck.

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ę.

Rys 8. Przeszukiwanie kodu źródłowego w poszukiwaniu ciągu znaków “client finished”.
Rys 8. Przeszukiwanie kodu źródłowego w poszukiwaniu ciągu znaków “client finished”.

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).

Rys 9. Test przeprowadzony na zmodyfikowanej wersji agenta nie wykazał żadnych wykrytych bajtów przez Windows Defendera.
Rys 9. Test przeprowadzony na zmodyfikowanej wersji agenta nie wykazał żadnych wykrytych bajtów przez Windows Defendera.

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.

Rys 10. Wynik VirusTotal dla zmodyfikowanego agenta Ligolo-ng.
Rys 10. Wynik VirusTotal dla zmodyfikowanego agenta Ligolo-ng.

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).

Rys 11. Windows Defender włączony, a połączenie z C2 za pomocą zmodyfikowanego agenta Ligolo-ng zostało pomyślnie nawiązane.
Rys 11. Windows Defender włączony, a połączenie z C2 za pomocą zmodyfikowanego agenta Ligolo-ng zostało pomyślnie nawiązane.
Rys 12. Sesja nawiązana w proxy Ligolo-ng.
Rys 12. Sesja nawiązana w proxy Ligolo-ng.

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.