# YauzaCTF 2021: Important Information Серия заданий на форензику, включающая в себя исследование дампа диска и RAM ## Important Information 1 ![](https://i.imgur.com/j7DaH3i.png) Пробежимся по дампу памяти утилитой `foremost`. Она позволяет извлекать интересные файлы - документы, картинки. Среди них нам надо найти некий "секретный документ". На выходе из документов имеем только PDF-файл. Он поломан, и некоторые просмотрщики вообще не хотят его открывать, уходя в бесконечную загрузку: ![](https://i.imgur.com/snlAUdo.png) Исследуем дамп памяти вручную, возможно, в одном из процессов документ поврежден поменьше. Для этого используем инструмент `volatility3`. Запустим его и посмотрим список процессов: `python3 ~/volatility3/vol.py -f memdump.mem windows.pslist.PsList` Среди них привлекает внимание группа процессов Хрома и Акробата, где могла быть открыта PDF: ![](https://i.imgur.com/Uw3XYcl.png) Сдампим их по одному (не нашел, как в `vol3` дампить по имени): `python3 ~/volatility3/vol.py -f memdump.mem windows.memmap.Memmap --dump --pid <PID> ` А затем пройдемся `foremost` уже по ним. Внутри процесса с PID 3088 нам повезло: ![](https://i.imgur.com/3UTBW3P.png) Здесь есть что-то интересное, но на месте пароля какая-то каша. Заглянем внутрь PDF и попробуем с этой кашей разобраться. При просмотре стримов видим 3 картинки: ![](https://i.imgur.com/SGUdbkj.png) Судя по размерам, нас интересует стрим 37. Пора разобраться, как PDF хранит внутри изображения. Судя по [этому треду на so](https://stackoverflow.com/questions/10024908/how-to-extract-flatedecoded-images-from-pdf-with-pdfsharp), картинка хранится в виде последовательности значений цветов пикселей, пожатых сверху `Deflate`. Размеры нам известны, возьмем хексы стрима и проведем обработку: ```python import zlib from PIL import Image data = bytes.fromhex("789CED5BDB9...00F44E39F5D") decompressor = zlib.decompressobj() data = decompressor.decompress(data) x = 296 y = 35 im = Image.new('RGB', (x,y)) pix = [] for i in range(0, len(data), 3): pix.append(tuple([int(data[i]), int(data[i+1]), int(data[i+2])])) im.putdata(pix) im.show() ``` И получаем флаг: ![](https://i.imgur.com/jJqccex.png) ### Второй вариант решения На самом деле, картинка не открывается из-за того, что данные в стриме повреждены: ![](https://i.imgur.com/IClJ7il.png) Если заменить выделенный участок на `/FlateDecode/`, картинка покажется и в нормальном просмотрщике. ## Important Information 2 ![](https://i.imgur.com/sXXA3tl.png) Во второй части ищем абстрактные "следы активности". Впрочем, долго искать не приходится: в корзине в дампе диска лежит файл со следующим содержимым: `==Qf5JXZ292YlJ3XzQXMsF3c7ZEVDFme1FWW` Похоже на разворот от base64. Раскодируем: ```python >> __import__('base64').b64decode('==Qf5JXZ292YlJ3XzQXMsF3c7ZEVDFme1FWW'[::-1]) b'YauzaCTF{sql1t3_recovery}' ``` ## Important Information 3 ![](https://i.imgur.com/dOP0gY7.png) Настала очередь секретного хранилища. Снова посмотрев выдачу PsList volatility, мы видим процесс KeePass: `4792 2408 KeePass.exe 0xfa8026ead7c0 12 292 1 False 2021-08-24 11:41:54.000000 N/A Disabled` У хранилища ключей KeePass в формате .kdbx есть известные "волшебные байты": `03 D9 A2 9A 67 FB 4B B5` . Поищем по ним в дампе памяти: ![](https://i.imgur.com/XEV3lDO.png) Найдено 5 совпадений. Выберем то, где наибольший объем данных до нульбайтов и сохраним в отдельный файл. Теперь у нас есть ключевая база, но нет пароля от нее. Возможно, в буфере обмена есть ключ. Посмотрим данные: ```bash python ~/volatility/vol.py -f /mnt/c/ctf/yauza21/for3/memdump.mem --profile=Win7SP1x64 clipboard -v Volatility Foundation Volatility Framework 2.6.1 Session WindowStation Format Handle Object Data ---------- ------------- ------------------ ------------------ ------------------ ---- 1 WinSta0 0xc009L 0x9032b 0xfffff900c1ecb390 0xfffff900c1ecb3a4 f2 02 02 00 00 00 00 00 ........ 1 WinSta0 CF_TEXT 0xc0bb ------------------ 1 WinSta0 0x14040dL 0x200000000001 ------------------ 1 WinSta0 0xc0c0L 0x0 ------------------ 1 WinSta0 0x0L 0xc0be ------------------ 1 WinSta0 0x0L 0x200000000000 ------------------ 1 WinSta0 CF_TEXT 0x0 ------------------ 1 WinSta0 0x0L 0x80ffff0000000d ------------------ 1 WinSta0 0xa0439L 0x200000000001 ------------------ 1 ------------- ------------------ 0x1002e9 0xfffff900c1f10d90 0xfffff900c1f10da4 00 00 00 00 68 01 00 00 01 00 00 00 05 00 00 00 ....h........... 0xfffff900c1f10db4 00 00 00 00 01 00 00 00 bb c0 00 00 00 00 00 00 ................ 0xfffff900c1f10dc4 00 00 00 00 00 00 00 00 01 00 00 00 ff ff ff ff ................ 0xfffff900c1f10dd4 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10de4 00 00 00 00 00 00 00 00 c0 c0 00 00 00 00 00 00 ................ 0xfffff900c1f10df4 00 00 00 00 00 00 00 00 01 00 00 00 ff ff ff ff ................ 0xfffff900c1f10e04 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10e14 00 00 00 00 00 00 00 00 be c0 00 00 00 00 00 00 ................ 0xfffff900c1f10e24 00 00 00 00 00 00 00 00 01 00 00 00 ff ff ff ff ................ 0xfffff900c1f10e34 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10e44 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10e54 00 00 00 00 00 00 00 00 01 00 00 00 ff ff ff ff ................ 0xfffff900c1f10e64 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10e74 00 00 00 00 00 00 00 00 0d 00 00 00 00 00 00 00 ................ 0xfffff900c1f10e84 00 00 00 00 00 00 00 00 01 00 00 00 ff ff ff ff ................ 0xfffff900c1f10e94 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 ................ 0xfffff900c1f10ea4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10eb4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10ec4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10ed4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10ee4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10ef4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0xfffff900c1f10f04 00 00 00 00 00 00 00 00 ........ 1 ------------- ------------------ 0xa0439 0xfffff900c06713f0 0xfffff900c0671404 54 00 69 00 6d 00 65 00 5f 00 52 00 69 00 63 00 T.i.m.e._.R.i.c. 0xfffff900c0671414 6b 00 72 00 6f 00 6c 00 6c 00 69 00 6e 00 67 00 k.r.o.l.l.i.n.g. 0xfffff900c0671424 00 00 .. 1 ------------- ------------------ 0x14040d 0xfffff900c1cd5f50 0xfffff900c1cd5f64 7b 5c 72 74 66 31 5c 61 6e 73 69 5c 61 6e 73 69 {\rtf1\ansi\ansi 0xfffff900c1cd5f74 63 70 67 31 32 35 31 5c 64 65 66 66 30 5c 64 65 cpg1251\deff0\de 0xfffff900c1cd5f84 66 6c 61 6e 67 31 30 34 39 7b 5c 66 6f 6e 74 74 flang1049{\fontt 0xfffff900c1cd5f94 62 6c 7b 5c 66 30 5c 66 6e 69 6c 5c 66 63 68 61 bl{\f0\fnil\fcha 0xfffff900c1cd5fa4 72 73 65 74 32 30 34 20 4d 69 63 72 6f 73 6f 66 rset204.Microsof 0xfffff900c1cd5fb4 74 20 53 61 6e 73 20 53 65 72 69 66 3b 7d 7d 0d t.Sans.Serif;}}. 0xfffff900c1cd5fc4 0a 5c 76 69 65 77 6b 69 6e 64 34 5c 75 63 31 5c .\viewkind4\uc1\ 0xfffff900c1cd5fd4 70 61 72 64 5c 66 30 5c 66 73 31 37 20 54 69 6d pard\f0\fs17.Tim 0xfffff900c1cd5fe4 65 5f 52 69 63 6b 72 6f 6c 6c 69 6e 67 5c 70 61 e_Rickrolling\pa 0xfffff900c1cd5ff4 72 0d 0a 7d 0d 0a 00 r..}... 1 ------------- ------------------ 0x10031f 0xfffff900c1ec6390 0xfffff900c1ec63a4 09 04 00 00 .... ``` `Time_Rickrolling` - похоже на пароль. Он подходит, и мы получаем base64: ![](https://i.imgur.com/ONAjH54.png) ```bash >>> __import__('base64').b64decode('WWF1emFDVEZ7azMzcDQ0c3Nzc3N9') b'YauzaCTF{k33p44sssss}' ``` --- yorxx, Team POPUGI