Привет! Не так давно отгремела НТО по информационной безопасности для школьников. Для опытных участников 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 – для криптографических целей

После форензики участников ждал третий этап инженерного тура – закрытие уязвимостей. Если очень кратко: дан абсолютно дырявый сервис с той самой админкой, которую мы нашли ранее, и его исходники – по ходу соревнования нужно находить, эксплуатировать и залатывать обнаруженные уязвимости. Если вам понравился такой формат, в следующей статье я могу разобрать и его. Дайте знать об этом в комментариях!
Также буду рад конструктивной критике и необычным подходам к решению :)

До встречи на просторах Хабра!

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


  1. KOCTALEM
    04.04.2023 06:11
    +1

    Отличный конкурс и прекрасный разбор. Продолжайте, пожалуйста!