Zanim przejdziemy do omawiania metod ataku polegających na wstrzykiwania kodu do pamięci komputera warto byłoby wspomnieć najpierw o tym, czym jest taki atak i jak wygląda.
Czym jest atak w pamięci komputera?
Atak w pamięci komputera jest trudny do wykrycia, ponieważ nie opiera się na korzystaniu z pliku(ów) zapisanym(ych) na dysku. Jego złośliwy kod ładowany jest do pamięci RAM komputera, którą często potocznie nazywamy “pamięcią ulotną”. Oznacza to, że złośliwa zawartość kodu jest usuwana po restarcie komputera. Czy zatem powinniśmy często restartować nasze komputery? Niekoniecznie, ponieważ złośliwy kod po wykonaniu w pamięci może zaszyć się np. w rejestrze systemowym lub usługach na komputerze tak, aby przy kolejnych próbach uruchomienia systemu był ponownie ładowany do pamięci.
Jakie metody ataku obrali współcześni cyberprzestępcy?
Cyberprzestępcy są zdeterminowani, aby ominąć zabezpieczenia wykorzystując coraz bardziej wyrafinowane techniki. Złośliwe oprogramowanie niewykorzystujące plików zwiększa swoją niezauważalność i skuteczność ataku, co potwierdziły dwa zeszłoroczne ataki dużych ransomware (Petya i WannaCry), które używały bez plikowych technik infekcji jako części ich zabójczego łańcucha ataku KILLCHAIN.
Pierwszym powodem, dla którego cyberprzestępcy wybrali tę metodę do swoich ataków są wbudowane narzędzia w Windows oferujące, jak się okazuje duże możliwości (patrz artykuł Certutil oraz DNS). Jeśli istnieją już narzędzia na komputerze (na przykład PowerShell lub wmic), które mogą być użyte przez atakującego, to po co podrzucać na stację dodatkowe oprogramowanie, które może być wykryte jako złośliwe? Jeśli atakujący może przejąć proces, uruchomić kod w jego pamięci, a następnie użyć kodu do wywołania narzędzi znajdujących się już na komputerze, atak staje się trudniejszy do wykrycia.
Drugim powodem jest uniknięcie zapisywania śladów takiego ataku na dysku w postaci jakichkolwiek plików, które mogłyby być przeskanowane lub zauważone przez oprogramowanie do bezpieczeństwa. Najczęściej używane programy zabezpieczające (takie jak programy antywirusowe) koncentrują swoje działania na sprawdzaniu sygnatur (śladów) zapisanych na dysku. W rezultacie narzędzia te pozwalają wykrywać złośliwe pliki i uniemożliwiać im infekowanie komputera. Natomiast ataki w pamięci są bardziej wyrafinowane i omijają oprogramowanie antywirusowe i kryminalistyczne. Dlatego dla cyberprzestępców, którzy chcą pozostać niewykryci, jest to obecnie najlepszy sposób na pozostanie niezauważonym.
Malware w pamięci komputera jest krótkotrwały. Jak zatem może zaszyć się w nim na stałe?
Jak wiemy alokowanie kodu w pamięci nie gwarantuje nam jego długowieczności. Zatem w jaki sposób bez plików na dysku atakujący może automatycznie uruchomić swój kod po ponownym uruchomieniu systemu i zachować kontrolę nad zhakowanym systemem?
Doskonałym przykładem na trwałe zaszycie się bez plikowego malware w systemie operacyjnym jest przykład malware o nazwie Misfox.
W momencie uruchomienia Misfox’a w systemie jego kod wykonuje następujące operacje:
- Tworzy w rejestrze systemowym klucz w sekcji rozruchu systemu z wartością, w której jest uruchamiany jednolinijkowy kod Powershell
- Uruchamia obfuskowany (zaciemniony) skrypt przechowywany w rejestrze w postaci wpisu BLOB. Skrypt Powershell zawiera zakodowany w Base-64 loader który wczytuje inny kod (także zakodowany)
Misfox nie zapisuje na dysku żadnych plików wykonywalnych, lecz jego skrypt zapisany w rejestrze zapewnia, że złośliwe oprogramowanie może być uruchomione po każdym restarcie systemu.
Podstawowe pojęcia z nomenklatury malware
W atakach polegających na wstrzykiwaniu złośliwego kodu do pamięci komputera nie sposób nie wspomnieć o kilku artefaktach (pojęciach) stosowanych w nomenklaturze malware:
- Shellcode – czyli anglojęzyczny zlepek słów shell (powłoka) oraz code (kod) oznaczający prosty, niskopoziomowy program prezentowany najczęściej w postaci kodu maszynowego, odpowiedzialny za wywołanie powłoki systemowej. Często wykorzystywany przez exploity oraz malware. Kody skorup są małym odgałęzieniem kodu używanego jako ładunek (ang. payload)
- Biblioteka DLL jest wspólną biblioteką funkcji, do których dostęp ma wiele programów
- Proces jest to instancja wykonanego programu w systemie
- Wątek to mała sekwencja instrukcji lub element procesu
- Protokoły Windows API umożliwiają interakcję z systemem operacyjnym Windows
- VirtualAllocEx – jest to funkcja powalająca zarezerwować lub zmienić alokację w pamięci
- WriteProcessMemory – to funkcja zapisywania danych w obszarze pamięci zajmowanej przez określony proces
- CreateRemoteThread – to funkcja tworzenia wątku w przestrzeni adresowej dla innego procesu
Techniki wykorzystywane przez malware
W celu przeprowadzenia prostego ataku w pamięci komputera wystarczy użyć jedynie trzech z wymienionych powyżej funkcji, które będą powiązane wraz z kilkoma innymi typami exploita:
- Wstrzyknięcie shellcode
- Refleksyjnie wstrzyknięcie biblioteki DLL
- Proces hollowing
- AtomBombing
- Inline hooking
1. Wstrzyknięcie shellcode’u
Języki skryptowe zapewniają potężne możliwości do dostarczania tylko do odczytu zawartości wykonywalnych złośliwych ładunków. Pliki skryptów mogą osadzać zakodowane kody powłoki lub pliki binarne, które można odszyfrować w locie w czasie wykonywania i wykonywać za pośrednictwem obiektów .NET lub bezpośrednio za pomocą interfejsów API bez konieczności zapisywania ich na dysku. Same skrypty można ukryć w rejestrze (jak w przypadku Misfox), odczytywać ze strumieni sieciowych lub po prostu uruchamiać ręcznie w wierszu poleceń przez atakującego, nie dotykając przy tym nawet dysku.
Popularną techniką używana w tym sposobie ataku jest Powershell pozwalający na wstrzyknięcie złośliwego kodu z uruchomionej aplikacji.
Najczęściej polecenie PowerShell jest uruchamiane z odpowiednimi zaawansowanymi argumentami pozwalającymi pobrać zewnętrzny kod ładunku (payload). Patrz przykład Atak DNS.
2. Refleksyjne wstrzyknięcie biblioteki DLL
Refleksyjne wstrzyknięcie biblioteki DLL polega na ręcznym ładowaniu złośliwych bibliotek DLL do pamięci procesu bez potrzeby przechowywania wspomnianych bibliotek DLL na dysku. Złośliwa biblioteka DLL może znajdować się na komputerze zdalnie kontrolowanym przez atakującego i dostarczana przez ustawiony kanał sieciowy (na przykład protokół Transport Layer Security (TLS)) lub osadzona w zaciemnionej formie (obfuskacja) wewnątrz wektorów infekcji, takich jak makra i skrypty. Taka metoda ataku umożliwia ominięcie mechanizmu systemu operacyjnego, który monitoruje i śledzi ładowanie wykonywalnych modułów.
W normalnej pracy ładowanie przez proces biblioteki DLL w systemie Windows wywołuje funkcję LoadLibrary. Proces przejmuje ścieżkę pliku i wykonuje jego funkcje, nie wymagając od użytkownika żadnej interakcji. Wymaga jedynie, aby biblioteka DLL znajdowała się na dysku i przetworzy zawartość biblioteki DLL w procesie.
Istnieje jednak ukryta metoda o nazwie refleksyjne wstrzyknięcie biblioteki DLL, w której zawartość biblioteki DLL może być załadowana do pamięci. Wymaga to użycia niestandardowego programu ładującego, ponieważ nie można w niej użyć funkcji LoadLibrary. Tak więc, gdy zawartość biblioteki DLL zostanie załadowana do pamięci, wykonanie przejdzie do kodu osadzonego (kod bootstrapera), który będzie emulować zadania wykonywane przez LoadLibrary (takie jak odwzorowanie zmiennej pamięci) i wykonywać funkcje ładowane refleksyjnie.
Przykładem złośliwego oprogramowania korzystającego z wtryskiwacza Reflective DLL jest Mimikatz, a także DoublePulsar – który był używany wraz z EternalBlue w atakach WannaCry – wykonywał refleksyjne wstrzyknięcie biblioteki DLL, ale nie korzystał ze standardowego wywołania LoadLibrary.
3. Process hollowing
Technika ta uruchamia legitymizowany proces, który staje się celem do przechowania zawartości złośliwego kodu. Dostarcza proces w stanie “zawieszonym”, a następnie przepisuje zawartość z wymaganym kodem w pamięci i kontynuuje wykonywanie.
Dridex (złośliwe oprogramowanie bankowe i wiele jego wariantów) wykorzystuje metodę proces hollowing’u, aby mógł się w niezauważony sposób zaszyć na komputerach ofiar. W przypadku Dridex infekcja na komputerach odbywa się według następującego schematu:
- Użytkownik otwiera maila z kampanii phishingowej (patrz artykuł o Phishingu) z osadzonym makrem znajdującym się w załączniku (po raz kolejny pokazujemy, że ludzie są najsłabszym ogniwem w organizacji),
- W chwili otwarcia załącznika złośliwa zawartość kodu (ładunek) jest pobierana z adresu URL;
- Process hollowing wypakowuje spakowaną wersję exploita i ładuje ją do pamięci komputera, a następnie uruchomia;
- Złośliwe oprogramowanie ma teraz przyczółek i będzie szpiegować użytkowników, czekając na wprowadzenie poświadczeń. Może również przesyłać pliki, wykonywać je i wstrzykiwać się w procesy przeglądarki w celu monitorowania informacji.
4. AtomBombing
Cyberprzestępcy, jak wiemy, nigdy nie siedzą na laurach. Regularnie zmieniają techniki wykorzystywane przez malware, aby stać się jeszcze bardziej niezauważalni. W miarę jak metoda proces hollowing była bardziej związana z metoda działania malware Dridex, jej autorzy poszukiwali nowych sposobów na wykonanie złośliwego oprogramowania – opracowali nową technikę o nazwie AtomBombing.
AtomBombing to exploit, w którym atakujący piszą złośliwy kod odwołujący się do atomowych tabel Windows, a następnie zmuszają legitymizowany program do pobrania kodu z tabeli. Dla Dridex oznaczało to tyle:
- złośliwy bufor jest zapisywany w atomowej tabeli;
- asynchroniczne wywołanie procedury (APC) zostało użyte do zaplanowania procesu docelowego w celu pobrania bufora i umieszczenia go w pamięci do odczytu i zapisu;
- łańcuch programowania zorientowanego na powrót (ROP) skopiował bufor do pamięci RWX, gdzie następnie został wykonany.
5. Inline hooking
Inline hooking to modyfikowanie funkcji “inline” do “hook” i przekierowanie wykonania. Często wiąże się to z modyfikacją kilku pierwszych instrukcji kodu w celu przeniesienia przepływu wykonania kodu na ten złośliwy i następnie wykonanie następnie przekierowania do jego legitymizowanego wywołania.
Złośliwe oprogramowanie Zeus – które ma długą karierę ze względu na techniki ukrywania się – infekuje przez phishing, a następnie przechwytuje funkcje związane z komunikacją http i wykorzystuje rejestrowanie naciśnięć klawiszy w przeglądarce w celu kradzieży haseł i uzyskiwania dostępu do kont ofiary.
Jak efektywnie wykrywać malware w pamięci?
Analiza pamięci jest kluczowym elementem każdego rozwiązania do wykrywania ataków, ponieważ sposób tradycyjnego wykrywania oparty na sygnaturach nie wykryje technik, które opisaliśmy powyżej. „Polowanie” w pamięci na malware pozwala nam szczegółowo przyjrzeć się procesom i ocenić, czy zostały naruszone.
Metoda polegająca na analizie zachowania izolowanych procesów różni się bardzo od spojrzenia na skalę i wciąż pozostaje dużo do zrobienia w tej dziedzinie. Musimy opracować wskaźniki, które łączą i identyfikują niektóre zachowania, które widzimy podczas ataków w pamięci. Jednak wyniki nadal będą wymagać od dyskrecji i doświadczenia wykwalifikowanego analityka, aby zrozumieć, co się stało, i zdecydować, co dalej.
O tym jak skutecznie wykrywać malware dowiesz się z innych artykułów Kampanii Malware na Kapitanie Hacku między innymi w artykule Wykrywanie i analiza malware.