
Привет! Не так давно отгремела НТО по информационной безопасности для школьников. Для опытных участников CTF она не вызовет трудностей, однако для начинающих таски выдались более чем содержательные – поэтому хотелось бы ими поделиться, разобрать некоторые, а также по ходу дела порассуждать на тему формата. Если интересно – добро пожаловать под кат!
Что такое НТО, и с чем ее едят?
Если очень кратко: национальная технологическая олимпиада, проходящая для школьников с 8 по 11 класс и имеющая огромное множество профилей. Но мы же здесь собрались, чтобы послушать про инфобез, верно?
Проходила она в этом году на базе МИФИ в Москве. Занимает порядка недели, преимущественно в конце марта. Имеет скромный III уровень в рейтинге РСОШ, однако привлекает участников она не поэтому – НТО олимпиада в первую очередь исследовательская, с интересными и нестандартными заданиями для пытливых умов школьников со всей России. Но и плюшками участников не обделили: начиная от мерча, заканчивая БВИ в МИФИ и подпиской Яндекс.Плюса для призеров и победителей.
Финал разделен на два основных этапа: предметные туры по математике и информатике, на которых мы останавливаться не будем, и инженерный тур, проходящий в 3 дня. Инженерный тур, в свою очередь, подразделяется еще на три части, связанные общей легендой – классический jeopardy (или task-based) CTF, расследование киберинцидента (форензика), а также закрытие уязвимостей. Доступ к этапам открывается поочередно.
Суммарно на решение инженерного тура участникам выделяется порядка 18 часов.
В этой статье я хотел бы разобрать две машины из части, посвященной форензике – необычной и содержательной.
Легенда
Старшеклассник Валера, учащийся в школе кибербезопасности (однако особым умом, видимо, не отличавшийся), находит файлик с уникальным лаунчером Майнкрафта “без смс и регистрации”, и, как всякий порядочный школьник, запускает его сначала на своем, а потом и на отцовском компьютере – а он не запускается, да и все тут… Неудивительно, что ребятенок скачал какую-то малварь. А тут еще и папа – сисадмин компании, которая питает энергией весь город. Упс, неловко вышло… Так что по ходу олимпиады нам придется всю эту кашу, заваренную Валерой, разгребать.
Машина №1
Начинаем мы с образа (забрать его можно, кстати, тут) и пачки вопросов, на которые нам придется давать развернутые ответы и бегать к жюри защищаться.
Как злоумышленник попал на машину?
Как повысил свои права?
Как злоумышленник узнал пароль от passwords.kdbx?
Куда logkeys пишет логи?
Пароль от чего лежит в passwords.kdbx?
Разведка
Но, прежде чем начинать отвечать на вопросы, нужно заполучить доступ от какого-нибудь юзера. Из подходящих кандидатов напрашиваются root (как предел мечтаний) и встречающий нас на главном экране Sergey, неприветливо защищенный паролем. Благо у нас есть физический доступ к машине и мы можем воспользоваться старым как мир, но все таким же действенным способом – отредактировать параметры GRUB.
Запускаем машину, несколько раз прожимаем Escape, затем E… и, вуаля, у нас есть окошко редактора:

Теперь заменяем строчку ro quiet splash $vt_handoff
, отвественную за некоторые параметры запуска Linux’a, на rw $vt_handoff init=/bin/bash
, что позволит нам запуститься в оболочке /bin/bash, с root-правами и правом на запись в систему.

Ctrl+X… Boot. Теперь при помощи обыкновенного passwd
получим доступ к обоим желанным юзерам:

Заходим от имени Сергея, уже с графическим интерфейсом. Давайте осмотримся на предмет наличия интересных файлов в директории юзера.
Как выясняется, интерес представляют лишь корень и папка Downloads:

