
Badając sprawy związane z phishingiem, sieciami botów, transakcjami oszustów i zbrojnymi grupami hakerskimi, eksperci Group-IB od wielu lat wykorzystują analizę grafową do identyfikacji różnego rodzaju powiązań. W różnych przypadkach istnieją własne zbiory danych, własne algorytmy wykrywania powiązań oraz interfejsy dostosowane do konkretnych zadań. Wszystkie te narzędzia były wewnętrznymi rozwiązaniami Group-IB i były dostępne tylko dla naszych pracowników.
Analiza grafowa infrastruktury sieciowej (graf sieciowy) stała się pierwszym wewnętrznym narzędziem, które wdrożyliśmy we wszystkie publiczne produkty firmy. Zanim stworzyliśmy nasz graf sieciowy, przeanalizowaliśmy wiele podobnych rozwiązań na rynku i nie znaleźliśmy żadnego produktu, który spełniałby nasze własne potrzeby. W tym artykule opowiemy o tym, jak stworzyliśmy graf sieciowy, jak go wykorzystujemy i z jakimi trudnościami się spotkaliśmy.
Dmitrij Wołkow, CTO Group-IB i szef działu cyberwywiadu
Jakie umiejętności posiada graf sieciowy Group-IB?
Śledztwa
Od momentu założenia Group-IB w 2003 roku do chwili obecnej identyfikacja, deanonimizacja i pociąganie cyberprzestępców do odpowiedzialności są naszym głównym priorytetem. Żadne śledztwo dotyczące ataku cybernetycznego nie obyło się bez analizy infrastruktury sieciowej napastników. Na początku naszej drogi była to bastante żmudna 'ręczna praca' nad poszukiwaniem powiązań, które mogły pomóc w identyfikacji przestępców: informacje o nazwach domen, adresach IP, cyfrowych odciskach serwerów itp.
Większość atakujących stara się działać w sieci maksymalnie anonimowo. Jednak, jak wszyscy ludzie, popełniają błędy. Głównym celem takiej analizy jest znalezienie "białych" lub "szarych" historycznych projektów przestępców, które mają powiązania z złośliwą infrastrukturą używaną w aktualnym incydencie, który badamy. Jeśli uda się odkryć "białe projekty", to zidentyfikowanie atakującego zazwyczaj staje się trywialnym zadaniem. W przypadku „szarych” na poszukiwania potrzeba więcej czasu i wysiłku, ponieważ ich właściciele starają się anonimizować lub ukryć dane rejestracyjne, jednak szanse pozostają dość wysokie. Zazwyczaj na początku swojej działalności przestępczej atakujący poświęcają mniej uwagi własnemu bezpieczeństwu i popełniają więcej błędów, dlatego im głębiej możemy zagłębić się w historię, tym większe szanse na udane śledztwo. Dlatego sieciowy graf z solidną historią to niezwykle ważny element takiego śledztwa. Mówiąc prościej, im bardziej szczegółowymi danymi historycznymi dysponuje firma, tym lepszy jej graf. Przykładowo, historia trwająca 5 lat może pomóc w rozwiązaniu, powiedzmy, 1-2 z 10 przestępstw, a historia za 15 lat daje szanse na rozwiązanie wszystkich dziesięciu.
Wykrywanie phishingu i oszustw
Za każdym razem, gdy otrzymujemy podejrzany link do phishingu, oszukańczych lub pirackich zasobów, automatycznie budujemy graf powiązanych zasobów sieciowych i sprawdzamy wszystkie znalezione hosty pod kątem podobnej treści. Umożliwia to znajdowanie zarówno starych stron phishingowych, które były aktywne, ale nieznane, jak i zupełnie nowych, które są przygotowane do przyszłych ataków, ale jeszcze nie są używane. Elementarny przykład, który zdarza się dość często: znaleźliśmy stronę phishingową na serwerze, na którym jest tylko 5 stron. Sprawdzając każdą z nich, znajdujemy treści phishingowe również na pozostałych stronach, co oznacza, że możemy zablokować 5 zamiast 1.
Wyszukiwanie backendów
Ten proces jest niezbędny, aby ustalić, gdzie faktycznie znajduje się złośliwy serwer.
99% sklepów kartowych, forów hakerskich, liczne zasoby phishingowe i inne złośliwe serwery ukrywają się zarówno za własnymi serwerami proxy, jak i za proxy legalnych usług, takich jak Cloudflare. Wiedza o rzeczywistym backendzie jest bardzo ważna dla dochodzeń: staje się znany dostawca hostingu, od którego można zająć serwer, pojawia się możliwość budowania powiązań z innymi złośliwymi projektami.
Na przykład, masz stronę phishingową do zbierania danych kart bankowych, która rozwiązuje się na adres IP 11.11.11.11, oraz adres sklepu kartowego, który rozwiązuje się na adres IP 22.22.22.22. W trakcie analizy może się okazać, że zarówno strona phishingowa, jak i sklep kartowy mają wspólny adres IP backendu, np. 33.33.33.33. Ta wiedza pozwala na budowanie powiązania między atakami phishingowymi a sklepem kartowym, na którym mogą być sprzedawane dane kart bankowych.
Korelacja zdarzeń
Kiedy masz dwa różne zdarzenia (na przykład, w IDS) z różnym złośliwym oprogramowaniem i różnymi serwerami do zarządzania atakami, będziesz je traktować jako dwa niezależne zdarzenia. Ale jeśli istnieje silne powiązanie między infrastrukturami złośliwymi, to staje się oczywiste, że to nie są różne ataki, a etapy jednego, bardziej złożonego wieloetapowego ataku. A jeśli jedno z tych zdarzeń już zostało przypisane do jakiejś grupy napastników, to także drugie może być przypisane do tej samej grupy. Oczywiście, proces atrybucji jest znacznie bardziej skomplikowany, więc traktuj to, co napisano, jako prosty przykład.
Wzbogacanie wskaźników
Nie będziemy poświęcać temu dużo uwagi, ponieważ to jest najczęstszy scenariusz użycia grafów w cyberbezpieczeństwie: podajesz jeden wskaźnik, a na wyjściu otrzymujesz zbiór powiązanych wskaźników.
Wykrywanie wzorców
Wykrywanie wzorców jest niezbędne do skutecznego polowania. Grafy pozwalają nie tylko znaleźć powiązane elementy, ale także wykrywać wspólne cechy, które są charakterystyczne dla określonej grupy hakerów. Znajomość takich unikalnych cech pozwala rozpoznać infrastrukturę napastników już na etapie przygotowań i bez dowodów potwierdzających atak, takich jak e-maile phishingowe czy złośliwe oprogramowanie.
Dlaczego stworzyliśmy naszą sieć grafową?
Powtórzę, że rozważyliśmy rozwiązania od różnych dostawców, zanim doszliśmy do wniosku, że musimy opracować własne narzędzie, które potrafi to, czego nie ma w żadnym istniejącym produkcie. Jego stworzenie zajęło kilka lat, w trakcie których wielokrotnie całkowicie je zmienialiśmy. Mimo długiego czasu opracowywania, nadal nie znaleźliśmy ani jednego odpowiednika, który spełniałby nasze wymagania. Dzięki naszemu produktowi udało nam się ostatecznie rozwiązać praktycznie wszystkie problemy, które zaobserwowaliśmy w istniejących sieciowych grafach. Poniżej szczegółowo omówimy te problemy:
Problem
Rozwiązanie
Brak dostawcy z różnymi zbiorami danych: domenami, passive DNS, passive SSL, rekordami DNS, otwartymi portami, uruchomionymi usługami na portach, plikami, które współdziałają z nazwami domen i adresami IP. Wyjaśnienie. Zazwyczaj dostawcy oferują oddzielne typy danych, a aby zebrać pełny obraz, trzeba wykupić subskrypcje u wszystkich. Jednak nawet wtedy nie zawsze udaje się uzyskać wszystkie dane: niektórzy dostawcy passive SSL oferują dane tylko o certyfikatach wydanych przez zaufane CA, a pokrycie certyfikatów samopodpisanych jest u nich bardzo słabe. Inni dostarczają dane także o certyfikatach samopodpisanych, ale zbierają je tylko z standardowych portów.
Zebraliśmy wszystkie wyżej wymienione zbiory sami. Na przykład, aby zebrać dane o certyfikatach SSL, napisaliśmy własną usługę, która zbiera je zarówno od zaufanych CA, jak i w wyniku skanowania całej przestrzeni IPv4. Certyfikaty były zbierane nie tylko z IP, ale także ze wszystkich domen i subdomen z naszej bazy: jeśli masz domenę example.com i jej subdomenę i wszystkie one rezolwują się na IP 1.1.1.1, to przy próbie uzyskania certyfikatu SSL z portu 443 dla IP, domeny i jej subdomeny możesz uzyskać trzy różne wyniki. Aby zebrać dane o otwartych portach i uruchomionych usługach, musieliśmy stworzyć własny rozproszony system skanowania, ponieważ w przypadku innych usług IP adresy skanujących serwerów często znajdowały się na „czarnej liście”. Nasze skanujące serwery także trafiają na „czarne listy”, ale wyniki odkrywania potrzebnych nam usług są lepsze niż tych, którzy po prostu skanują jak najwięcej portów i sprzedają dostęp do tych danych.
Brak dostępu do pełnej bazy historycznych zapisów. Wyjaśnienie. Każdy normalny dostawca ma dobrą historię, ale z oczywistych powodów jako klienci nie mogliśmy uzyskać dostępu do wszystkich danych historycznych. Tzn. można uzyskać pełną historię dla pojedynczego rekordu, na przykład dla domeny lub adresu IP, ale nie można zobaczyć historii całości — bez tego nie można zobaczyć pełnego obrazu.
Aby zebrać jak najwięcej historycznych zapisów dotyczących domen, zakupiliśmy różne bazy, przeszukiwaliśmy wiele otwartych zasobów, które miały tę historię (na szczęście takich było wiele) oraz dogadywaliśmy się z rejestratorami nazw domen. Wszystkie aktualizacje w naszych własnych kolekcjach są oczywiście przechowywane z pełną historią zmian.
Wszystkie istniejące rozwiązania pozwalają na ręczne tworzenie grafu. Wyjaśnienie. Załóżmy, że kupiłeś wiele subskrypcji od wszystkich możliwych dostawców danych (zwykle nazywanych „wzbogacaczami”). Kiedy potrzebujesz zbudować graf, „ręcznie” wydajesz polecenie na rozbudowę od danego elementu połączenia, następnie spośród pojawiających się elementów wybierasz potrzebne i wydajesz polecenie na rozbudowę połączeń od nich i tak dalej. W tym przypadku odpowiedzialność za jakość zbudowanego grafu spoczywa całkowicie na osobie.
Zrealizowaliśmy automatyczne budowanie grafów. Tzn. jeśli potrzebujesz zbudować graf, to połączenia od pierwszego elementu są budowane automatycznie, a następnie od wszystkich kolejnych również. Specjalista jedynie wskazuje głębokość, z jakiej należy zbudować graf. Sam proces automatycznej rozbudowy grafów jest prosty, ale inni dostawcy go nie realizują, ponieważ generuje on ogromną ilość nierelatywnych wyników, a ten niedobór również musieliśmy uwzględnić (patrz poniżej).
Wiele nieistotnych wyników to problem wszystkich grafów dotyczących elementów sieciowych. Wyjaśnienie. Na przykład, "zły domen" (uczestniczył w ataku) jest powiązany z serwerem, z którym w ciągu ostatnich 10 lat związanych jest 500 innych domen. Przy ręcznym dodawaniu lub automatycznym budowaniu grafu wszystkie te 500 domen również powinno pojawić się na grafie, mimo że nie mają nic wspólnego z atakiem. Albo, na przykład, sprawdzasz wskaźnik IP z raportu dostawcy bezpieczeństwa. Zazwyczaj takie raporty pojawiają się z znacznym opóźnieniem i często obejmują rok lub więcej. Prawdopodobnie w momencie, gdy czytasz raport, serwer z tym adresem IP został już wynajęty innym użytkownikom z innymi powiązaniami, a budowa grafu spowoduje, że znów otrzymasz nieistotne wyniki.
Nauczyliśmy system wykrywać nieistotne elementy w ten sam sposób, w jaki naši eksperci robili to ręcznie. Na przykład sprawdzasz złą domenę example.com, która obecnie rozwiązuje się na IP 11.11.11.11, a miesiąc temu na IP 22.22.22.22. Z IP 11.11.11.11, oprócz domeny example.com, powiązana jest również example.ru, a z IP 22.22.22.22 związanych jest 25 tysięcy innych domen. System, tak jak człowiek, rozumie, że 11.11.11.11 to prawdopodobnie serwer dedykowany, a ponieważ domena example.ru jest podobna do example.com, jest bardzo prawdopodobne, że są one ze sobą powiązane i powinny znaleźć się na grafie; natomiast IP 22.22.22.22 należy do hostingu współdzielonego, więc nie trzeba umieszczać wszystkich jego domen na grafie, jeśli nie ma innych powiązań, które wskazują, że któraś z tych 25 tysięcy domen również powinna się znaleźć (na przykład example.net). Zanim system zrozumie, że należy zerwać powiązania i nie umieszczać części elementów na grafie, uwzględnia wiele właściwości elementów i klastrów, w które te elementy są połączone, a także siłę aktualnych powiązań. Na przykład, jeśli na grafie mamy mały klaster (50 elementów), do którego należy zła domena, oraz kolejny duży klaster (5 tysięcy elementów) i oba klastry są połączone słabym (o niskiej wadze) powiązaniem, to takie powiązanie zostanie zerwane, a elementy z dużego klastra zostaną usunięte. Ale jeśli powiązań między małym i dużym klastrem będzie dużo i ich siła będzie stopniowo wzrastać, wówczas to powiązanie nie zostanie zerwane i na grafie pozostaną odpowiednie elementy z obu klastrów.
Nie uwzględnia się okresu posiadania serwera ani domeny. Wyjaśnienie. Okres rejestracji „złych domen” prędzej czy później wygasa, a one są ponownie kupowane do złośliwych lub legalnych celów. Nawet w przypadku bulletproof hostingów serwery są wynajmowane różnym hakerom, dlatego kluczowe jest wiedzieć i uwzględniać czas, kiedy dany domena/serwer znajdował się pod kontrolą jednego właściciela. Często spotykamy się ze sytuacją, w której serwer z adresem IP 11.11.11.11 jest obecnie używany jako C&C dla botów bankowych, podczas gdy jeszcze 2 miesiące temu zarządzał nim ransomware. Jeśli będziemy budować powiązania, nie uwzględniając okresów posiadania, wydaje się, że istnieje związek między właścicielami sieci botów bankowych a wymuszaczami, podczas gdy w rzeczywistości go nie ma. W naszej pracy taki błąd jest krytyczny.
Nauczyliśmy system rozpoznawać okresy posiadania. Dla domen jest to stosunkowo proste, ponieważ w whois często podane są daty rozpoczęcia i wygaszenia rejestracji, a kiedy mamy pełną historię zmian whois, określenie okresów jest łatwe. Gdy okres rejestracji domeny nie wygasł, ale jej zarządzanie zostało przekazane innym właścicielom, również można to śledzić. W przypadku certyfikatów SSL nie ma tego problemu, ponieważ są one wydawane raz, nie są przedłużane ani przenoszone. Jednak certyfikatom samopodpisanym nie można ufać datom wskazanym w okresach ważności certyfikatu, ponieważ można wygenerować certyfikat SSL dzisiaj, a datę jego rozpoczęcia ustawić na rok 2010. Najtrudniej jest określić okresy posiadania serwerów, ponieważ daty i okresy wynajmu znane są tylko dostawcom hostingu. Aby określić okres posiadania serwera, zaczęliśmy wykorzystywać wyniki skanowania portów i tworzenie odcisków palców uruchomionych usług na portach. Na podstawie tych informacji możemy dość dokładnie określić, kiedy zmieniał się właściciel serwera.
Mało powiązań. Wyjaśnienie. Obecnie nie ma problemu, by nawet za darmo uzyskać listę domen, w których whois wskazany jest dany adres e-mail, lub poznać wszystkie domeny, które były powiązane z określonym adresem IP. Jednak kiedy mowa o hakerach, którzy robią wszystko, aby trudniej było ich śledzić, potrzebne są dodatkowe „sztuczki”, które pozwolą znaleźć nowe właściwości i zbudować nowe powiązania.
Poświęciliśmy dużo czasu na badanie sposobów pozyskiwania danych, które są niedostępne w tradycyjny sposób. Nie możemy opisywać, jak to działa, z oczywistych powodów, ale w pewnych okolicznościach hakerzy popełniają błędy przy rejestracji domen lub wynajmie i konfiguracji serwerów, które pozwalają na ujawnienie adresów e-mail, pseudonimów hakerów oraz adresów backendowych. Im więcej powiązań wydobędziesz, tym dokładniej można budować grafy.
Jak działa nasz graf
Aby rozpocząć korzystanie z sieciowego grafu, należy wpisać w pasku wyszukiwania domenę, adres IP, e-mail lub odcisk certyfikatu SSL. Istnieją trzy parametry, którymi może zarządzać analityk: czas, głębokość kroków i czyszczenie.
![]()
Czas
Czas – data lub interwał, w którym poszukiwany element był wykorzystywany do celów złośliwych. Jeśli ten parametr nie zostanie określony, system samodzielnie zdefiniuje ostatni interwał posiadania tego zasobu. Na przykład 11 lipca firma Eset opublikowała o tym, jak Buhtrap wykorzystuje 0-day exploit do cyber szpiegostwa. Na końcu raportu znajduje się 6 wskaźników. Jeden z nich secure-telemetry[.]net został ponownie zarejestrowany 16 lipca. Dlatego jeśli będziesz budować graf po 16 lipca, otrzymasz nieistotne wyniki. Ale jeśli wskażesz, że ta domena była używana przed tą datą, to do grafu dostaną się 126 nowych domen i 69 adresów IP, które nie są wymienione w raporcie Eset:
- ukrfreshnews[.]com
- unian-search[.]com
- vesti-world[.]info
- runewsmeta[.]com
- foxnewsmeta[.]biz
- sobesednik-meta[.]info
- rian-ua[.]net
- itd.
Oprócz wskaźników sieciowych, od razu znajdujemy powiązania z złośliwymi plikami, które miały połączenia z tą infrastrukturą oraz metatagami, które sugerują, że używano Meterpreter i AZORult.
Najwspanialsze jest to, że otrzymujesz ten wynik w ciągu jednej sekundy i już nie musisz spędzać dni na analizie danych. Bez wątpienia takie podejście niekiedy znacznie skraca czas potrzebny na dochodzenia, co często bywa krytyczne.

