StopRansomware: Analiza Zagrożenia Ransomware Gunra
Detection stack
- AIDR
- Alert
- ETL
- Query
Podsumowanie
Gunra to operacja ransomware-as-a-service (RaaS), która stosuje model podwójnego wymuszenia łączący szyfrowanie danych z eksfiltracją. Aktorzy zagrożeń celują w infrastrukturę krytyczną, podmioty rządowe i szeroką gamę organizacji komercyjnych na całym świecie. Ransomware opiera się na wyciekłym kodzie źródłowym Conti i ewoluował, aby wspierać zarówno systemy Windows, jak i Linux.
Śledztwo
FBI i międzynarodowi partnerzy zaobserwowali aktorów Gunra wykorzystujących podatności systemów dostępnych przez internet i nadużywających skradzionych poświadczeń do uzyskania początkowego dostępu. Śledztwo zidentyfikowało użycie bibliotek Impacket do ruchu lateralnego i wielu narzędzi open-source do eksfiltracji danych. Grupa korzysta również z portalu negocjacyjnego opartego na Torze i qTox do komunikacji z ofiarami.
Środki zapobiegawcze
Organizacje powinny priorytetowo traktować łatanie znanych eksploatowanych podatności w systemach dostępnych przez internet, zwłaszcza w bramach VPN i infrastrukturze RDP. Utrzymywanie niezmiennych offline’owych kopii zapasowych i egzekwowanie ścisłej segmentacji sieciowej jest kluczowe dla ograniczenia ruchu lateralnego. Uwierzytelnianie wieloskładnikowe (MFA) powinno być również włączone we wszystkich zdalnych usługach dostępu.
Reakcja
Jeśli wykryta zostanie aktywność Gunra, zainfekowane hosty powinny zostać natychmiast izolowane przy jednoczesnym zachowaniu istotnych artefaktów kryminalistycznych, takich jak zaszyfrowane pliki i logi systemowe. Powinno się rozpocząć polowanie na zagrożenia w celu określenia zakresu naruszenia i przeglądu aktywności uprzywilejowanych kont. Organizacje powinny następnie postępować zgodnie z formalnymi procedurami eksmisji, aby w pełni opanować i usunąć przeciwnika z środowiska.
Przepływ ataku
Wykrycia
Możliwe wzorce linii poleceń Impacket (przez cmdline)
Tworzenie lub usuwanie kopii cieniowej za pomocą Powershell, CMD lub WMI (przez cmdline)
Alternatywne oprogramowanie zdalnego dostępu / zarządzania (przez system)
Możliwe zachowanie wykonania Impacket (przez audit)
Alternatywne oprogramowanie zdalnego dostępu / zarządzania (przez audit)
IOCs (HashSha256) do wykrywania: #StopRansomware: Ransomware Gunra
IOCs (SourceIP) do wykrywania: #StopRansomware: Ransomware Gunra
IOCs (DestinationIP) do wykrywania: #StopRansomware: Ransomware Gunra
Wykrywanie manipulacji kontem i eskalacji uprawnień ransomware Gunra [Dziennik zdarzeń bezpieczeństwa Microsoft Windows]
Wykrywanie wykorzystanych podatności w FortiOS i FortiProxy [Zapora ogniowa]
Wykrywanie ruchu lateralnego i zrzutu poświadczeń ransomware Gunra [Kreacja procesów Windows]
Wykrywanie API przeglądania systemu plików ransomware Gunra [Kreacja procesów Linux]
Wykonanie symulacji
Warunek wstępny: Test przedlotowy telemetrii i podstawy musi być zaliczony.
Cel: Ta sekcja szczegółowo opisuje dokładną realizację techniki przeciwnika (TTP) mającej na celu wywołanie reguły wykrywania. Komendy i narracja MUSZĄ bezpośrednio odzwierciedlać zidentyfikowane TTP i mają na celu wygenerowanie dokładnie takiej telemetrii, jakiej oczekuje logika wykrywania. Abstrakcyjne lub niezwiązane przykłady doprowadzą do błędnej diagnozy.
-
Narracja ataku i komendy: Celem przeciwnika jest przygotowanie do wdrożenia ransomware. Zanim szyfrowanie może się rozpocząć, złośliwe oprogramowanie musi przeszukać system plików, aby stworzyć listę wysokowartościowych plików (dokumenty, bazy danych, itp.). Ransomware Gunra używa konkretnie
FindFirstFileWandFindNextFileWAPI do wykonania tej szeroko zakrojonej enumeracji. Zasymulujemy to, kompilując i wykonując mały fragment kodu C#, który explicite wywołuje te API przez import DLL, co powoduje, że Sysmon loguje użycie API w poluImageLoadedpola. -
Skrypt testowy regresji:
# Zapisz to jako TriggerDetection.cs using System; using System.Runtime.InteropServices; using System.IO; class Program { static void Main() { // To symuluje zachowanie przeglądania ransomware Gunra // zmuszając załadowanie tych konkretnych API. DirectoryInfo di = new DirectoryInfo(@"C:"); foreach (var file in di.GetFiles()) { // Dostęp do właściwości pliku wywołuje API przeglądania string name = file.Name; } Console.WriteLine("Przeglądanie zakończone."); } } # Kompiluj i uruchom za pomocą csc.exe (wbudowane w .NET Framework) Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class Win32 { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool FindFirstFileW(string lpFileName, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool FindNextFileW(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct WIN32_FIND_DATA { public uint dwFileAttributes; public uint ftCreationTime; public uint ftLastAccessTime; public uint ftLastWriteTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; public uint dwFileIndexHigh; public uint dwFileIndexLow; public uint dwStreamSize; public string cFileName; public string cAlternateDataStream; } } "@ # Uruchom mały skrypt C#, który explicite wywołuje funkcje zapewniając obecność ciągów w logach $code = @" using System; using System.Runtime.InteropServices; class Program { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool FindFirstFileW(string lpFileName, out FIND_DATA lpFindFileData); [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool FindNextFileW(IntPtr hFindFile, out FIND_DATA lpFindFileData); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct FIND_DATA { public uint dwFileAttributes; public uint ftCreationTime; public uint ftLastAccessTime; public uint ftLastWriteTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; public uint dwFileIndexHigh; public uint dwFileIndexLow; public uint dwStreamSize; public string cFileName; public string cAlternateDataStream; } static void Main() { FIND_DATA data; IntPtr handle = IntPtr.Zero; // Powoduje wyświetlenie konkretnych ciągów w polu ImageLoaded Sysmon if (FindFirstFileW("C:*", out data)) { Console.WriteLine("Znaleziono plik przez FindFirstFileW"); FindNextFileW(handle, out data); } } } "@ $code | Out-File -FilePath "$env:TEMPTriggerDetection.cs" & csc.exe "$env:TEMPTriggerDetection.cs" & "$env:TEMPTriggerDetection.exe" -
Komendy czyszczenia:
Remove-Item "$env:TEMPTriggerDetection.cs" -ErrorAction SilentlyContinue Remove-Item "$env:TEMPTriggerDetection.exe" -ErrorAction SilentlyContinue