minecraft.jar
, вероятно, и есть тот самый лаунчер Майнкрафта с вредоносом – позднее отправим его на декомпиляцию, благо она не составляет труда.
password.kdbx
упоминался в вопросе – вероятно, нам нужно будет раздобыть от него пароль.
Видим linpeas
– понимаем, что дело пахнет повышением привилегий. Это, кстати, тоже отдельный вопрос.
И, наконец, VTropia.exe
– странный экзешник не от мира сего (на Ubuntu он явно не запускался). Отложим его до лучшим времен.
Самое время приступить к вопросам отчета форензика!
Как злоумышленник попал на машину?
Устанавливаем любой декомпилятор для .jar файлов – я воспользуюсь QuiltFlower.
Наблюдаем потенциально интересную папку Malware, в которой находится файл ReverseShell.java
…


…который в действительности является реверс-шеллом. Отлично, мы знаем, как хакер проник на машину!
Здесь важно сделать оговорку: в силу того, что защита этого тура очная, вас будут пытаться завалить выяснить все подробности – объяснение в духе “через зараженный лаунчер Майнкрафта” без пояснений не прокатит.
Как повысил свои права?
Самое время для утилиты linpeas
, специально предназначенной для поиска способов эксалации привилегий, и любезно оставленной нам злоумышленником (злоумышленник вообще достаточно беспечен – возможно, авторам следовало получше спрятать файлы, использованные “хакером”).
В выводе утилиты можно потеряться, но нас интересует яркая подсветка, которую можно найти в разделе “Interesting Files: SUID/SGID”.

В выводе также представлена ссылка на ресурс hacktricks с подробным описанием уязвимости, которую я, пожалуй, продублирую здесь для интересующихся.
И поэтому я позволю себе не останавливаться на ней подробно, а лишь покажу пример эксплуатации:

Как злоумышленник узнал пароль от passwords.kdbx?
Самое время выяснить, что за зверь такой logkeys
. Находим репозиторий на GitHub’e… узнаем, что logkeys – кейлоггер для Linux’a. Вектор атаки нарисовывается.
Обнаруживаем, что бинарь лежит в уже знакомой нам папочке Downloads:

А по стандартному пути (/var/log/logkeys.log
) находится файл с логом (здесь, кстати, нам пригодятся полученные ранее root-права):

При помощи реверс-инжиниринга нетрудно убедиться, что этот файл – то, что нам нужно:

Все встало на свои места. Злоумышленник подгрузил кейлоггер и позднее вытащил из него пароль от passwords.kdbx
.
Пароль от чего лежит в passwords.kdbx?
Для ответа нам потребуется лишь аккуратно переписать мастер-пароль из logkeys.log
и воспользоваться графическим интерфейсом пользователя Sergey
.
Мастер-пароль, который разблокирует менеджер паролей: 1_D0N7_N0W_WHY_N07_M4Y83_345Y
.
Видим единственную запись от Windows RDP – вероятно, от рабочего компьютера во внутренней сети отца нашего Валеры:


Это также данные для авторизации на второй машине, на базе Windows. Переходим к ней!
Машина №2
И снова у нас пять вопросов:
Какой пароль от Ransomware?
Какие процессы в системе являются вредоносными?
Как произошла доставка вредоносного ПО?
Какие средства обфускации были использованы?
Как злоумышленник нашел учетные данные от Web-сервиса?
Образ можно скачать тут.
Разведка
Итак, снова начинаем с разведки. Успешно авторизуемся в систему под пользователем Administrator при помощи ранее полученного пароля.
При входе нас встречает сразу пачка уведомлений о критических угрозах от Windows Defender’a. Восстановим все возможное для дальнейшего анализа:

Все они так или иначе упоминают бэкдор Bladabindi. Сохраним список путей к бинарникам (они пригодятся позднее, при ответе на второй вопрос):
C:\Users\Administrator\Desktop\Doom.exe
C:\ProgramData\Windows Explorer.exe
C:\Users\Administrator\AppData\Local\Temp\Runtime Broker.exe
C:\Users\Administrator\Security Health Service.exe
C:\Windows\Antimalware Service Executable.exe
C:\Users\Administrator\AppData\Roaming\Host Process for Windows Tasks.exe
Как мы можем видеть, малварь достаточно наглая и создает целых пять копий себя, маскирующихся под легитимные процессы Windows.
На рабочем столе наблюдаем вредонос Doom.exe
, записку шифровальщика и браузер Chrome, в котором, вероятно, будет интересующая нас информация (так как в одном из вопросов упоминается некий Web-сервис):

