Форензика на НТО по информационной безопасности
Привет! Не так давно отгремела НТО по информационной безопасности для школьников. Для опытных участников 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 — для криптографических целей
После форензики участников ждал третий этап инженерного тура — закрытие уязвимостей. Если очень кратко: дан абсолютно дырявый сервис с той самой админкой, которую мы нашли ранее, и его исходники — по ходу соревнования нужно находить, эксплуатировать и залатывать обнаруженные уязвимости. Если вам понравился такой формат, в следующей статье я могу разобрать и его. Дайте знать об этом в комментариях!
Также буду рад конструктивной критике и необычным подходам к решению :)
До встречи на просторах Хабра!