Bronimy dużej firmy. Kupujemy porządnego EDR-a. Instalujemy na stacjach. EDR pracuje, wysyła alerty, gdy znajdzie coś podejrzanego. Alerty analizujemy i reagujemy na te poważne. A włamywacz przychodzi ze swoimi narzędziami i robi swoje.
Poniższy artykuł zawiera opis śladów i narzędzi, zostawionych przez włamywaczy w jednej z polskich spółek. Włamywacze robili swoje, a alerty EDR-a zabrzmiały poważnie dopiero wtedy, gdy przystąpili do szyfrowania dysków. Administratorzy zdążyli wyrzucić włamywaczy, zanim doszło do tragedii. Napastnicy zostawili po sobie ciekawe narzędzia, w większość niewykrywane przez rozwiązania antywirusowe. Artykuł jest fragmentem raportu firmy Cyber Arms, która miała za zadanie ustalić, jak doszło do włamania i co w sieci robili sprawcy.
Początek roku dla zespołu IT w jednej z dużych polskich spółek rozpoczął się nieoczekiwaną pobudką w środku nocy. Wstępne ustalenia potwierdziły uzyskanie nieuprawnionego dostępu do części zasobów infrastruktury sieciowej. Uruchomiono proces obsługi incydentu, zrealizowany przez zespół Incident Response firmy Cyber Arms, który potwierdził włamanie, pozwolił ustalić skalę infekcji oraz jej orientacyjny przebieg. W ramach działań operacyjnych udało się pozyskać narzędzia, którymi posługiwali się włamywacze – ich analizę prezentujemy w dalszej części artykułu.
Kluczowe ustalenia
- Najstarsze ślady niepożądanej aktywności wskazywały na ataki typu brute force napastników na różne usługi Windows wewnątrz infrastruktury firmy. Ataki prowadzone były po prawidłowym uwierzytelnieniu do usługi VPN. Nie ustalono, w jaki sposób doszło do nieuprawnionego dostępu do VPN-a – logi nie sięgały tak daleko.
- Zabezpieczono 3 próbki złośliwego oprogramowania, które były wykorzystywane przez napastnika w toku prowadzonego włamania. Dalsza analiza wykazała małą popularność używanych próbek.
- Celem atakującego było zdobycie kontroli nad kluczowymi elementami infrastruktury IT, zgromadzenie i pobranie wrażliwych zbiorów danych. W ostatnim kroku dane były usuwane z kopii bezpieczeństwa i szyfrowane w celu wyłudzenia okupu.
- Większość tych celów została zrealizowana, łącznie z uzyskaniem dominacji w środowisku Active Directory.
Cały proces obsługi incydentu trwał ok. 48h. W tym czasie udało się powstrzymać przestępców, zabezpieczyć próbki oraz przeanalizować pozyskany materiał.
Analiza pozyskanych próbek
Napastnik preferował korzystanie z autorskich rozwiązań w toku włamania. Zgromadzone oprogramowanie zostało wytworzone w języku Delphi i posiadało bardzo proste mechanizmy zwodzenia analityka oraz minimalną ilość zaciemniania kodu. W każdej próbce odnaleziono frazy zawierające odstęp pomiędzy tekstem a dwukropkiem, dlatego nadano aktorowi nazwę roboczą Spacecolon.
Zabezpieczono łącznie 3 próbki złośliwego oprogramowania wykorzystywane w ataku oraz 8 powiązanych próbek wysłanych do serwisu VirusTotal. Analiza telemetrii wykazała niewielką aktywność napastnika w 2022 roku, w różnych częściach świata. Pliki zostały sklasyfikowane jako nieszkodliwe przez większość programów antywirusowych. Jedna z próbek pozostała niewykryta przez żaden program antywirusowy.
Narzędzie ap.exe
Pierwszym narzędziem wykorzystywanym przez napastnika po uzyskaniu nieuprawnionego dostępu była aplikacja o nazwie ap.exe
. Pełni ona rolę pakietu narzędziowego z interfejsem użytkownika, który ułatwia napastnikowi dalsze poruszanie się po infrastrukturze sieciowej. Uruchomienie aplikacji poprzedzone jest fałszywym komunikatem o błędzie mającym zmylić użytkownika lub utrudnić analizę.
Kliknięcie przycisku “OK” zamyka aplikację, ale dwukrotne kliknięcie w środek etykiety pozwala przejść do właściwej części programu.
Warto podkreślić, że część przycisków formularza nie posiada jeszcze kodu realizującego zaprojektowane czynności. Funkcje, które zostały już zaimplementowane, to:
- Pobranie i uruchomienie aplikacji
PortablePlatform.exe
, zawierającej instalator do przenośnych aplikacji dostępnych w serwisie PortableApps[.]com. Aplikacja jest pobierana z serwera kontrolowanego przez napastników w trakcie uruchomienia. - Dodanie lokalnego użytkownika z prawami administracyjnymi do systemu operacyjnego.
- Usunięcie pliku konfiguracyjnego, zawierającego m.in. hasło aplikacji Cobian Backup 11.
- Zmiana układu klawiatury.
- Wyłączenie usługi Windows Defender.
- Zabicie procesów
osk.exe
iwinupas.exe
, które najprawdopodobniej stanowią złośliwe oprogramowanie typu ransomware z rodziny Vega/Bomber/Amnesia. - Wyświetlenie podstawowych informacji dot. systemu operacyjnego.
- Prosty generator haseł.
- Otwarcie eksploratora systemu Windows w aktualnym katalogu roboczym.
- Wyłączenie lub ponowne uruchomienie komputera.
- Wysłanie zebranych wcześniej plików do serwera kontrolowanego przez przestępców.
Adresy URI, z których pobierane są składniki aplikacji zostały zaciemnione w kodzie pliku wykonywalnego. W tym celu zaimplementowano prosty algorytm do dekodowania wartości wtedy, kiedy są one potrzebne do działania aplikacji. Algorytm ten zawiera kombinacje operacji arytmetycznych i logicznych, a w ostatnim kroku uzależnia wartość aktualnie dekodowanego znaku ze znakiem poprzednim. Zaciemnione dane można odkodować przy użyciu następującego skryptu:
MUL = 0xd201
ADD = 0x7f6a
IV = 0x0639
def decode(encoded: str, iv = IV) -> str:
decoded = b""
for ch in bytearray.fromhex(encoded):
xorVal = iv >> 8 & 0xff
decoded += chr(ch ^ xorVal).encode("utf-8")
iv += ch
iv = (iv * MUL + ADD) & 0xffff
return decoded.decode("utf-8")
Aplikacja posiada statycznie dowiązaną bibliotekę IPWorks, która realizuje operacje kompresji plików, szyfrowania oraz komunikacji przy użyciu protokołu HTTP. Nagłówek User-Agent z wartością Toolkit 100101 Firefox/41.0
został umieszczony w kodzie aplikacji na stałe:
Oprogramowanie nie instaluje w systemie żadnych pozostałych składników pozwalających na zdalny dostęp lub przetrwanie ponownego uruchomienia systemu operacyjnego. Co ciekawe, w kodzie można znaleźć komunikaty zapisane po turecku.
Instalator installer.exe
Wielkość pliku przekracza 20 MB, co wskazuje na osadzenie w nim innych zasobów, potencjalnie plików wykonywalnych. Po uruchomieniu aplikacja zapisuje w katalogu roboczym plik cert.pfx
, który jest magazynem danych kryptograficznych. W jego skład wchodzi certyfikat x.509, wskazujący na podmiot IBM
oraz odpowiadający mu klucz prywatny RSA. Plik kontenera zaszyfrowany jest przy pomocy frazy dd1q2w3e
.
Wspomniane dane kryptograficzne wykorzystywane są do weryfikacji łańcucha certyfikatów podczas nawiązywania szyfrowanego połączenia.
Przycisk Check (Connectivity) umożliwia sprawdzenie połączenia z serwerami C2 przestępców, spełniając opisane powyżej warunki uwierzytelnienia. W momencie analizy 2 z 4 domen wskazywało na serwery, które akceptowały połączenia. Test połączenia ujawnił kolejny komunikat w języku tureckim.
Główną funkcją aplikacji jest instalacja docelowego backdoora w systemie ofiary. Do tego służą przyciski u dołu aplikacji (Install i Check). W przypadku żądania instalacji wykonane zostaną następujące kroki:
- Utworzenie katalogu
C:\ProgramData\MicrosoftSMM
. - Zapisanie do katalogu zaszyfrowanego pliku, który został zagnieżdżony w aplikacji instalatora (
service
). - Plik zostanie odszyfrowany jako
svcss.exe
. - Ostatnim krokiem jest uruchomienie pliku z parametrem
/install
, który dalej poprowadzi proces instalacji.
Instalacja realizowana jest przez wywołanie funkcji WinAPI ShellExecuteW
, uruchamiającej proces svcss.exe
z parametrem /install
. Jeśli operacja zostanie wykonana na koncie uprzywilejowanym, do sytemu operacyjnego zostanie dodana usługa UpdateStoreServ
oraz zadanie harmonogramu systemu Windows:
Narzędzie zdalnej kontroli svcss.exe
Jest to kolejna próbka napisana w Delphi, jednak w odróżnieniu od poprzednich została skompilowana na architekturę x86_64. Poza IPworks korzysta również z biblioteki SecureBridge, która według dokumentacji implementuje wiele protokołów sieciowych, m.in. SSH.
Plik instaluje się jako usługa systemu Windows oraz dodaje zadanie harmonogramu, które co godzinę podejmuje próbę uruchomienia usługi (nawet jeśli ta jest już uruchomiona). Do instalacji służy parametr /install
, analogicznie usługę można usunąć lub naprawić przy użyciu parametrów /uninstall
lub /reinstall
. Deinstalacja usługi pozostawia zadanie harmonogramu Windows, ponieważ twórcy zapomnieli zaimplementować mechanizm je usuwający.
Złośliwa usługa uruchamia plik svcss.exe
z parametrem /startedbyscm:00D244E7-B5119CE0-UpdateStorServ
. Następnie nawiązywane jest połączenie z serwerem C2, wysłanie informacji o systemie i oczekiwanie na komendy do wykonania. Adresy serwerów C2 zostały umieszczone w pliku wykonywalnym.
W badanej próbce osadzono również plik cert.pfx
zawierający ten sam klucz i certyfikat, który umieszczony został w aplikacji instalatora. Dodatkowo identyczne certyfikaty zostały wykorzystane do konfiguracji usługi HTTP serwera C2. Oznacza to ujawnienie klucza prywatnego, służącego przestępcom do uwierzytelnienia swoich serwerów C2. Wykorzystując te informacje, można przeprowadzić prosty atak typu MITM na komunikację C2:
Treść odszyfrowanej komunikacji potwierdza wcześniejsze ustalenia dot. funkcjonalności badanej próbki. Po zgłoszeniu podstawowych informacji, wysyłany jest co 10 sekund komunikat podtrzymujący połączenie. Poniżej przedstawiono listę obsługiwanych przez złośliwe oprogramowanie komend:
- DETAILS – zwraca informacje dot. systemu operacyjnego,
- SETNOTE – umożliwia nadpisanie pliku
svcss.ini
, - TUNNEL – umożliwia tunelowanie połączeń poprzez zainfekowane urządzenie,
- DISCONNECT – zrywa połączenie z C2,
- DOWNEXEC – pobiera i uruchamia plik wykonywalny,
- CMD – wykonuje komendę interpretera poleceń,
- TASKSCHED – służy do manipulacji zadaniami harmonogramu.
Powyższe ustalenia umożliwiają stworzenie własnego serwera C2 i przekierowanie do niego ruchu aplikacji (sinkholing) oraz wysyłanie własnych poleceń. Za pomocą polecenia CMD
z odpowiednią wartością można skłonić złośliwe oprogramowanie do samodzielnego odinstalowania.
Charakterystyka ruchu (regularność i wielkość), jak również niedbałość konfiguracji serwera C2 (ujawnienie klucza, niepodpisany certyfikat) stwarzają duże możliwości wykrywania infekcji.
Wykorzystywane programy narzędziowe
W trakcie ataku wykorzystywane były następujące ogólnodostępne aplikacje:
Napastnik umieszczał aplikacje w katalogu “Moja Muzyka”, należącym do jednego z administratorów. Ich wykorzystanie pozwoliło rozszerzyć infekcję na kolejne serwery oraz zgromadzić wrażliwe zbiory danych i wysłać je na zewnątrz. Znaleziono także ślady niszczenia systemu plików serwerów z wykorzystaniem programu Eraser. Przy użyciu Advanced Run i Windows Password Recovery zostały podjęte próby pozyskania poświadczeń przechowywanych w procesie lsass.exe
.
IOC – informacje wskazujące na możliwy incydent
Poniżej załączamy listę IoC, dzięki której będziecie mogli zweryfikować, czy w waszej infrastrukturze także grasowali przestępcy.
Pliki wykonywalne
Suma kontrolna (SHA256) | Nazwa pliku | Opis |
---|---|---|
17a28a5ec98f65f1607f4d0fb572146b72e0f49470a4500d7c9bfe009bea1ebd | ap.exe | Hacktool |
9b100c48551d497979bb267dbbe28da34b558e0fceeb1cfbe538c465ea455ef6 | ap.exe | Hacktool |
be664cfef54b86929ec66db5f073c22ef9ef3bd5bf97861ef991232f32601e3a | ap.exe | Hacktool |
74b55042515874a36ef7fc354a0f696b22dee282beb921ed2ad94e00302942a4 | ap.exe | Hacktool |
b0ded7052389601329322e31329928f025e7223dc331d7e6147b8b42522722f3 | ap.exe | Hacktool |
86070a98e77b5209370b71dce0160f05a3b18ab106fc9073529869053bfe41f1 | installer.exe | Instalator usługi wersja GUI |
fb1a6ccea5888ad4acd8465efe8555bce2883c24a3b92bab189f079b82a9df3a | installer.exe | Instalator usługi wersje bez GUI |
f70127d70aa766e8e44646ba0ceec59327860dc55c421ecc09030f3f65e779d2 | svcss.exe | Backdoor |
7d73277b2edfdb77a8537cb184c8e0b9fc38fa71d1cb89b9e60d7cf8a9fbb6d8 | svcss.exe | Backdoor |
de2d792b534e6d40b54cd81261b130701199254478cc0cc0b34630632988dd53 | svcss.exe | Backdoor |
3c0be13be97c2b7ac3737997bb56f604a947b4d404456f644b2af4be4f9c17d2 | svcss.exe | Backdoor |
Połączenia sieciowe
Adres | Opis |
---|---|
hxxps://b.688[.]org/list.txt | Plik pobierany podczas uruchomienia próbki ap.exe |
hxxp://b.688[.]org:8080/fileupload | Adres do wysyłania danych (ap.exe) |
hxxps://b.688[.]org/mimi/a.php?task=u | Adres do wysyłania poświadczeń (ap.exe) |
hxxps://b.688[.]org/mimi/a.php?task=p | Adres do wysyłania poświadczeń (ap.exe) |
u.piii[.]net | Adres C2 (installer.exe) |
up.awiki[.]org | Adres C2 (installer.exe) |
up.vctel[.]com | Adres C2 (installer.exe) |
u.cbu[.]net | Adres C2 (installer.exe) |
a.688[.]org | Adres serwera w infrastrukturze napastnika |
b.688[.]org | Adres serwera w infrastrukturze napastnika |
216.58.208.100 | Adres C2 – rozwiązywany z up.vctel[.]com |
87.251.64.57 | Adres C2 – up.awiki[.]org |
3.76.24.192 | Adres serwera, z którym komunikował się ap.exe |
Reguły Yara
rule Windows_Hacktool_ap_exe {
meta:
description = "ap.exe - hacktool"
author = "@srozb"
creation_date = "2023-01-13"
last_modified = "2023-01-20"
revision = "4"
os = "windows"
hash = "17a28a5ec98f65f1607f4d0fb572146b72e0f49470a4500d7c9bfe009bea1ebd"
strings:
$ipw1 = "IPWorks Zip Self Extractor - www.nsoftware.com" fullword ascii
$ipw2 = "IPWorks HTTP Component - www.nsoftware.com" fullword ascii
$ipw3 = "/n software inc. - www.nsoftware.com" fullword wide
$x1 = "/f /im advanced_port_scanner.exe" fullword wide
$x2 = "5TLoginCredentialService.GetLoginCredentials[2]$ActRec0" fullword ascii
$x3 = "5TLoginCredentialService.GetLoginCredentials[2]$ActRec" fullword ascii
$x4 = "5TLoginCredentialService.GetLoginCredentials[2]$0$Intf" fullword ascii
$x5 = "'TLoginCredentialService.TLoginFuncProxyPvE" fullword ascii
$s1 = "taskhostex.exe" fullword ascii
$s2 = "Taskmgr.exe - System Error" fullword ascii
$s3 = "powershell -ExecutionPolicy Bypass -File \"" fullword wide
$s4 = "Character :" fullword ascii
$s5 = "Kill OSK" fullword ascii
$s6 = "Ab1q2w3e!" fullword ascii
$s7 = "Mimi Dump" fullword ascii
$s8 = "Download :" fullword ascii
$s9 = "Character :" fullword ascii
$s10 = "Kill All (Default)" fullword ascii
condition:
uint16(0) == 0x5a4d and filesize < 32000KB and
1 of ($x*) and 2 of ($ipw*) and 6 of ($s*)
}
rule Windows_Hacktool_installer_exe_GUI {
meta:
description = "installer.exe - hacktool/persistence GUI"
author = "@srozb"
creation_date = "2023-01-13"
last_modified = "2023-01-20"
revision = "4"
os = "windows"
hash = "86070a98e77b5209370b71dce0160f05a3b18ab106fc9073529869053bfe41f1"
strings:
$ipw1 = "IPWorks Zip Self Extractor - www.nsoftware.com" fullword ascii
$ipw2 = "IPWorks HTTP Component - www.nsoftware.com" fullword ascii
$ipw3 = "/n software inc. - www.nsoftware.com" fullword wide
$x1 = "ELoginCredentialError" fullword ascii
$x2 = "TLoginCredentialService.TLoginFunc" fullword ascii
$x3 = "TLoginCredentialService.TLoginEvent" fullword ascii
$x4 = "TLoginCredentialService.TLoginCredentialEvent" fullword ascii
$s1 = "txtfortiip" fullword ascii
$s2 = "Forti IP :" fullword ascii
$s3 = "Status :" fullword ascii
$s4 = "NOT CHECKED" fullword ascii
$s5 = "Connectivity" fullword ascii
condition:
uint16(0) == 0x5a4d and filesize < 32000KB and
1 of ($x*) and 2 of ($ipw*) and 4 of ($s*)
}
rule Windows_Hacktool_installer_exe {
meta:
description = "installer.exe - hacktool/persistence no GUI"
author = "@srozb"
creation_date = "2023-01-13"
last_modified = "2023-01-20"
revision = "4"
os = "windows"
hash = "fb1a6ccea5888ad4acd8465efe8555bce2883c24a3b92bab189f079b82a9df3a"
strings:
$ipw1 = "IPWorks Zip Self Extractor - www.nsoftware.com" fullword ascii
$ipw2 = "IPWorks HTTP Component - www.nsoftware.com" fullword ascii
$ipw3 = "/n software inc. - www.nsoftware.com" fullword wide
$s1 = "\\MicrosoftSMM\\" fullword wide
$s2 = "svcss.exe" fullword wide
$s3 = "/install" fullword wide
$s4 = "installed succesfully" fullword wide
$s5 = "error raised, with message :" fullword wide
$s6 = "log.txt" fullword wide
$s7 = "UpdateStorServ" fullword wide
condition:
uint16(0) == 0x5a4d and filesize < 32000KB and
1 of ($ipw*) and 4 of ($s*)
}
rule Windows_Malware_svcss_exe {
meta:
description = "svcss.exe/storagesvc.exe - backdoor"
author = "@srozb"
creation_date = "2023-01-13"
last_modified = "2023-01-20"
revision = "4"
os = "windows"
hash = "f70127d70aa766e8e44646ba0ceec59327860dc55c421ecc09030f3f65e779d2"
strings:
$ipw1 = "IPWorks Zip Self Extractor - www.nsoftware.com" fullword ascii
$ipw2 = "IPWorks HTTP Component - www.nsoftware.com" fullword ascii
$ipw3 = "/n software inc. - www.nsoftware.com" fullword wide
$x1 = "ELoginCredentialError" fullword ascii
$x2 = "TLoginCredentialService.TLoginFunc" fullword ascii
$x3 = "TLoginCredentialService.TLoginEvent" fullword ascii
$x4 = "TLoginCredentialService.TLoginCredentialEvent" fullword ascii
$x5 = "lpServiceName" fullword ascii
$s1 = "Server storage monitoring service" fullword ascii
$s2 = "/startedbyscm:" fullword wide
$s3 = "Service execution failed : \"%s\"" fullword wide
$s4 = "Service continuing failed : \"%s\"" fullword wide
condition:
uint16(0) == 0x5a4d and filesize < 32000KB and
1 of ($x*) and 2 of ($ipw*) and 2 of ($s*)
}
Komentarze
Ekstra artykuł, wincyj takich technicznych poprosimy ! :)
„logi nie sięgały tak daleko”
CZEMU???
Passy dla VPN zostały zarąbane zewnętrznemu konsultantowi zapewnie.
Rentencja logów nie pozwalała mejbi?
A to wstrętne turki.
Tytuł trochę przesadzony bo dobry EDR spokojnie by sobie poradził. Sam brak detekcji sygnaturowej nie dyskwalifikuje gdyż próba wykorzystania funkcjonalności tego oprogramowania od razu powinna podnieść alert, gdyż programy typu EDR działają na zasadzie „thresholdu” – dopóki customowe, nieznane oprogramowanie nie znacznie robić podejrzanych czynności dopóty EDR będzie się mu wyłącznie przyglądać.
Pewnie to zależy od konfiguracji. Mogę sobie wyobrazić, że coś było wyłączone lub źle skonfigurowane, bo „za często były fałszywe alarmy”.
Po co bylo tworzone konto lokalnego admina ? Skoro potem bylo napisane ze pliki byly przechowywane w folderze moja nuzyka jednego z adminow ?
No i vpn bez 2fa ? :-(
Końcowy użytkownik ledwo ogarnia wpisanie hasła do VPN, 2fa to w większości fikcja.
Bardzo fajna analiza! Chętnie bym jeszcze takich poczytał.
Ciekawe, że soft był pisany w Delphi. Nie sądziłem, że to jeszcze popularny język. A może właśnie z powodu niepopularności ktoś go użył?
Mój ulubiony notatnik (EditPadPro) został napisany w Delphi. Więc nie zgodzę się z tym, że jest to martwy język
Włamanie do VPNa?
Włamali się do Wireguarda, IPSeca czy OpenVPNa?
Ciekawe, jak się włamywaczom udało wygenerować poprawne klucze uwierzytelniające do VPNa…
Pozdro
Fyi, z tureckim może być celowa zmyłka. Odstępy między słowem a dwukropkiem/kropką to cecha charakterystyczna dla ludzi posługujących się chińskim. Oni po prostu tego nie widzą.
„Jedna z próbek pozostała niewykryta przez żaden program antywirusowy.” – raczej powinno być:
Jedna z próbek pozostała niewykryta przez wszystkie programy antywirusowe.