Попытаемся разобрать файл Doom.exe
, который определяется ресурсом VirusTotal как дроппер. Отправим его в Detect It Easy, чтобы определить формат вредоноса.

Формат .NET означает, что мы сможем декомпилировать исполняемый файл без особых проблем при помощи, например, dnSpy.
Подтверждаем свою гипотезу о дроппере и количестве вредоносных файлов. Порывшись в DoomResources, убеждаемся, что это те самые файлы, которые мы обнаружили ранее. Однако никакой новой информации декомпилированный Doom нам не дает:

Самое время разреверсить один из образцов вирусов, доставленных дроппером. Повторяем процедуру – Detect It Easy, dnSpy. Приходим к тому же результату, только на этот раз у нас есть проблема…
И тут мы подходим к нашему первому (но не первому по списку) вопросу…
Какие средства обфускации были использованы?

Видим, что код превратился в нечитаемую кашу, а в одной из функции содержится предупреждение об использовании незарегистрированной версии достаточно известного обфускатора Eziriz’s .NET Reactor. Непродолжительный поиск в Интернете подсказывает, что стоит установить скрипт-деобфускатор под названием .NET Reactor Slayer.


Успех! Налицо образец трояна удаленного доступа njRAT. Так же считает и VirusTotal.
Теперь мы стопроцентно уверены в том, как была проведена атака. Осталось разобраться с ее последствиями – большинство файлов на диске зашифрованы в формате .p4blm. На этот раз Гугл нам не помощник – шифровальщик придется искать самостоятельно.
Здесь можно как-то вспомнить про таинственный экзешник VTropia.exe
, лежащий на предыдущей машине, а можно пойти менее эффективным, но дающим более глубокое понимание, путем.
Исследование всех запускавшихся в системе процессов
При каждом запуске приложения в Windows создается так называемый prefetch file, отвечающий за логирование всей важной информации, связанной с исполнением процесса.
В удобном формате просмотреть их можно с помощью утилиты WinPrefetchView. Это крайне полезная утилита в вопросах форензики, особенно связанных с дропперами и атаками, подразумевающими непосредственный запуск вредоносов.
Здесь мы видим описанное ранее действие дроппера Doom.exe
, запуск копий njRAT и их функционирование… а также старого знакомого – VTropia.exe
, после чего лог от 16 марта прекращается.

Для полного понимания атаки также хочется выяснить, как же все-таки дроппер и шифровальщик попали на машину. Исходя из того, что запись в KeePass недвусмысленно намекает на доступ по RDP, мы отправляемся смотреть логи… и ничего. Абсолютная пустота. И так везде – вредоносы просто существуют и просто запускаются. Не стоит забывать про то, что любые логи можно вычистить… Но, учитывая то, сколько оплошностей допустил и следов оставил наш “злоумышленник”, в это предположение слабо верится.
Как выяснилось позднее, авторы действительно решили не заморачиваться – и перенесли файлы простым drag’n’drop’ом на виртуальную машину :D
Какой пароль от Ransomware?
Наконец-то можно приступить к реверс-инжинирингу VTropia.exe
, предположительно ransomware (шифровальщика).
Он, как и все вредоносы в этой атаке, написан при помощи .NET Framework, поэтому в очередной раз проделываем описанную выше процедуру с DIE и dnSpy. Видим, что исходник ничем не обфусцирован – это нам на руку.
Обнаруживаем следующий раздел Config:

Раскодируем все его параметры – например, при помощи ресурса CyberChef, позволяющего удобно проворачивать подобные сложные цепочки преобразований:
Config.Key = 'WhenYoullComeHome'
Config.IP = 'https://pastebin.com/raw/VRjvXMu1' -> 'HelloWin'
Config.User = 'NTI-User'
Config.Message – сообщение, которое мы ранее видели в info.txt на рабочем столе
Так выглядит основная функция шифровальщика – в ней применяется симметричный шифр AES Rijndael:

