Автоматический распаковщик и регистратор для файлов, нацеленных на DotNet Framework
Автоматический распаковщик и логгер для файлов, нацеленных на DotNet Framework! Этот инструмент был представлен на Black Hat USA 2022. На Black Hat Asia 2023 были опубликованы DotDumperGUI и DotDumperNative, а также версия 1.1-stable DotDumper. Эти три инструмента предназначены для совместного использования: DotDumper 1.1-stable требует наличия DLL от DotDumperNative, а DotDumperGUI служит графическим интерфейсом для открытия и фильтрации JSON-вывода результатов работы DotDumper.
Автоматическое обнаружение и классификация любого файла надёжным способом часто считается Святым Граалем анализа вредоносного ПО. Трудностей и препятствий на пути к этому немало, поэтому создание такой системы высоко ценится. Когда речь идёт о двоичных файлах, ориентированных на DotNet, наш новый инструмент с открытым исходным кодом DotDumper призван помочь на нескольких ключевых этапах: логирование (в памяти) активности, дамп интересующих сегментов памяти и извлечение характеристик из заданного образца.
Коротко говоря, ручная распаковка — утомительный процесс, требующий от аналитиков непропорционально много времени. Обфусцированные двоичные файлы ещё больше увеличивают время, необходимое аналитику для распаковки конкретного файла. При масштабировании организациям требуется множество аналитиков, ежедневно препарирующих вредоносное ПО, вероятно, в сочетании с масштабируемой песочницей. Потерянное драгоценное время можно было бы использовать для изучения интересных кампаний или образцов с целью выявления новых угроз, а не для разбора массового повседневного вредоносного ПО. В конце концов, аналитики ищут иголки в стоге сена.
Итак, чем же DotDumper отличается? Запуск образца вредоносного ПО на базе DotNet с помощью DotDumper предоставляет файлы журналов ключевых, контекстуализирующих и общих вызовов функций в трёх форматах (читаемый человеком простой текст, JSON и XML), а также копии полезных сегментов памяти. Таким образом, аналитик может быстро просмотреть журнал вызовов функций. Кроме того, сброшенные файлы можно просканировать для их классификации, что даёт дополнительное понимание образца вредоносного ПО и содержащихся в нём данных. Это сокращает время, жизненно важное для процессов триажа и реагирования на инциденты, и высвобождает время аналитиков SOC и исследователей для более сложных задач анализа.
Для логирования и дампа контекстуализирующих вызовов функций и их результатов DotDumper использует смесь рефлексии и управляемых хуков, полностью написанных на чистом C#. Ниже будут выделены и подробно описаны ключевые возможности, в сочетании с выдержками из результатов работы DotDumper над упакованным образцом стилера AgentTesla, хеши которого приведены ниже.
| Тип хеша | Значение хеша |
|---|---|
| SHA-256 | b7512e6b8e9517024afdecc9e97121319e7dad2539eb21a79428257401e5558d |
| SHA-1 | c10e48ee1f802f730f41f3d11ae9d7bcc649080c |
| MD-5 | 23541daadb154f1f59119952e7232d6b |
DotDumper доступен через интерфейс командной строки с различными аргументами. Изображение ниже показывает меню справки. Обратите внимание, что будут обсуждены не все аргументы, а только наиболее часто используемые.

Минимальное требование для запуска образца — указать аргумент «-file» вместе с именем файла или путём к файлу. Если указан полный путь, он используется. Если указано только имя файла, проверяется текущий рабочий каталог, а также папка, в которой находится исполняемый файл DotDumper.
Если имя каталога не указано, имя папки «-log» устанавливается равным имени файла образца без расширения (если таковое имеется). Папка располагается в той же директории, что и DotDumper, и в ней будут сохранены журналы и сброшенные файлы.
В случае библиотеки или альтернативной точки входа в двоичный файл необходимо переопределить точку входа с помощью «-overrideEntry true». Кроме того, необходимо указать полностью квалифицированный класс, включая пространство имён, с помощью «-fqcn My.NameSpace.MyClass». Это сообщает DotDumper, какой класс выбрать, из которого будет извлечено указанное имя функции (с помощью «-functionName MyFunction»).
Если выбранная функция требует аргументов, необходимо указать количество аргументов с помощью «-argc» и количество требуемых аргументов. Типы и значения аргументов должны быть указаны в формате «string|myValue int|9». Обратите внимание, что если в значениях используются пробелы, аргумент в командной строке необходимо заключить в кавычки, чтобы он был передан как один аргумент.
Другие реже используемые опции, такие как «-raceTime» или «-deprecated», безопасны в настройках по умолчанию, но могут потребовать настройки в будущем из-за изменений в DotNet Framework. В настоящее время они доступны в интерфейсе командной строки, чтобы при необходимости можно было легко внести изменения, даже если вы используете старую версию DotDumper.
Логирование и дамп — две основные функции DotDumper. Чтобы минимизировать время анализа, логирование должно предоставлять аналитику контекст. Это достигается за счёт предоставления следующей информации для каждого зарегистрированного вызова функции:
Обратите внимание, что для каждого сброшенного файла имя файла равно его хешу SHA-256.
Чтобы прояснить вышесказанное, ниже приведён фрагмент журнала. В фрагменте показаны детали для упомянутого образца AgentTesla, где он загружает второй этап с помощью функции Assembly.Load из DotNet.
![Журнал для перехваченного вызова функции Assembly.Load(byte[] rawAssembly)](images/assembly_load.png)
Во-первых, указывается местное системное время вместе с типом возврата, именем и аргументами исходной функции. Во-вторых, приводится трассировка стека, показывающая, что главная функция образца ведёт к конструктору, инициализирует компоненты и вызывает две пользовательские функции. Функция Assembly.Load была вызвана из «NavigationLib.TaskEightBestOil.GGGGGGGGGGGGGGGGGGGG(String str)». Это даёт аналитику контекст для поиска кода вокруг этого вызова, если он представляет интерес.