Liczba kroków lub głębokość rekurencji, z jaką będzie budowany graf
Domyślnie głębokość wynosi 3. Oznacza to, że od poszukiwanego elementu znajdowane są wszystkie bezpośrednio powiązane elementy, a następnie od każdego nowego elementu budowane są nowe powiązania z innymi elementami, a już od nowych elementów z poprzedniego kroku będą nowe elementy.
We will take an example unrelated to APT and 0-day exploits. Recently, an interesting case about fraud related to cryptocurrencies was described on Habrahabr. The report mentions a domain — themcx[.]co, used by fraudsters for hosting a site that pretends to be a Miner Coin Exchange, and phone-lookup[.]xyz, used to attract traffic.
From the description, it is clear that the scheme requires a fairly large infrastructure to attract traffic to fraudulent resources. We decided to look at this infrastructure by building a graph in 4 steps. The output was a graph with 230 domains and 39 IP addresses. Next, we split the domains into 2 categories: those that resemble cryptocurrency-related services and those intended for driving traffic through phone lookup services:
Related to cryptocurrency
Related to phone lookup services
coinkeeper[.]cc
caller-record[.]site.
mcxwallet[.]co
phone-records[.]space
btcnoise[.]com
fone-uncover[.]xyz
cryptominer[.]watch
number-uncover[.]info