Кажется, что если мы сможем заполучить значение строки password, то сможем убить сразу двух зайцев: ответить на вопрос и написать декриптор – ведь переменные Key и IV (initialization vector) задаются именно ей. А для этого нужно разобраться с функцией CalculateKey. Заглянем в исходный код:

Нетрудно заметить, что условие catch никогда не выполнится – при конкатенации двух константных строк ошибки не произойдет. А “HelloWin”
и Config.User
– наши старые знакомые из раздела Config.
Вычислим значение переменной result, определяющей password
и в дальнейшем passwordBytes:
result = MD5("HelloWinNTI-User")
result = "084b988baa7c8d98cda90c5fe603c560"
Теперь мы готовы написать свой собственный дешифратор. Удалим все лишнее из кода и запустим функцию дешифрации с предпосчитанными параметрами на единственном входном файле – в подробности реализации вдаваться не буду, лишь размещу итоговый код.
Как злоумышленник нашел учетные данные от Web-сервиса?
Для того, чтобы найти Web-сервис, на который заходил злоумышленник, логично заглянуть в историю браузера. Выбор пал на Google Chrome, и мы не прогадали:

В истории есть запросы с некоторым IP-адресом локальной сети (что соотносится с легендой), ныне недоступным, 15 марта – в дату, в которую происходило вторжение.
Попробуем узнать, не содержатся ли где-то в системе учетные данные от сервиса. Для этого заглянем в папки, где Chrome хранит информацию, которая может быть нам интересна:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\3
В папке “Login Data” с сохраненными паролями находим пустые SQLite базы данных Chrome Login Data и Login Data for Account, а также зашифрованный Login Data.p4blm, любезно “замороженный” нам ранзомварью. Благо для нас расшифровка теперь не составляет никакого труда. Запускаем наш скрипт и открываем полученный файл с расширением .p4blm.p4blm в любом SQLite-редакторе:

Бинго! Мы нашли логин от того самого сайта, который видели ранее – admin. Пароля, правда, нет… Но мы не отчаиваемся и продолжаем поиски дальше. Больше никакой интересной информации папка Default нам не дает…
Зато в личных данных пользователя находим несколько зашифрованных файлов, один из которых – passwords.txt, по которому можно запустить брутфорс к сервису и получить доступ к админке компании, питающей энергией весь город!
Заключение
Пройдя весь этот нелегкий путь, мы с вами восстановили всю историю атаки, выследили злоумышленника, вылечили зараженные компьютеры и написали декриптор для шифровальщика.
Я надеюсь, задачи и этот разбор вам понравились так же, как нам задания на олимпиаде!
В качестве заключения хотелось бы резюмировать все использованные при решении приемы и утилиты форензики:
получение root-шелла с помощью редактирования параметров GRUB при физическом доступе
QuiltFlower – для декомпиляции .jar-файлов
LinPEAS – для повышения привилегий на Linux-системе
HackTricks – подробная информация об эксплуатации уязвимостей всякого рода
VirusTotal – для анализа вредоносной активности приложений
Detect It Easy – для обнаружения формата файла для дальнейшей декомпиляции
dnSpy – для декомпиляции приложений, написанных при помощи .NET Framework
.NET Reactor Slayer – для снятия обфускации, созданной при помощи .NET Reactor
WinPrefetchView – для исследования всех запускавшихся в системе процессов
CyberChef – для криптографических целей
После форензики участников ждал третий этап инженерного тура – закрытие уязвимостей. Если очень кратко: дан абсолютно дырявый сервис с той самой админкой, которую мы нашли ранее, и его исходники – по ходу соревнования нужно находить, эксплуатировать и залатывать обнаруженные уязвимости. Если вам понравился такой формат, в следующей статье я могу разобрать и его. Дайте знать об этом в комментариях!
Также буду рад конструктивной критике и необычным подходам к решению :)
До встречи на просторах Хабра!