Wyczyść
By default, the "Clear Graph" option is enabled, and all irrelevant elements will be removed from the graph. This feature was also used in all previous examples. I anticipate a natural question: how to ensure that something important is not deleted? I will answer: for analysts who like to build graphs manually, the automated cleaning can be disabled, and the number of steps can be set to 1. Then, the analyst can extend the graph from the required elements and remove irrelevant elements according to the task.
Already in the graph, the analyst has access to the history of whois changes, DNS, as well as open ports and the services running on them.

Financial phishing
We investigated the actions of an APT group that, for several years, conducted phishing attacks against customers of various banks in different regions. A characteristic feature of this group was the registration of domains very similar to the names of real banks, and most phishing sites had identical designs, with differences only in the names of banks and their logos.

W tym przypadku bardzo pomogła nam zautomatyzowana analiza grafowa. Biorąc jeden z ich domen — lloydsbnk-uk[.]com, w ciągu kilku sekund zbudowaliśmy graf o głębokości 3 kroków, który ujawnił ponad 250 złośliwych domen, które były wykorzystywane przez tę grupę od 2015 roku i nadal są używane. Niektóre z tych domen zostały już wykupione przez banki, ale według historycznych zapisów widać, że wcześniej były zarejestrowane na atakujących.
Dla zobrazowania na rysunku przedstawiono graf o głębokości 2 kroków.
Ciekawe, że już w 2019 roku atakujący nieco zmienili taktykę i zaczęli rejestrować nie tylko domeny banków do hostingu strony phishingowej, ale także domeny różnych firm konsultingowych do wysyłania phishingowych e-maili. Na przykład domeny swift-department.com, saudconsultancy.com, vbgrigoryanpartners.com.

Cobalt gang
W grudniu 2018 roku grupa hakerska Cobalt, specjalizująca się w ukierunkowanych atakach na banki, przeprowadziła wysyłkę w imieniu Narodowego Banku Kazachstanu.

W e-mailach znajdowały się linki do hXXps://nationalbank.bz/Doc/Prikaz.doc. Pobierany dokument zawierał makro, które uruchamiało powershell, próbujące pobrać i wykonać plik z hXXp://wateroilclub.com/file/dwm.exe w %Temp%einmrmdmy.exe. Plik %Temp%einmrmdmy.exe aka dwm.exe — CobInt stager, zaprogramowany do interakcji z serwerem hXXp://admvmsopp.com/rilruietguadvtoefmuy.
Wyobraź sobie, że nie masz możliwości otrzymania tych phishingowych e-maili i przeprowadzenia pełnej analizy złośliwych plików. Graf złośliwej domeny nationalbank[.]bz natychmiast pokazuje zależności z innymi złośliwymi domenami, przypisuje to do grupy i pokazuje, jakie pliki zostały użyte w ataku.

Weźmy z tego grafu adres IP 46.173.219[.]152 i zbudujmy według niego graf w jednym przejściu i wyłączmy oczyszczanie. Z nim wiąże się 40 domen, na przykład bl0ckchain[.]ug.
paypal.co.uk.qlg6[.]pw
cryptoelips[.]com
Sądząc po nazwach domen, wydaje się, że są wykorzystywane w schematach oszustw, ale algorytm oczyszczania zrozumiał, że nie mają one związku z tym atakiem i nie uwzględnił ich w grafie, co znacznie upraszcza proces analizy i atrybucji.

Jeśli na nowo zbudujemy graf według nationalbank[.]bz, ale wyłączając algorytm oczyszczania grafu, to na nim znajduje się ponad 500 elementów, z czego większość nie ma związku ani z grupą Cobalt, ani z ich atakami. Przykład, jak wygląda taki graf, przedstawiono poniżej:

Podsumowanie
Po kilku latach precyzyjnych dostosowań, testów w rzeczywistych dochodzeniach, badań zagrożeń i tropienia atakujących, udało nam się nie tylko stworzyć unikalne narzędzie, ale także zmienić podejście ekspertów w firmie. Na początku eksperci techniczni chcieli pełnej kontroli nad procesem budowania grafu. Przekonanie ich, że automatyczne generowanie grafu potrafi to zrobić lepiej niż człowiek z wieloletnim doświadczeniem, było niezwykle trudne. Wszystko zmienił czas i wielokrotne „ręczne” weryfikacje wyników, które generował graf. Teraz nasi eksperci nie tylko ufają systemowi, ale również wykorzystują uzyskane przez niego wyniki w codziennej pracy. Ta technologia działa w każdej z naszych systemów i pozwala na lepsze wykrywanie zagrożeń wszelkiego rodzaju. Interfejs do ręcznej analizy grafu jest wbudowany we wszystkie produkty Group-IB i znacznie poszerza możliwości w zakresie tropienia przestępczości komputerowej. To potwierdzają opinie analityków ze strony naszych klientów. My z kolei nadal wzbogacamy graf danymi i pracujemy nad nowymi algorytmami wykorzystującymi sztuczną inteligencję, aby osiągnąć jak najdokładniejszy graf sieciowy.
Źródło: habr.com
