<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@threathunt_pedia</title><author><name>@threathunt_pedia</name></author><id>https://teletype.in/atom/threathunt_pedia</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/threathunt_pedia?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/threathunt_pedia?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-30T23:01:51.639Z</updated><entry><id>threathunt_pedia:fksdhHu4_Bz</id><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia/fksdhHu4_Bz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><title>Структура файла мини-дампа Windows</title><published>2026-01-16T12:53:47.295Z</published><updated>2026-01-16T13:37:47.508Z</updated><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/41/cf/41cf222d-9bc5-4239-a528-e5a91be8ee86.png&quot;&gt;Минидамп (minidump) — это компактный файл дампа памяти, создаваемый Windows при аварийном завершении работы системы (BSOD) или дампа процесса в момент сбоя приложения. В расследованиях инцидентов мини-дампы служат ценным источником информации: они могут содержать артефакты вредоносной активности, сетевые индикаторы, загруженные модули, открытые хендлы процесса и информацию о процессе. Очень важно понимать структуру файла и уметь извлекать информацию, которая необходима для восстановления событий и получения индикаторов компрометации.</summary><content type="html">
  &lt;p id=&quot;zVid&quot;&gt;Минидамп (minidump) — это компактный файл дампа памяти, создаваемый Windows при аварийном завершении работы системы (BSOD) или дампа процесса в момент сбоя приложения. В расследованиях инцидентов мини-дампы служат ценным источником информации: они могут содержать артефакты вредоносной активности, сетевые индикаторы, загруженные модули, открытые хендлы процесса и информацию о процессе. Очень важно понимать структуру файла и уметь извлекать информацию, которая необходима для восстановления событий и получения индикаторов компрометации.&lt;/p&gt;
  &lt;h2 id=&quot;iE5Y&quot;&gt;Виды мини-дампов&lt;/h2&gt;
  &lt;p id=&quot;PpKE&quot;&gt;1. Системные мини-дампы (Kernel-mode) - при BSOD:&lt;br /&gt;&lt;code&gt;C:\Windows\Minidump\*.dmp  малые минидампы (по умолчанию)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nGoK&quot;&gt;Содержат: stop-код и параметры ошибки, контекст процессора на момент краха, стек вызовов в режиме ядра, список загруженных драйверов, базовую информацию о системе.&lt;/p&gt;
  &lt;p id=&quot;O9N1&quot;&gt;2. Пользовательские мини-дампы (User-mode) - создаются при падении приложений:&lt;/p&gt;
  &lt;p id=&quot;1DAN&quot;&gt;&lt;code&gt;%LOCALAPPDATA%\CrashDumps\  для текущего пользователя&lt;br /&gt;%SystemRoot%\System32\config\systemprofile\AppData\Local\CrashDumps\ для системных служб&lt;/code&gt;&lt;br /&gt;Пользовательские мини-дампы могут быть созданы вручную с помощью инструментов ProcDump, TaskManager, ProcessHacker/SystemInformer, либо функция &lt;a href=&quot;https://learn.microsoft.com/ru-ru/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump&quot; target=&quot;_blank&quot;&gt;MiniDumpWriteDump&lt;/a&gt; Windows API.&lt;/p&gt;
  &lt;p id=&quot;zFXM&quot;&gt;3. Полные дампы памяти:&lt;br /&gt;Содержат всю физическую память системы, располагаются в &lt;code&gt;C:\Windows\MEMORY.DMP&lt;/code&gt;.  Технически это не мини-дампы, но про них важно упомянуть. Они содержат физическую память системы, из которой можно получать список процессов, сетевые соединения и т.д. &lt;/p&gt;
  &lt;h1 id=&quot;Rqjr&quot;&gt;Структура файла&lt;/h1&gt;
  &lt;p id=&quot;EAhG&quot;&gt;Рассмотрим структуру файла пользовательского файла мини-дамп (User-mode). Данные файлы встречаются на системах очень часто и многие собирают их с помощью своих Triage утилит.&lt;/p&gt;
  &lt;p id=&quot;EsdW&quot;&gt;Минидамп — это структурированный бинарный файл, состоящий из:&lt;/p&gt;
  &lt;ol id=&quot;H1UB&quot;&gt;
    &lt;li id=&quot;pDeR&quot;&gt;&lt;strong&gt;Заголовка (Header)&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;WEO8&quot;&gt;&lt;strong&gt;Директории потоков (Stream Directory)&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;Wbld&quot;&gt;&lt;strong&gt;Самих потоков данных (Streams)&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;YA45&quot;&gt;Все данные хранятся в &lt;strong&gt;little-endian&lt;/strong&gt; порядке.&lt;/p&gt;
  &lt;h2 id=&quot;Xic5&quot;&gt;Заголовок мини-дамп&lt;/h2&gt;
  &lt;p id=&quot;uBvB&quot;&gt;Каждый файл мини-дампа начинается с заголовка фиксированного размера 32 байта, который служит отправной точкой для парсинга файла.&lt;/p&gt;
  &lt;figure id=&quot;CvgK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/41/cf/41cf222d-9bc5-4239-a528-e5a91be8ee86.png&quot; width=&quot;833&quot; /&gt;
    &lt;figcaption&gt;Заголовок мини-дампа&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ouYX&quot;&gt;Структура заголовка определена в официальной документации Microsoft (&lt;a href=&quot;https://learn.microsoft.com/ru-ru/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_header&quot; target=&quot;_blank&quot;&gt;minidumpapiset.h&lt;/a&gt;):&lt;/p&gt;
  &lt;pre id=&quot;ELWQ&quot;&gt;typedef struct _MINIDUMP_HEADER {
  ULONG32 Signature;             // 4 байта
  ULONG32 Version;               // 4 байта
  ULONG32 NumberOfStreams;       // 4 байта
  RVA     StreamDirectoryRva;    // 4 байта
  ULONG32 CheckSum;              // 4 байта
  union {                        // 4 байта
    ULONG32 Reserved;
    ULONG32 TimeDateStamp;
  };
  ULONG64 Flags;                 // 8 байт
} MINIDUMP_HEADER, *PMINIDUMP_HEADER;
&lt;/pre&gt;
  &lt;p id=&quot;A06D&quot;&gt;Ключевые поля заголовка:&lt;/p&gt;
  &lt;ul id=&quot;8r9X&quot;&gt;
    &lt;li id=&quot;Zfpl&quot;&gt;&lt;code&gt;Signature &lt;/code&gt;-4 байта, всегда 0x504D444D (MDMP)&lt;/li&gt;
    &lt;li id=&quot;FybH&quot;&gt;&lt;strong&gt;&lt;code&gt;Version - &lt;/code&gt;&lt;/strong&gt;4 байта, версия формата. Обычно &lt;code&gt;0x000A0007&lt;/code&gt; или &lt;code&gt;0x000093A7&lt;/code&gt; (в little-endian: &lt;code&gt;A7 93 00 00&lt;/code&gt;). Старшие 16 бит — версия, младшие — реализация.&lt;/li&gt;
    &lt;li id=&quot;zjbP&quot;&gt;&lt;strong&gt;&lt;code&gt;NumberOfStreams -&lt;/code&gt;&lt;/strong&gt;4 байта, количество записей в директории потоков&lt;/li&gt;
    &lt;li id=&quot;ZfJb&quot;&gt;&lt;strong&gt;&lt;code&gt;StreamDirectoryRVA -&lt;/code&gt;&lt;/strong&gt;4 байта, смещение (в байтах от начала файла), где начинается директория потоков&lt;/li&gt;
    &lt;li id=&quot;oBBh&quot;&gt;&lt;strong&gt;&lt;code&gt;CheckSum -&lt;/code&gt;&lt;/strong&gt;4 байта, редко используется, почти всегда &lt;strong&gt;0&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;cQck&quot;&gt;&lt;strong&gt;&lt;code&gt;TimeDateStamp -&lt;/code&gt;&lt;/strong&gt;4 байта, время создания дампа в формате Unix timestamp (секунды с 1970-01-01 UTC)&lt;/li&gt;
    &lt;li id=&quot;yAIJ&quot;&gt;&lt;strong&gt;&lt;code&gt;Flags -&lt;/code&gt;&lt;/strong&gt;8 байт, битовая маска, указывающая, какие данные включены (например, память, хендлы, потоки и т.д.)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OYAk&quot;&gt;Содержимое дампа напрямую зависит от установленных флагов (Flags):&lt;/p&gt;
  &lt;ul id=&quot;u3uM&quot;&gt;
    &lt;li id=&quot;IOor&quot;&gt;&lt;strong&gt;MiniDumpNormal&lt;/strong&gt; (~64КБ–2 МБ) — базовый дамп с минимальной информацией о сбое.&lt;/li&gt;
    &lt;li id=&quot;HzCh&quot;&gt;&lt;strong&gt;MiniDumpWithDataSegs&lt;/strong&gt; (10–100 МБ) — добавляет сегменты данных.&lt;/li&gt;
    &lt;li id=&quot;sGHb&quot;&gt;&lt;strong&gt;MiniDumpWithHandleData&lt;/strong&gt; (1–10 МБ) — включает информацию о дескрипторах.&lt;/li&gt;
    &lt;li id=&quot;Mju9&quot;&gt;&lt;strong&gt;MiniDumpWithFullMemory&lt;/strong&gt; (сотни МБ–ГБ) — полный дамп со всей виртуальной памятью процесса.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;qftX&quot;&gt;Подробный список флагов доступен в &lt;a href=&quot;https://learn.microsoft.com/ru-ru/windows/win32/api/minidumpapiset/ne-minidumpapiset-minidump_type&quot; target=&quot;_blank&quot;&gt;документации Microsoft&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;hDiV&quot;&gt;Директория потоков&lt;/h2&gt;
  &lt;p id=&quot;b3M4&quot;&gt;Сразу после заголовка следует директория потоков — массив структур &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_directory&quot; target=&quot;_blank&quot;&gt;MINIDUMP_DIRECTORY&lt;/a&gt;, описывающих расположение и тип каждого блока данных. Директория начинается по смещению, указанному в &lt;code&gt;StreamDirectoryRVA &lt;/code&gt;(заголовка мини-дампа). Количество таких записей задается в &lt;code&gt;NumberOfStreams&lt;/code&gt; (заголовка мини-дамп).&lt;/p&gt;
  &lt;pre id=&quot;bRVu&quot;&gt;typedef struct _MINIDUMP_DIRECTORY {
    ULONG32 StreamType;   // Тип потока
    MINIDUMP_LOCATION_DESCRIPTOR Location; // Где лежат данные
} MINIDUMP_DIRECTORY;

typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
    ULONG32 DataSize;     // Размер данных в байтах
    RVA     Rva;          // Смещение от начала файла, где начинаются данные
} MINIDUMP_LOCATION_DESCRIPTOR;
&lt;/pre&gt;
  &lt;p id=&quot;cfuT&quot;&gt;Пример записи в директории:&lt;/p&gt;
  &lt;pre id=&quot;vJpB&quot;&gt;04 00 00 00   48 00 00 00   30 01 00 00
│             │             └── RVA = 0x00000130
│             └── DataSize = 0x48 (72 байта)
└── StreamType = 4 → ModuleListStream
&lt;/pre&gt;
  &lt;h2 id=&quot;CWKR&quot;&gt;Потоки данных (Streams)&lt;/h2&gt;
  &lt;p id=&quot;rncu&quot;&gt;Мини-дамп состоит из модульных блоков — &lt;strong&gt;потоков&lt;/strong&gt;, каждый из которых содержит определенный тип информации. Расположение потока в файле мини-дамп указывается в поле RVA директории потоков.&lt;/p&gt;
  &lt;p id=&quot;JIQR&quot;&gt;Рассмотрим наиболее значимые для анализа потоки:&lt;/p&gt;
  &lt;ul id=&quot;lqZM&quot;&gt;
    &lt;li id=&quot;nSIX&quot;&gt;&lt;strong&gt;SystemInfoStream&lt;/strong&gt; (Тип 7) - описывает информацию о системе, в которую входит версия ОС, архитектура процессора, количество ядер.&lt;/li&gt;
    &lt;li id=&quot;dTtq&quot;&gt;&lt;strong&gt;ModuleListStream&lt;/strong&gt; (Тип 4) - важный поток, который содержит полный список загруженных модулей: адреса загрузки, размеры, имена DLL/EXE, временные метки, версия исполняемого файла.&lt;br /&gt;Структура потока: первые 4 байта — количество модулей, далее массив структур  &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_module&quot; target=&quot;_blank&quot;&gt;MINIDUMP_MODULE&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;aZFc&quot;&gt;Каждый &lt;code&gt;MINIDUMP_MODULE&lt;/code&gt; содержит:&lt;/p&gt;
  &lt;ul id=&quot;UCHG&quot;&gt;
    &lt;li id=&quot;1jIk&quot;&gt;&lt;code&gt;BaseOfImage&lt;/code&gt; — базовый адрес загрузки в память (VA)&lt;/li&gt;
    &lt;li id=&quot;fJRx&quot;&gt;&lt;code&gt;SizeOfImage&lt;/code&gt; — размер образа&lt;/li&gt;
    &lt;li id=&quot;fwrr&quot;&gt;&lt;code&gt;TimeDateStamp&lt;/code&gt; — метка времени компиляции PE-файла (в секундах с 1970)&lt;/li&gt;
    &lt;li id=&quot;NHBY&quot;&gt;&lt;code&gt;ModuleNameRva&lt;/code&gt; — RVA строки с путём к модулю (Unicode строка)&lt;/li&gt;
    &lt;li id=&quot;EzNd&quot;&gt;&lt;code&gt;VersionInfo&lt;/code&gt; — версия файла (если есть)&lt;/li&gt;
    &lt;li id=&quot;ivbO&quot;&gt;&lt;code&gt;CheckSum&lt;/code&gt; — контрольная сумма&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;sZzN&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt; из мини-дампа с полной памятью (MiniDumpWithFullMemory) можно восстановить оригинальные исполняемые файлы, зная их базовые адреса и размеры.&lt;/p&gt;
  &lt;p id=&quot;N8Le&quot;&gt;Пример обнаружения вредоносного модуля:&lt;/p&gt;
  &lt;pre id=&quot;MiIi&quot;&gt;{
	&amp;quot;name&amp;quot;: &amp;quot;malware.dll&amp;quot;,
	&amp;quot;full_path&amp;quot;: &amp;quot;c:\\Windows\\System32\\malware.dll&amp;quot;,
	&amp;quot;base_address&amp;quot;: &amp;quot;0x00007FFC9A870000&amp;quot;,
	&amp;quot;size&amp;quot;: 286720,
	&amp;quot;size_hex&amp;quot;: &amp;quot;0x46000&amp;quot;,
	&amp;quot;checksum&amp;quot;: &amp;quot;0x00000000&amp;quot;,
	&amp;quot;timestamp&amp;quot;: 1276629802,
	&amp;quot;time_string&amp;quot;: &amp;quot;2010-06-15 22:23:22&amp;quot;,
	&amp;quot;type&amp;quot;: &amp;quot;DLL&amp;quot;,
	&amp;quot;is_dll&amp;quot;: true,
	&amp;quot;is_exe&amp;quot;: false,
	&amp;quot;version_info&amp;quot;: {
		&amp;quot;file_version&amp;quot;: &amp;quot;&amp;quot;,
		&amp;quot;product_version&amp;quot;: &amp;quot;&amp;quot;,
		&amp;quot;file_type&amp;quot;: &amp;quot;Unknown&amp;quot;,
		&amp;quot;signature&amp;quot;: 0,
		&amp;quot;is_valid&amp;quot;: false
	}
	
}
&lt;/pre&gt;
  &lt;p id=&quot;XlQC&quot;&gt;При анализе данного потока обращаем внимание на необычные пути размещения модулей, модули без подписи, несоответствие времени компиляции и версий, - модули с подозрительными именами.&lt;/p&gt;
  &lt;ul id=&quot;vZDu&quot;&gt;
    &lt;li id=&quot;oRLU&quot;&gt;&lt;strong&gt;ThreadListStream&lt;/strong&gt; (Тип 3) - содержит информацию о потоках процесса: ID потоков, контекст процессора, стеки вызовов.&lt;/li&gt;
    &lt;li id=&quot;rBAX&quot;&gt;&lt;strong&gt;ExceptionStream&lt;/strong&gt; (Тип 6) - содержит данные об исключении: код исключения, адрес сбоя, параметры исключения.&lt;/li&gt;
    &lt;li id=&quot;ZH69&quot;&gt;&lt;strong&gt;MemoryListStream&lt;/strong&gt; (Тип 5) и &lt;strong&gt;Memory64ListStream&lt;/strong&gt; (Тип 9) - эти потоки содержат фрагменты виртуальной памяти процесса. Структура потока MemoryListStream:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;s5SF&quot;&gt;ULONG32 NumberOfMemoryRanges;
MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges[...];
&lt;/pre&gt;
  &lt;p id=&quot;obaB&quot;&gt;Где каждый дескриптор:&lt;/p&gt;
  &lt;pre id=&quot;MSbQ&quot;&gt;ULONG64 StartOfMemoryRange; // виртуальный адрес
MINIDUMP_LOCATION_DESCRIPTOR Memory; // { DataSize, RVA }
&lt;/pre&gt;
  &lt;p id=&quot;Sht3&quot;&gt;Структура потока Memory64ListStream немного изменена и является более эффективной для большинства дампов. Вместо повторения RVA для каждого региона присутствует единый базовый RVA.&lt;/p&gt;
  &lt;pre id=&quot;gIEV&quot;&gt;ULONG64 NumberOfMemoryRanges;
ULONG64 BaseRva; // смещение от начала файла, где начинаются все данные памяти подряд
&lt;/pre&gt;
  &lt;p id=&quot;NynP&quot;&gt;Затем идёт массив, содержащий:&lt;/p&gt;
  &lt;pre id=&quot;Tz7v&quot;&gt;struct {
    ULONG64 StartOfMemoryRange; // виртуальный адрес
    ULONG64 DataSize;
} [NumberOfMemoryRanges]
&lt;/pre&gt;
  &lt;p id=&quot;1rfk&quot;&gt;Все регионы памяти хранятся последовательно, начиная с &lt;code&gt;BaseRva&lt;/code&gt;. В этих потоках можно искать URL-адреса, домены, IP-адреса, конфигурационные данные, текстовые строки, указывающие на активность.&lt;/p&gt;
  &lt;ul id=&quot;JvrK&quot;&gt;
    &lt;li id=&quot;JT3M&quot;&gt;&lt;strong&gt;MiscInfoStream&lt;/strong&gt; (Тип 15) - данный поток содержит информацию о процессе: время создания процесса, ID процесса.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;gU9L&quot;&gt;typedef struct _MINIDUMP_MISC_INFO {
    ULONG32 SizeOfInfo;        // Размер структуры в байтах
    ULONG32 Flags1;            // Битовая маска: какие поля заполнены
    ULONG32 ProcessId;         // PID процесса
    ULONG32 ProcessCreateTime; // Время создания процесса (Unix timestamp)
    ULONG32 ProcessUserTime;   // Время в пользовательском режиме (в 100-нс интервалах)
    ULONG32 ProcessKernelTime; // Время в режиме ядра (в 100-нс интервалах)
} MINIDUMP_MISC_INFO;
&lt;/pre&gt;
  &lt;p id=&quot;N8pS&quot;&gt;Здесь можно вычислить время работы процесса &lt;code&gt;uptime=ProceeCreateTime - DumpTime&lt;/code&gt;, где DumpTime берется из заголовка дампа.&lt;/p&gt;
  &lt;ul id=&quot;3Srr&quot;&gt;
    &lt;li id=&quot;Samo&quot;&gt;&lt;strong&gt;HandleDataStream&lt;/strong&gt; (Тип 12) - этот поток содержит информацию о &lt;strong&gt;дескрипторах (handles)&lt;/strong&gt;, открытых процессом на момент создания дампа. Этот поток крайне полезен в цифровой криминалистике и анализе вредоносного ПО, так как позволяет увидеть, &lt;strong&gt;с какими объектами ядра взаимодействовал процесс&lt;/strong&gt;: файлы, сетевые соединения, мьютексы, процессы, ключи реестра и многое другое.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;T5eR&quot;&gt;Информация о хендле может быть представлена в двух форматах — в зависимости от версии операционной системы и флагов создания дампа.&lt;/p&gt;
  &lt;pre id=&quot;13zN&quot;&gt;typedef struct _MINIDUMP_HANDLE_DATA_STREAM {
    ULONG32 SizeOfHeader;        // Размер заголовка (обычно 16)
    ULONG32 Reserved;            // Зарезервировано (обычно 0)
    ULONG32 NumberOfHandles;     // Количество дескрипторов
    ULONG32 Reserved2;           // Зарезервировано
} MINIDUMP_HANDLE_DATA_STREAM;
&lt;/pre&gt;
  &lt;pre id=&quot;GDbb&quot;&gt;typedef struct _MINIDUMP_HANDLE_DESCRIPTOR {
    ULONG64 Handle;              // Значение дескриптора (например, 0x5c)
    RVA     TypeNameRva;         // RVA строки с типом объекта (&amp;quot;File&amp;quot;, &amp;quot;Event&amp;quot; и т.д.)
    RVA     ObjectNameRva;       // RVA имени объекта (например, путь к файлу)
    ULONG32 Attributes;          // Атрибуты (обычно 0)
    ULONG32 GrantedAccess;       // Права доступа (битовая маска)
    ULONG32 HandleCount;         // Сколько раз объект открыт в системе
    ULONG32 PointerCount;        // Сколько указателей на объект
} MINIDUMP_HANDLE_DESCRIPTOR;
&lt;/pre&gt;
  &lt;p id=&quot;neK8&quot;&gt;Базовая структура &lt;strong&gt;&lt;code&gt;MINIDUMP_HANDLE_DESCRIPTOR&lt;/code&gt;&lt;/strong&gt; занимает &lt;strong&gt;32 байта&lt;/strong&gt; и содержит ключевые поля: значение дескриптора, RVA (смещение от начала файла) к строкам с типом объекта (например, &lt;code&gt;File&lt;/code&gt;, &lt;code&gt;Mutant&lt;/code&gt;, &lt;code&gt;Key, Directory&lt;/code&gt;) и его именем, а также информацию о правах доступа, количестве ссылок и атрибутах.&lt;/p&gt;
  &lt;p id=&quot;Hrtf&quot;&gt;Начиная с Windows 8 появилась расширенная версия — &lt;strong&gt;&lt;code&gt;MINIDUMP_HANDLE_DESCRIPTOR_2&lt;/code&gt;&lt;/strong&gt; (40 байт). Она включает все поля предыдущей структуры и добавляет два новых:&lt;/p&gt;
  &lt;ul id=&quot;TkGx&quot;&gt;
    &lt;li id=&quot;JBGq&quot;&gt;&lt;strong&gt;&lt;code&gt;ObjectInfoRva&lt;/code&gt;&lt;/strong&gt; — указатель на дополнительные метаданные об объекте (например, временные метки файла или PID связанного процесса),&lt;/li&gt;
    &lt;li id=&quot;ghF4&quot;&gt;&lt;strong&gt;&lt;code&gt;Reserved0&lt;/code&gt;&lt;/strong&gt; — зарезервированное поле для будущего использования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nvPe&quot;&gt;На практике поле &lt;code&gt;ObjectInfoRva&lt;/code&gt; почти всегда нулевое, так как Windows редко сохраняет расширенные данные в мини-дамп. Поэтому основное различие между версиями сводится к &lt;strong&gt;размеру записи&lt;/strong&gt;: 32 байта для классической структуры и 40 байт для расширенной. При парсинге важно корректно определять размер записи, чтобы избежать смещения при чтении последующих дескрипторов.&lt;/p&gt;
  &lt;p id=&quot;T3fh&quot;&gt;Наиболее интересные значения &lt;code&gt;TypeName&lt;/code&gt;: File - открытый файл, Directory - директория, Mutant - мьютекс, Key - ключ реестра.&lt;/p&gt;
  &lt;p id=&quot;XVI9&quot;&gt;Ограничения:&lt;/p&gt;
  &lt;ul id=&quot;CKPE&quot;&gt;
    &lt;li id=&quot;ufKN&quot;&gt;&lt;strong&gt;Имена объектов могут отсутствовать&lt;/strong&gt; (&lt;code&gt;ObjectNameRva = 0&lt;/code&gt;) — особенно для анонимных объектов.&lt;/li&gt;
    &lt;li id=&quot;H4Yz&quot;&gt;&lt;strong&gt;Нет сетевых сокетов&lt;/strong&gt; — TCP/UDP-соединения &lt;strong&gt;не представлены&lt;/strong&gt; как хендлы в этом формате.&lt;/li&gt;
    &lt;li id=&quot;BLQl&quot;&gt;&lt;strong&gt;Данные статичны&lt;/strong&gt; — вы видите состояние &lt;strong&gt;на момент дампа&lt;/strong&gt;, но не историю.&lt;/li&gt;
    &lt;li id=&quot;z6pI&quot;&gt;&lt;strong&gt;Требуется флаг&lt;/strong&gt; — без &lt;code&gt;MiniDumpWithHandleData&lt;/code&gt; поток отсутствует.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h1 id=&quot;Hy9q&quot;&gt;Инструменты анализа мини-дампов&lt;/h1&gt;
  &lt;p id=&quot;E1Of&quot;&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9pgjgd53tn86?hl=ru-RU&amp;gl=RU&quot; target=&quot;_blank&quot;&gt;WinDbg&lt;/a&gt; - инструмент для анализа дампов от Microsoft, доступен через Microsoft Store. Используется, когда необходим глубокий анализ: восстановление стека вызовов, проверка контекста CPU, работа с символами Microsoft. В использовании данного инструмента есть большое ограничение в виде высокого порога входа, которое требует понимание архитектуры Windows и отладочных команд.&lt;/p&gt;
  &lt;p id=&quot;GF6a&quot;&gt;&lt;strong&gt;Основные команды:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;um9k&quot;&gt;
    &lt;li id=&quot;jZt5&quot;&gt;&lt;code&gt;!analyze -v&lt;/code&gt; — автоматический анализ причины сбоя&lt;/li&gt;
    &lt;li id=&quot;VcHO&quot;&gt;&lt;code&gt;lm&lt;/code&gt; — список всех загруженных модулей с базовыми адресами&lt;/li&gt;
    &lt;li id=&quot;VvKi&quot;&gt;&lt;code&gt;!handle&lt;/code&gt; — просмотр открытых хендлов (требуется флаг &lt;code&gt;MiniDumpWithHandleData&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;r75N&quot;&gt;&lt;code&gt;s -a 0 L?80000000 &amp;quot;http&amp;quot;&lt;/code&gt; — поиск ASCII-строк по всей доступной памяти&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;l7iW&quot;&gt;dumpchk.exe - утилита из Windows SDK, предназначенная для проверки структуры мини-дамп. Данный инструмент покажет тип дампа (user/kernel), наличие потоков, ошибки формата.&lt;/p&gt;
  &lt;p id=&quot;UKE2&quot;&gt;&lt;code&gt;dumpchk crash.dmp&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;EcAF&quot;&gt;&lt;a href=&quot;https://github.com/volatilityfoundation/volatility3&quot; target=&quot;_blank&quot;&gt;Volatility3&lt;/a&gt; - инструмент для анализа дампов памяти. Volatility &lt;strong&gt;работает только с полными kernel-дампами&lt;/strong&gt; (&lt;code&gt;MEMORY.DMP&lt;/code&gt;), но &lt;strong&gt;не поддерживает user-mode minidumps&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;yytk&quot;&gt;Примеры команд:&lt;/p&gt;
  &lt;pre id=&quot;ni4t&quot;&gt;
# Volatility3
vol.py -f MEMORY.DMP windows.pslist

# Volatility2
vol.py -f MEMORY.DMP --profile=Win10x64 pslist
&lt;/pre&gt;
  &lt;p id=&quot;JfBB&quot;&gt;Strings + &lt;a href=&quot;https://github.com/mandiant/stringsifter&quot; target=&quot;_blank&quot;&gt;Stringsifter&lt;/a&gt; - инструменты для анализа строк, основанный на машинном обучении, который автоматически ранжирует строки на основе их релевантности для анализа вредоносного ПО.&lt;/p&gt;
  &lt;pre id=&quot;qKEy&quot;&gt;strings -n 6 -a crash.dmp | rank_strings
&lt;/pre&gt;
  &lt;p id=&quot;g5PT&quot;&gt;&lt;a href=&quot;https://github.com/rayhunt454/minidump-parser&quot; target=&quot;_blank&quot;&gt;MiniDump Parser for Dfir&lt;/a&gt; - инструмент анали мини-дампов процессов для DFIR специалистов. Позволяет анализировать информацию о процессе, извлекать модули из мини-дампа, извлекать открытые хендлы процесса, искать артефакты в памяти процесса.&lt;/p&gt;
  &lt;p id=&quot;FQp7&quot;&gt;Анализ с сохранением отчета:&lt;/p&gt;
  &lt;pre id=&quot;r81y&quot;&gt;python3 main.py -f dumpfile.dmp -o report.json
&lt;/pre&gt;
  &lt;p id=&quot;LuA7&quot;&gt;Полный анализ с извлечением модулей из мини-дампа:&lt;/p&gt;
  &lt;pre id=&quot;k8Wm&quot;&gt;python3 main.py -f dumpfile.dmp -o report.json -dump true -dump-dir ./extracted_modules
&lt;/pre&gt;
  &lt;p id=&quot;vohe&quot;&gt;Если у вас есть необходимость добавить свои собственные регулярные выражения для поиска информации в MemoryListStream, то необходимо перейти файл &lt;code&gt;minidump/artifact.py&lt;/code&gt; и изменить значение &lt;code&gt;self.patterns&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;GW7w&quot;&gt;self.patterns = {
            &amp;#x27;urls&amp;#x27;: re.compile(r&amp;#x27;https?://[a-zA-Z0-9\-\._~:/?#\[\]@!$&amp;amp;\&amp;#x27;()*+,;=%]+&amp;#x27;),
            &amp;#x27;domains&amp;#x27;: re.compile(r&amp;#x27;\b(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+&amp;#x27;r&amp;#x27;[a-zA-Z]{2,}\b&amp;#x27;)
        }
&lt;/pre&gt;
  &lt;h1 id=&quot;KzMW&quot;&gt;Заключение&lt;/h1&gt;
  &lt;p id=&quot;efQQ&quot;&gt;Мини-дамп Windows играет ключевую роль в расследовании инцидентов, предоставляя «моментальный снимок» состояния процесса или системы в критический момент — будь то сбой, зависание или аварийное завершение. Особенно ценными являются &lt;strong&gt;загруженные модули&lt;/strong&gt; (DLL/EXE), которые позволяют выявить подозрительные библиотеки, внедрённые из нетипичных путей (например, &lt;code&gt;%TEMP%&lt;/code&gt; или &lt;code&gt;AppData&lt;/code&gt;), а также проверить их временные метки на несоответствие легитимным версиям. &lt;strong&gt;Информация о процессе&lt;/strong&gt; — PID, время создания, потребление CPU — помогает установить длительность его работы и коррелировать с логами безопасности. Если мини-дамп создан с расширенными флагами (например, &lt;code&gt;MiniDumpWithHandleData&lt;/code&gt;), он может содержать &lt;strong&gt;хендлы&lt;/strong&gt;, указывающие на открытые файлы, мьютексы, процессы или ключи реестра — прямые индикаторы вредоносного поведения. Но особенно важна &lt;strong&gt;дампированная память&lt;/strong&gt;: даже в компактном минидампе могут сохраниться фрагменты кучи или стека, где остаются следы сетевой активности — &lt;strong&gt;IP-адреса, доменные имена, URL-адреса C2-серверов&lt;/strong&gt;, строки конфигураций или команд. Анализ этих артефактов позволяет не только подтвердить компрометацию, но и восстановить тактику, техники и процедуры (TTPs) злоумышленника, делая минидамп незаменимым источником данных в цифровой криминалистике.&lt;/p&gt;

</content></entry><entry><id>threathunt_pedia:KVtSFEgpN6L</id><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia/KVtSFEgpN6L?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><title>Исследуем образец Nanocore RAT</title><published>2024-08-02T13:44:46.846Z</published><updated>2024-08-02T13:44:46.846Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/b0/59/b05953ac-d7d8-4657-ac70-5b8e3e9ce532.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/44/81/4481e48c-cbc6-4730-b4ba-f3a3dfdae43d.png&quot;&gt;Сегодня с вами разберем модуль удаленного управления семейства Nanocore RAT, MD5 8b6071a9344b21469ca5a4b62a0a855b. Для доставки данного модуля используется фишинг, в качестве вложения архив c исполняемым файлом внутри.</summary><content type="html">
  &lt;p id=&quot;he2R&quot;&gt;Сегодня с вами разберем модуль удаленного управления семейства Nanocore RAT, MD5 &lt;a href=&quot;https://www.virustotal.com/gui/file/2b4d871271fbc3f9487d370b9315bca0b9ca44ee81ecce6b89a57b31f7cf4598/detection&quot; target=&quot;_blank&quot;&gt;8b6071a9344b21469ca5a4b62a0a855b&lt;/a&gt;. Для доставки данного модуля используется фишинг, в качестве вложения архив c исполняемым файлом внутри.&lt;/p&gt;
  &lt;p id=&quot;eOaU&quot;&gt;Основная нагрузка загружается в 3 этапа. На первом этапе неизвестный загрузчик расшифровывает нагрузку, обходит AMSI и запускает в памяти. Нагрузка второго этапа обфусцирована виртуализатором KoiVM, основная задача которого расшифровать основную нагрузку и запустить в созданном процессе методом Process Hollowing.&lt;/p&gt;
  &lt;p id=&quot;msX3&quot;&gt;Больше информации об информационной безопасности, реверсу малвари и расследованию инцидентов в канале &lt;a href=&quot;https://t.me/threathunt_pedia&quot; target=&quot;_blank&quot;&gt;https://t.me/threathunt_pedia&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;KfVc&quot;&gt;Исспользуемые утилиты:&lt;/h2&gt;
  &lt;ol id=&quot;GCuL&quot;&gt;
    &lt;li id=&quot;Eifc&quot;&gt;&lt;a href=&quot;https://github.com/x64dbg/x64dbg&quot; target=&quot;_blank&quot;&gt;x64Debug&lt;/a&gt; - бинарный отладчик с открытым исходным кодом для Windows&lt;/li&gt;
    &lt;li id=&quot;bAQo&quot;&gt;&lt;a href=&quot;https://github.com/horsicq/Detect-It-Easy&quot; target=&quot;_blank&quot;&gt;Die&lt;/a&gt; - утилита для определения типов файлов..&lt;/li&gt;
    &lt;li id=&quot;baSG&quot;&gt;&lt;a href=&quot;https://www.winitor.com/&quot; target=&quot;_blank&quot;&gt;PeStudio&lt;/a&gt; - утилита поиска артефактов в исполняемом файле.&lt;/li&gt;
    &lt;li id=&quot;NrCf&quot;&gt;&lt;a href=&quot;https://www.angusj.com/resourcehacker/&quot; target=&quot;_blank&quot;&gt;ResourceHacker&lt;/a&gt; - редактор ресурсов исполняемого файла Windows.&lt;/li&gt;
    &lt;li id=&quot;MYdc&quot;&gt;&lt;a href=&quot;https://github.com/dnSpy/dnSpy&quot; target=&quot;_blank&quot;&gt;dnSpy&lt;/a&gt; - отладчик и редактор сборок .NET.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h1 id=&quot;kbhj&quot;&gt;Исследование нагрузки первого этапа - Загрузчик&lt;/h1&gt;
  &lt;p id=&quot;m8hk&quot;&gt;Загрузим исследуемый файл в DIE.&lt;/p&gt;
  &lt;figure id=&quot;398d&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d0/0e/d00e1a80-4f34-4541-b837-a247cb01a682.png&quot; width=&quot;527&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ATSF&quot;&gt;Исследуемый образец собран для 64-ых разрядных систем, разработан на языке программирования C#. Декомпилируем файл с помощью dnSpy и разберем функционал.&lt;/p&gt;
  &lt;figure id=&quot;LKr7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2f/5a/2f5aa9ac-88f5-4735-8007-07ca0d097df8.png&quot; width=&quot;426&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;YXO1&quot;&gt;После декомплияции все классы и методы запутаны, но давайте найдем точку входа. Поиск точки входа в файлах .NET иногда вызывает трудности, так как разработчики пытаются их скрыть. О методах поиска точек входа в .NET файлах описаны статье &lt;a href=&quot;https://blog.washi.dev/posts/entry-points/&quot; target=&quot;_blank&quot;&gt;Что на самом деле является точкой входа модуля .NET&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;7x7I&quot;&gt;В обозревателе сборок dnSpy загруженный файл имеет имя DefaultChareFixedBufferILOnly. Нажмем правой кнопкой мыши-&amp;gt;Перейти к точке входа. Точка входа указывает на статичную функцию WriteUInt32LittleEndianOperational.&lt;/p&gt;
  &lt;figure id=&quot;erLT&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8e/6a/8e6a21db-c473-40d3-8a67-465e0e4951ea.png&quot; width=&quot;955&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xa8a&quot;&gt;В данной функции создается класс GetIndexOfFirstNonAsciiChargetSyntax и программа завершается. Перейдем в реализацию класса и увидим, что основные действия происходят в деструкторе (Dispose).&lt;/p&gt;
  &lt;figure id=&quot;oVIo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/89/fc/89fcddd1-e4fd-45ea-a610-9ff76ab5e420.png&quot; width=&quot;595&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ns2u&quot;&gt;Все данные используемые загрузчиком зашифрованы, функция поиска реализована в lpstrSchemai8 класса GetIndexOfFirstNonAsciiChargetSyntax. На вход данной функции передается идентификатор извлекаемых данных. Поиск осуществляется в исполняемом файле.&lt;/p&gt;
  &lt;p id=&quot;RR6s&quot;&gt;Список идентификаторов извлекаемых данных:&lt;/p&gt;
  &lt;ul id=&quot;plvE&quot;&gt;
    &lt;li id=&quot;mz8G&quot;&gt;1 - ключ AES&lt;/li&gt;
    &lt;li id=&quot;BZkz&quot;&gt;2 - вектор инициализации IV&lt;/li&gt;
    &lt;li id=&quot;5umV&quot;&gt;3 - основная нагрузка nanocoreRAT&lt;/li&gt;
    &lt;li id=&quot;fna6&quot;&gt;4 - строка подключаемых функций и динамический библиотек, разделенных символом $&lt;/li&gt;
    &lt;li id=&quot;aoCh&quot;&gt;5 - &lt;code&gt;Opcode xor rcx, rcx;&lt;/code&gt; для атаки на AmsiOpenSession&lt;/li&gt;
    &lt;li id=&quot;VcLs&quot;&gt;6 - opcode для атаки на AmsiScanBuffer&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;15hr&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7f/c8/7fc8c8d6-e070-4918-86af-cb4b8e2cba41.png&quot; width=&quot;791&quot; /&gt;
    &lt;figcaption&gt;Фнукция извлечение данных по идентификатору&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;if79&quot;&gt;Извлеченные данные зашифрованы алгоритмом AES в режиме CBC.&lt;/p&gt;
  &lt;p id=&quot;E80o&quot;&gt;Разработаем скрипт для расшифрования строк и нагрузки следующего этапа. На вход функции ExtractPayload передается исследуемый исполняемый файл и идентификатор данных.&lt;/p&gt;
  &lt;pre id=&quot;vjFo&quot;&gt;from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

def ExtractPayload(filename,number):
    f = open(filename,&amp;#x27;rb&amp;#x27;)
    data = f.read()
    f.close()
    s_const = &amp;quot;f1rMzUVfquat2n49jUfMfBiG6K9UO&amp;quot;
    l = []
    for i in range(0,len(data)-len(s_const)):
        flag = True
        for j in range(0,len(s_const)):
            if data[i+j] != ord(s_const[j]):
                flag = False
                break
        if flag:
            l.append(i)
    
    num = l[number-1] + len(s_const)
    num2 = l[number] - num
    result = data[num:num+num2]
    return result

def DecryptPayload(number):
    key = ExtractPayload(&amp;#x27;nanocore.exe&amp;#x27;,1)
    iv = ExtractPayload(&amp;#x27;nanocore.exe&amp;#x27;,2)
    payload = ExtractPayload(&amp;#x27;nanocore.exe&amp;#x27;,number)
    cipher = AES.new(key, AES.MODE_CBC,iv=iv)
    plaintext = cipher.decrypt(payload)
    plaintext = unpad(plaintext, AES.block_size)
    return plaintext

print(&amp;#x27;Список используемых функций &amp;#x27;, DecryptPayload(4))
print(&amp;#x27;Оппкод для атаки на AmsiOpenSession &amp;#x27;, DecryptPayload(5))
print(&amp;#x27;Оппкод для атаки на AmsiScanBuffer &amp;#x27;, DecryptPayload(6))
print(&amp;#x27;KEY - &amp;#x27;,ExtractPayload(&amp;#x27;nanocore.exe&amp;#x27;,1))
payload = DecryptPayload(3)
w = open(&amp;#x27;nanocore_payload2.exe&amp;#x27;,&amp;#x27;wb&amp;#x27;)
w.write(payload)
w.close()&lt;/pre&gt;
  &lt;figure id=&quot;cJUr&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/47/cc/47ccbe72-2f47-496e-a70c-a76c0fa98d87.png&quot; width=&quot;839&quot; /&gt;
    &lt;figcaption&gt;Расшифрованные данные&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GYlV&quot;&gt;Для атаки на Amsi (Antivalware scan interface) модуль патчит функции AmsiScanBuffer и AmsiOpenSession.&lt;/p&gt;
  &lt;figure id=&quot;tIpb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/35/a9/35a91922-0e41-4423-af9a-4785ec11a848.png&quot; width=&quot;1080&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Yf4P&quot;&gt;Подробнее об атаках на интерфейс AMSI в статье &lt;a href=&quot;https://habr.com/ru/articles/758550/&quot; target=&quot;_blank&quot;&gt;AMSI bypass — От истоков к Windows 11&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;tsLn&quot;&gt;На данном этапе мы с вами разобрали работу загрузчика, основная задача которого расшифрование полезной нагрузки, запуск в памяти и обход AMSI.&lt;/p&gt;
  &lt;h1 id=&quot;66TH&quot;&gt;Исследование нагрузки второго этапа - Инжектор&lt;/h1&gt;
  &lt;p id=&quot;6ZK8&quot;&gt;Мы с вами получили файл нагрузки, получим о нем информацию, для этого загрузим в утилиту Die.&lt;/p&gt;
  &lt;figure id=&quot;Vvmy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fd/35/fd35b556-ba7f-4774-957b-72988c5b6b2a.png&quot; width=&quot;533&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;H5g2&quot;&gt;Как видно из рисунка выше исполняемый файл собран для 64-х разрядных систем, разработан на языке программирования C#. Декомпилируем файл в dnSpy.&lt;/p&gt;
  &lt;figure id=&quot;nseW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/c6/30c63daa-797f-4b2f-abca-f2cb0e4bfc83.png&quot; width=&quot;343&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jGWu&quot;&gt;Исследуемый файл защищен протектором &lt;a href=&quot;https://github.com/Loksie/KoiVM-Virtualization&quot; target=&quot;_blank&quot;&gt;KoiVM&lt;/a&gt;, об этом нам говорит поток KoiVM.Runtime. KoiVM - это виртуальная машина, созданная для работы на ConfuserEx, которая превращает коды операций .NET в новые, известные только машине KoiVM.&lt;/p&gt;
  &lt;p id=&quot;Xbk8&quot;&gt;Метод девирутализации модулей, защищенных KoiVM, описан в докладе &lt;a href=&quot;https://www.youtube.com/watch?v=v20M5RNB230&quot; target=&quot;_blank&quot;&gt;Девиртуализация объекта защищенного KoiVM&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;Xy9k&quot;&gt;Попробуем восстановить исходный алгоритм программы с помощью инструмента &lt;a href=&quot;https://github.com/Washi1337/OldRod&quot; target=&quot;_blank&quot;&gt;OldRod&lt;/a&gt;. Соберем утилиту.&lt;/p&gt;
  &lt;pre id=&quot;6f8D&quot;&gt;git clone -q --branch=master https://github.com/Washi1337/OldRod.git
git checkout -qf 56fc436807c46f94ffc1c790b9d8426dae7be047
git submodule update --init
&lt;/pre&gt;
  &lt;p id=&quot;NQH0&quot;&gt;Загруженный проект открываем в Visual Studio и собираем релиз. Запускаем файл для анализа.&lt;/p&gt;
  &lt;p id=&quot;zrE1&quot;&gt;К сожалению для нас, мы имеем дело с кастомной версией KoiVM, которая модифицировала протектор таким образом, что его не просто девиртуализировать. Первоначальная реализация KoiVM определяет 119 константных переменных, которые используются для виртуализации кода. Эти константы используются для определения регистров, флагов, кодов операций и т. д. Назначенные значения этих констант используются для правильного выполнения виртуализированного кода и также необходимы для процесса девиртуализации. Чтобы воспользоваться инструментом OldRod необходимо сформировать список констант и соответсвующие им опкоды, которые загружаются в формате json. В исследуемом модуле все константы обфусцированы арифметическими вычислениями, поэтому данный подход непригоден для получения результатов за разумное время.&lt;/p&gt;
  &lt;p id=&quot;xUbu&quot;&gt;Загрузим файл в PeStudio и проанализируем функции импорта (таблица &lt;code&gt;ImplMap&lt;/code&gt;).&lt;/p&gt;
  &lt;figure id=&quot;b9F6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e3/87/e3876c8f-53ac-4f8d-be51-81b4c9d73f8a.png&quot; width=&quot;651&quot; /&gt;
    &lt;figcaption&gt;Таблица функций импорта&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ulZS&quot;&gt;В исследуемом модуле доступ к функциям WinAPI и структурам осуществляется с помощью метода &lt;a href=&quot;https://bohops.com/2022/04/02/unmanaged-code-execution-with-net-dynamic-pinvoke/&quot; target=&quot;_blank&quot;&gt;PInvoke&lt;/a&gt;, его нельзя запутать.&lt;/p&gt;
  &lt;p id=&quot;obrF&quot;&gt;Мы можем идентифицировать данные функции и определить поведение инжектора KoiVM.&lt;/p&gt;
  &lt;p id=&quot;uh5K&quot;&gt;В таблице ImplMap обнаружены функции: CreateProcess, ReadProcess, WriteProcessMemory и т.д, которые используются для загрузки полезной нагрузки в памяти методом Process Hollowing.&lt;/p&gt;
  &lt;p id=&quot;TAtb&quot;&gt;Все вышеперчисленные функции определяются в классе &lt;code&gt;_dc&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;P0fC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/13/16/1316ad90-2ade-4a1c-8c9e-dde8a4d7430e.png&quot; width=&quot;1278&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;91aV&quot;&gt;Для получения основной нагрузки можно отладить вредоносный файл в dnSpy, найти вызов функции WriteProcessMemory, поставить точку останова.&lt;/p&gt;
  &lt;figure id=&quot;wyLx&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/49/fa/49fa7867-26ac-4cf4-8ed3-50e8f65a31e2.png&quot; width=&quot;1730&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;mXUR&quot;&gt;Далее перейти в HEX представление памяти, в переменной &lt;code&gt;this._kb&lt;/code&gt; указан адрес расшифрованной полезной нагрузки.&lt;/p&gt;
  &lt;figure id=&quot;B25t&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bc/12/bc126a8c-b921-4f38-9c8d-409570b82c77.png&quot; width=&quot;1397&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QjUP&quot;&gt;Также получить основную нагрузку можно с помощью отладчика x64dbg. После загрузки файла в отладчик, нажимаем Ctrl+G и вводим имя функции WriteProcessMemory.&lt;/p&gt;
  &lt;figure id=&quot;Q2G7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/72/f6/72f6a068-5d43-432b-b63e-b4ed310bf118.png&quot; width=&quot;748&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ohq7&quot;&gt;Далее начинаем отладку (F9) и попадаем на вызов интересующей нас функции.&lt;br /&gt;На регистр r8 нажмем правой кнопкой мыши-&amp;gt;Перейти к дампу. Из окошка дампа нажимаем правой кнопкой мыши и переходим в карту памяти, сохраняем участок памяти, находим заголовок MZ и копируем полученные данные в отдельный файл.&lt;/p&gt;
  &lt;p id=&quot;4arU&quot;&gt;На данном этапе мы с вами получили основную нагрузку последнего этапа, разобрали один из методов анализа модулей, защищенных протектором KoiVM. Основная полезная нагрузка загружается в память методом Process Hollowing, причем имена созданных процессов всегда различные.&lt;/p&gt;
  &lt;h1 id=&quot;Btdh&quot;&gt;Исследование основной нагрузки - Nanocore RAT&lt;/h1&gt;
  &lt;p id=&quot;K7oj&quot;&gt;Финальная нагрузка представляет собой 32-ух разрядный исполняемый файл, разработанный на C#.&lt;/p&gt;
  &lt;p id=&quot;tv9o&quot;&gt;MD5:fed1d5379855c7f3a50cd2e79f9e51c1&lt;br /&gt;SHA1:7f4119ba8c8799b340c7a7aa0b7ec41ad69e8c0f&lt;br /&gt;SHA256:b524e2e967e9727b6bf5d2e51f4fff102800ad77395f3c41235ac690608174f8&lt;/p&gt;
  &lt;figure id=&quot;dmuK&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8d/f2/8df259fa-ab8c-4a42-b1e8-7947c6c2d655.png&quot; width=&quot;526&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5Lxk&quot;&gt;Исследуемый файл защищен обфускатором Eazfuscator, попробуем запустить de4dot и преобразовать исполняемый код в читаемый вид.&lt;/p&gt;
  &lt;p id=&quot;HgZf&quot;&gt;&lt;code&gt;de4dot nanocore_payload.exe&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;lPXD&quot;&gt;Загрузим файл в dnSpyx32 и приступим к анализу.&lt;/p&gt;
  &lt;figure id=&quot;RFTM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2a/1b/2a1b3198-9c59-42c4-84bf-829b77989fdd.png&quot; width=&quot;1181&quot; /&gt;
    &lt;figcaption&gt;Точка входа исполняемого файла&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;UX5G&quot;&gt;Имя сборки NanoCore Client.&lt;/p&gt;
  &lt;p id=&quot;S46U&quot;&gt;После запуска Nanocore приступает к извлечению конфигурации. Функционал по извлечению конфигурации реализован в классе Class8.&lt;/p&gt;
  &lt;p id=&quot;iWmK&quot;&gt;Зашифрованная конфигурация расположена в ресурсе исполняемого файла и имеет следующую структуру.&lt;/p&gt;
  &lt;figure id=&quot;YZWn&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1d/79/1d792d6c-3281-406f-b57b-088f0ae8dfea.png&quot; width=&quot;643&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;M1A4&quot;&gt;Первые четыре байта (0x00000010) это размер зашифрованного ключа. Следующие байты содержат зашифрованный ключ. Далее четыре байта (0x15f58) содержат размер конфигурации.&lt;/p&gt;
  &lt;figure id=&quot;qAiz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/87/cb/87cbbef9-067b-4c18-b979-72d9a30a2a56.png&quot; width=&quot;1013&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I1CB&quot;&gt;После модуль считывает свой собственный Guid, для генерации криптографического ключа PBKDF2.&lt;/p&gt;
  &lt;figure id=&quot;rTes&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2a/cf/2acf6453-6f2f-437b-8b78-d89a47e02df4.png&quot; width=&quot;426&quot; /&gt;
    &lt;figcaption&gt;GUID исполняемого файла&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;mqQh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/19/a6/19a6b30f-a954-4ee3-9b49-4855487833ce.png&quot; width=&quot;1340&quot; /&gt;
    &lt;figcaption&gt;Расшифрование ключа&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ywkw&quot;&gt;С помощью сформированного криптографического ключа расшифровывается извлеченный из конфигурации ключ по алгоритму &lt;a href=&quot;https://en.wikipedia.org/wiki/Advanced_Encryption_Standard&quot; target=&quot;_blank&quot;&gt;Rijndael&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;7ULO&quot;&gt;Следующим этапом инициализуется шифратор DES, где в качестве ключа и вектора инициализации используется ключ расшифрованный на предыдущем этапе (0x722018788C294897). Данный алгоритм используется также для шифрования файлов и протокола взаимодействия с управляющим сервером.&lt;/p&gt;
  &lt;p id=&quot;e70d&quot;&gt;Сообществом уже создана реализация алгоритма расшифрования &lt;a href=&quot;https://github.com/nict-csl/NanoCoreRAT-Analysis&quot; target=&quot;_blank&quot;&gt;конфигурации NanocoreRAT&lt;/a&gt;. Загрузим утилиту и расшифруем настройки модуля.&lt;/p&gt;
  &lt;pre id=&quot;SpTK&quot;&gt;py nanocore_extract_settings.py -f nanocore_payload.exe

ИЛИ 

py nanocore_extract_settings.py -f nanocore_payload.exe --verbose&lt;/pre&gt;
  &lt;figure id=&quot;O2wZ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0c/45/0c45373f-d110-4f8a-ad57-bed147694700.png&quot; width=&quot;480&quot; /&gt;
    &lt;figcaption&gt;Конфигурация модуля&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jHLA&quot;&gt;В конфигурации модуля содержатся плагин keyloger, адреса управляющих серверов, адреса DNS серверов для разыменования доменных имен и многое другое.&lt;/p&gt;
  &lt;p id=&quot;FlP8&quot;&gt;После расшифрования конфигурации модуль настраивает классы, создает рабочий каталог в &lt;code&gt;AppData\\Roaming&lt;/code&gt; с именем MachineGuid, считанным из ключа реестра &lt;code&gt;SOFTWARE\\Microsoft\\Cryptography\\MachineGuid&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;k9La&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/35/9b/359b4de5-36a7-4039-9aa2-f3830aac2e36.png&quot; width=&quot;530&quot; /&gt;
    &lt;figcaption&gt;Рабочий каталог модуля&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rUHj&quot;&gt;В файл run.dat записывается время запуска модуля. В файл task.dat записывается путь исполняемого файла с целью дальнейшего создания задачи в планировщике задач.&lt;/p&gt;
  &lt;p id=&quot;mYya&quot;&gt;Также в данном каталоге создаеюся файлы storage.dat, который хранит загруженные плагины из С2, и settings.bin, зашифрованные DES.&lt;/p&gt;
  &lt;p id=&quot;QjTg&quot;&gt;Давайте разберем протокол взаимодействия с управляющим сервером и разработаем правило детектирования.&lt;/p&gt;
  &lt;p id=&quot;nNFw&quot;&gt;Код протокола взаимодействия реализован в классе Client.&lt;/p&gt;
  &lt;p id=&quot;GU8G&quot;&gt;После получения конфигурации полезная нагрузка NanoCore запрашивает доменное имя, указанное в параметре PrimaryConnectionHost конфигурации. В качестве DNS сервера указаны 8.8.8.8 (PrimaryDnsServer) и 8.8.4.4 (BackupDnsServer). После получения адреса управляющего сервера начинается процесс взаимодействия с управляющим сервером.&lt;/p&gt;
  &lt;p id=&quot;kHk7&quot;&gt;Модуль NanoCore поддерживает 3 типа команд:&lt;/p&gt;
  &lt;ol id=&quot;Myk0&quot;&gt;
    &lt;li id=&quot;6R1C&quot;&gt;BaseCommand (0x0)- базовый тип команд, в которую входит отправка информации о зараженной системе, готовность модуля, обновление конфигурации.&lt;/li&gt;
    &lt;li id=&quot;Nrtt&quot;&gt;PluginCommand (0x1) - обновление плагинов и загрузка новых.&lt;/li&gt;
    &lt;li id=&quot;fQjg&quot;&gt;FileCommand (0x2) - выгрузка, поиск файлов, вычисление хэш-суммы MD5 .&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;Jnqf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e3/17/e3179dd7-93b7-4317-858a-c117ecd8e859.png&quot; width=&quot;290&quot; /&gt;
    &lt;figcaption&gt;Типы команд взаимодействия с C2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VP76&quot;&gt;У каждого типа команды есть идентификатор, который определяет как обрабатывать отправляемые данные. На рисунке ниже представлены тип команды BaseType с различными идентификаторами. Идентификатор 0x0 - отправляет первичную информацию о системе: значение MachineGuid, имя компьютера, имя пользователя, значение DefaultGroup из конфигурации модуля и версию NanocoreRAT. Идентификатор 0x6 - команда о готовности модуля к работе (heartbeat).&lt;/p&gt;
  &lt;figure id=&quot;HvMe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/df/e9/dfe97b82-bf79-4fa2-85f0-67a66070a20d.png&quot; width=&quot;918&quot; /&gt;
    &lt;figcaption&gt;Базовый тип команд&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Nw9D&quot;&gt;Далее отправляемая информация на C2 формируется в поток байт и шифруется алгоритмом DES в режиме CBC с ключом и вектором инициализации равным 0x722018788C294897. Данный ключ получен на этапе расшифрования конфигурации.&lt;/p&gt;
  &lt;p id=&quot;W2DF&quot;&gt;После установления соединения с управляющим сервером по порту 3654, модуль отправляет данные о системе. Каждый пакет содержит первые 4 байта равной длине зашифрованных данных.&lt;/p&gt;
  &lt;figure id=&quot;V33l&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/02/29/0229cd63-af50-46e6-a16e-2720ca51c867.png&quot; width=&quot;561&quot; /&gt;
    &lt;figcaption&gt;Зашифрованный пакет информации о системе&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;GOgs&quot;&gt;Давайте расшифруем информацию выше, для этого воспользуемся Cyberchef. Добавим операцию DES Decrypt и укажем ключ и вектор инициализации.&lt;/p&gt;
  &lt;figure id=&quot;vIkv&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/3e/863e169e-9a3d-4b6c-816b-83687ebf9844.png&quot; width=&quot;1336&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;h0di&quot;&gt;После отправки данных о зараженном компьютере, модуль отсылает пакет о готовности к получению команд, который содержит значение 0x600.&lt;/p&gt;
  &lt;p id=&quot;ZscT&quot;&gt;Длина пакета готовности модуля равна 8 байт.&lt;/p&gt;
  &lt;figure id=&quot;Y9zQ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/5c/0b5ca791-b58e-4ec0-8410-c44f913c250e.png&quot; width=&quot;530&quot; /&gt;
    &lt;figcaption&gt;Зашифрованный пакет готовности модуля&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jjxM&quot;&gt;Расшифруем пакет готовности.&lt;/p&gt;
  &lt;figure id=&quot;wZm7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/61/71/61712d59-8acd-46f1-9d3d-a2b27d55a30b.png&quot; width=&quot;781&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wMfe&quot;&gt;На данном этапе мы с вами разобрали протокол взаимодействия с управляющим сервером. Длина отправляемых данных о системе и готовности к получению команд всегда одинакова и равны 0x40, 0x8 байт соответственно.&lt;/p&gt;
  &lt;p id=&quot;xJ5Y&quot;&gt;Разработаем сетевые правила для детектирования работы модуля в сетевом трафике.&lt;/p&gt;
  &lt;p id=&quot;hjYj&quot;&gt;Правило для команды готовности одинаково, можно указать полностью зашифрованное DES значение 0x600, но я предполагаю, что ключ шифрования может меняться, поэтому будем искать пакет определенной длины и статичным значением.&lt;/p&gt;
  &lt;p id=&quot;jijf&quot;&gt;&lt;code&gt;alert tcp any any -&amp;gt; any any (msg: &amp;quot;Nanocore RAT length packet 0x8 Heartbeat&amp;quot;; flags: PA; dsize:12; depth:4; content:&amp;quot;|08 00 00 00|&amp;quot;; sid: 1000001;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;QK7o&quot;&gt;Правило для поиска пакета о зараженном устройстве.&lt;/p&gt;
  &lt;p id=&quot;BZCo&quot;&gt;&lt;code&gt;alert tcp any any -&amp;gt; any any (msg: &amp;quot;Nanocore RAT length packet 0x40 Info System&amp;quot;; flags: PA; dsize:68; depth:4; content:&amp;quot;|40 00 00 00|&amp;quot;; sid: 1000002;)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;sjuM&quot;&gt;При анализе пакета смотрим на tcp флаги PSH (Push) и ACK (Acknowledgment), глубина от начала 4 байта, размеры пакетов указаны в параметре dsize (4 байта + длина пакета).&lt;/p&gt;
  &lt;p id=&quot;HT7h&quot;&gt;Также одним из индикаторов компрометации является файл run.dat, содержащий временную метку запуска модуля, находящийся в рабочем каталоге исследуемого модуля &lt;code&gt;C:\\Users\\&amp;lt;user&amp;gt;\\AppData\\Roaming\\&amp;lt;MachineGuid&amp;gt;&lt;/code&gt;.&lt;/p&gt;
  &lt;h1 id=&quot;DqfZ&quot;&gt;Заключение&lt;/h1&gt;
  &lt;p id=&quot;bzbO&quot;&gt;Мы с вами разобрали вредоносный файл семейства Nanocore RAT, который имеет обширный функционал. Модуль был разработан в 2015 году, но актуальность свою на сегодняшний день не потерял. Для обхода детектирования основная нагрузка упакована в 3 этапа. Большую трудность при анализе составило исследования инжектора, защищенного кастомным KoiVM. Разработали сетевые правила детектирования для Suricata и индикаторы компрометации, в которые входят: адрес управляющего сервера, порт, мьютекс и созданные в рабочем каталоге файлы.&lt;/p&gt;

</content></entry><entry><id>threathunt_pedia:0pm_aizEcig</id><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia/0pm_aizEcig?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><title>Исследование PlugX RAT</title><published>2024-02-07T18:52:41.759Z</published><updated>2024-02-08T17:48:00.718Z</updated><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/61/53/6153119f-288c-4699-97bb-513422dfa995.jpeg&quot;&gt;Сегодня мы с вами разберем исполняемый файл семейства PlugX. Данный образец использовался APT TA428, Space Pirates. Изучим работу загрузчика, алгоритм расшифрования строк и основной нагрузки модуля. Потренируемся реверсить настоящие вирусы.</summary><content type="html">
  &lt;p id=&quot;h7hm&quot;&gt;Сегодня мы с вами разберем исполняемый &lt;a href=&quot;https://www.virustotal.com/gui/file/c6ac1d9ec34e0b00e639ab2ec49777b1d680789bf8114de7614058838a8c2eb5/details&quot; target=&quot;_blank&quot;&gt;файл&lt;/a&gt; семейства PlugX. Данный образец использовался APT TA428, Space Pirates. Изучим работу загрузчика, алгоритм расшифрования строк и основной нагрузки модуля. Потренируемся реверсить настоящие вирусы.&lt;/p&gt;
  &lt;p id=&quot;I0zl&quot;&gt;Больше информации об информационной безопасности, реверсу малвари и расследованию инцидентов в канале &lt;a href=&quot;https://t.me/threathunt_pedia&quot; target=&quot;_blank&quot;&gt;https://t.me/threathunt_pedia&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;KJPr&quot;&gt;Используемые утилиты:&lt;/h2&gt;
  &lt;ol id=&quot;70fT&quot;&gt;
    &lt;li id=&quot;Znsw&quot;&gt;&lt;a href=&quot;https://github.com/OALabs/BlobRunner&quot; target=&quot;_blank&quot;&gt;Blobrunner&lt;/a&gt; - инструмент для отладки шелл-кода.&lt;/li&gt;
    &lt;li id=&quot;BDP8&quot;&gt;&lt;a href=&quot;https://github.com/mandiant/speakeasy&quot; target=&quot;_blank&quot;&gt;SpeakEasy&lt;/a&gt; - эмулятор, предназначенный для эмуляции вредоносных программ ядра и пользовательского режима Windows.&lt;/li&gt;
    &lt;li id=&quot;SWkF&quot;&gt;&lt;a href=&quot;https://github.com/NationalSecurityAgency/ghidra&quot; target=&quot;_blank&quot;&gt;Ghidra&lt;/a&gt; - это платформа обратного проектирования программного обеспечения (SRE)/&lt;/li&gt;
    &lt;li id=&quot;Pwb0&quot;&gt;&lt;a href=&quot;https://hex-rays.com/ida-pro/&quot; target=&quot;_blank&quot;&gt;IDA Pro&lt;/a&gt; - инструмент для анализа двоичного кода.&lt;/li&gt;
    &lt;li id=&quot;RSeE&quot;&gt;&lt;a href=&quot;https://github.com/x64dbg/x64dbg&quot; target=&quot;_blank&quot;&gt;x64Debug&lt;/a&gt; - бинарный отладчик с открытым исходным кодом для Windows&lt;/li&gt;
    &lt;li id=&quot;KiXv&quot;&gt;&lt;a href=&quot;https://github.com/horsicq/Detect-It-Easy&quot; target=&quot;_blank&quot;&gt;Die&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;EXUM&quot;&gt;&lt;a href=&quot;https://www.winitor.com/&quot; target=&quot;_blank&quot;&gt;PeStudio&lt;/a&gt; - утилита поиска артефактов в исполняемом файле.&lt;/li&gt;
    &lt;li id=&quot;b2WA&quot;&gt;&lt;a href=&quot;https://www.angusj.com/resourcehacker/&quot; target=&quot;_blank&quot;&gt;ResourceHacker&lt;/a&gt; - редактор ресурсов исполняемого файла Windows.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;TJ1w&quot;&gt;Информация об исполняемом файле&lt;/h2&gt;
  &lt;p id=&quot;Hers&quot;&gt;Первоначально получим инфорамацию об исполняемом файле, для этого загрузим в утилиту Die.&lt;/p&gt;
  &lt;figure id=&quot;h9sY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/29/20/2920444b-4c52-4c1b-88d4-c31a2026374f.png&quot; width=&quot;721&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;S2T1&quot;&gt;Файл собран для 32-ух разрядных систем и разработан на языке программирования C/C++.&lt;/p&gt;
  &lt;p id=&quot;E9E0&quot;&gt;Просмотрим также информацию о заголовке исполняемого файла, для этого воспользуемся утилитой PeStudio.&lt;/p&gt;
  &lt;p id=&quot;M9BN&quot;&gt;Файл содердит ресурс с имеменм BIN, энтропия 7.949, что свидетельствует о зашифрованных данных.&lt;/p&gt;
  &lt;figure id=&quot;ijlE&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fb/59/fb5934dc-42d6-4a5e-8b50-24f74616527b.png&quot; width=&quot;937&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Gdja&quot;&gt;Выгрузим данный ресурс с помощью утилиты ResourceHacker. Далее начнем изучать исполняемый файл.&lt;/p&gt;
  &lt;h2 id=&quot;6gHk&quot;&gt;Исследование&lt;/h2&gt;
  &lt;p id=&quot;w2CO&quot;&gt;Проведем статический анализ вредоноса для этого загрузим файл в IDA Pro, найдем функцию &lt;code&gt;main&lt;/code&gt; и декомпилируем с помощью HexRays.&lt;/p&gt;
  &lt;figure id=&quot;y61u&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/99/f2/99f250bd-1d5b-400e-a3b2-3b9d517ad77a.png&quot; width=&quot;447&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AOVD&quot;&gt;Основной функционал расположен в функции &lt;code&gt;sub_401380&lt;/code&gt;. В качестве параметра передается дескриптор исполняемого файла. Рассмотрим данную функцию.&lt;/p&gt;
  &lt;figure id=&quot;9lFh&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/17/9517b16d-5e4a-407c-a482-f0a819121d80.png&quot; width=&quot;619&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Yzus&quot;&gt;С помощью функции &lt;code&gt;CreateFileA&lt;/code&gt; проверяется доступность файла &lt;code&gt;calc.exe&lt;/code&gt;. Далее выполняется функция &lt;code&gt;sub_4011B0&lt;/code&gt;, в качестве входных данных передается имя BIN ресурса.&lt;/p&gt;
  &lt;figure id=&quot;NqYe&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ce/2e/ce2eb6cc-f647-4471-bb79-8e181366b814.png&quot; width=&quot;641&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6GBi&quot;&gt;В данной функции считываются содежимое ресурса (LoadResource) и расчитывается его размер (SizeofResource). Далее получения адреса WinAPI функций VirtualAlloc и memcpy. На участке кода &lt;code&gt;0x4012a3&lt;/code&gt; просиходит расшифрование полезной нагрузки из ресурса BIN.&lt;br /&gt;Для того чтобы разобать алгоритм расшифрования ресурса BIN проведем динамический анализ.&lt;/p&gt;
  &lt;p id=&quot;55R4&quot;&gt;При динамичском анализе помним, что адрес функций при новом запуске постоянно меняется, но смещение это последние 4 цифры имени функции сохраняются.&lt;/p&gt;
  &lt;p id=&quot;28UK&quot;&gt;Загрузим в x32dbg наш файл с помощью &lt;code&gt;ctrl+G&lt;/code&gt; указываем адрес перехода &lt;code&gt;..11B0&lt;/code&gt; , поставим точку останова. Нажмем &lt;code&gt;F9&lt;/code&gt; и переходим к участку кода по адресу &lt;code&gt;0x..12a3&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;s0vO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e5/27/e527baf1-1224-4aca-893f-0b8b1a43dcea.png&quot; width=&quot;717&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PFXd&quot;&gt;С каждым байтом проводится операция &lt;code&gt;~&lt;/code&gt; (отрицание), xor (исключающее или) с байтом 0xef и xor со статически заданным ключом.&lt;/p&gt;
  &lt;p id=&quot;igvV&quot;&gt;Для просмотра ключа необходимо перейти к дампу памяти по адресу &lt;code&gt;ds:[edx+449000]&lt;/code&gt; для этого нажмем правой кнопкой мыши-&amp;gt;Перейти к дампу. Длина ключа 255 байт.&lt;/p&gt;
  &lt;figure id=&quot;ROaW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/fb/e6/fbe6b708-fa4b-43ed-bbc4-c084058f3dc9.png&quot; width=&quot;521&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;69uK&quot;&gt;Скопируем ключ и напишем алгоритм расшифрования файла ресурса BIN на Python3.&lt;/p&gt;
  &lt;pre id=&quot;FnYG&quot;&gt;
f = open(&amp;#x27;BIN109.bin&amp;#x27;,&amp;#x27;rb&amp;#x27;)
w = open(&amp;#x27;BIN_Decrypt&amp;#x27;,&amp;#x27;wb&amp;#x27;)

KEY = [
0xA3,0x34,0xAF,0x34,0x3F,0x35,0x7D,0x35,0x85,0x35,0x8C,0x35,0xA6,0x35,
0xAE,0x35,0xB4,0x35,0x2B,0x36,0x37,0x36,0x4B,0x36,0x57,0x36,0x5F,0x36,
0x6B,0x36,0x73,0x36,0x7F,0x36,0x87,0x36,0x93,0x36,0x9B,0x36,0xA7,0x36,
0x7E,0x37,0x93,0x37,0x9B,0x37,0xAA,0x37,0xBF,0x37,0xC7,0x37,0xD6,0x37,
0xDE,0x37,0xE9,0x37,0xFA,0x37,0xA,0x39,0x16,0x39,0x36,0x39,0x42,0x39,
0x5D,0x39,0x64,0x39,0x75,0x39,0x84,0x39,0x99,0x39,0xA0,0x39,0xBA,0x39,
0xC4,0x39,0x63,0x3B,0x71,0x3B,0xC2,0x3B,0xC9,0x3B,0xD6,0x3B,0xDE,0x3B,
0xE5,0x3B,0x1C,0x3C,0x29,0x3C,0xC2,0x3C,0xCE,0x3C,0xD8,0x3C,0xE4,0x3C,
0xEC,0x3C,0xF8,0x3C,0,0x3D,0xC,0x3D,0x14,0x3D,0x20,0x3D,0x34,0x3D,0x40,
0x3D,0xC5,0x3E,0x16,0x3F,0x49,0x3F,0x4F,0x3F,0x84,0x3F,0xCC,0x3F,0xD0,
0x3F,0xED,0x3F,0xFB,0x3F,0,0,0,0x40,0,0,0x70,0,0,0,0x27,0x30,0x44,0x30,
0x4D,0x30,0xA4,0x30,0xB4,0x30,0xBA,0x30,0x20,0x31,0xB0,0x31,0xCD,0x31,
0xD8,0x31,0x1A,0x32,0x2B,0x32,0xBA,0x32,0xC8,0x32,0x3C,0x33,0x40,0x33,
0x4B,0x33,0x66,0x33,0x6B,0x33,0x85,0x33,0x8B,0x33,0x91,0x33,0x97,0x33,
0x9D,0x33,0xA3,0x33,0xA9,0x33,0xAF,0x33,0xB5,0x33,0xBB,0x33,0xC1,0x33,
0xC7,0x33,0xCE,0x33,0xD6,0x33,0xDE,0x33,0xE6,0x33,0xF2,0x33,0xFB,0x33,
0,0x34,0x6,0x34,0x10,0x34,0x19,0x34,0x24,0x34,0x32,0x34,0x37,0x34,0x3D,
0x34,0x48,0x34,0x4F,0x34,0x58,0x34,0x5C,0x34,0x67,0x34
]

result = bytearray()
b = f.read()

for i in range(0,len(b)):
    result.append((((~b[i]) ^ 0xef) &amp;amp; 0xff) ^ KEY[i % 256])
    
w.write(result)

f.close()
w.close()

&lt;/pre&gt;
  &lt;p id=&quot;JhZk&quot;&gt;MD5 расшифрованного ресурса BIN: 0226a4f0be90c8588774c805626359db.&lt;/p&gt;
  &lt;p id=&quot;SWqU&quot;&gt;После расшифрования шелл-кода с помощью функции VirtualAlloc выделяется участок памяти и далее с помощью memcpy копируется в него расшифрованные данные. Начало расшифрованных данных представляют собой шелл-код, с которого начинается дальнейшее выполнение.&lt;/p&gt;
  &lt;figure id=&quot;i7rz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/63/00/63008a29-394f-4169-a33b-62035e96255e.png&quot; width=&quot;589&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;iUtA&quot;&gt;Перейдем во внуть функции &lt;code&gt;call eax&lt;/code&gt; (горячая клавиша F7) и разберем алгоритм работы шелл-кода.&lt;/p&gt;
  &lt;p id=&quot;4wHG&quot;&gt;Следующий участок кода сильно обфусцирован по алгоритму &lt;a href=&quot;https://github.com/obfuscator-llvm/obfuscator/wiki/Control-Flow-Flattening&quot; target=&quot;_blank&quot;&gt;CFF&lt;/a&gt; (Control Flow Flattening). В коде присутствует большое количесвто условных операций, что свидетельствует об операнде switch C++. Но на данном участке начинается процесс расшифровки основной полезной нагрузки PlugX.&lt;/p&gt;
  &lt;figure id=&quot;RNUb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/67/0c/670c9a04-c1d2-4aa2-bdd3-8e73cac86552.png&quot; width=&quot;715&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wBzT&quot;&gt;С помощью трассировки в x32dbg (Ctrl + F7) собрал алгоритм расшифрования основной полезной нагрузки. В расшифрованном файле BIN нагрузка расположена по смещению 0x7AD. С каждым байтом нагрузки осуществляются следующие операции:&lt;/p&gt;
  &lt;p id=&quot;nNS6&quot;&gt;&lt;code&gt;(edi + 0x46) &amp;amp; 0xff) ^ 0xf7) - 0xa8) &amp;amp; 0xff&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;Tokr&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/15/9215dd3c-16af-4782-8dc2-531624cdce1f.png&quot; width=&quot;927&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qIpi&quot;&gt;Длина полезной нагрузки PlugX равна 0x13c33. Как видно из рисунка выше регистр EAX уменьшается на 1 и цикл расшифровки байта повторяется.&lt;/p&gt;
  &lt;p id=&quot;CvXN&quot;&gt;В шестнадцетиричном редактторе HxD можно скопировать зашифрованный блок. Смещение от начала 0x7AD, длина 0x1c3cc.&lt;/p&gt;
  &lt;figure id=&quot;zGmH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a7/16/a7168e43-b13e-4732-a770-30bf48313de4.png&quot; width=&quot;244&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;aWZp&quot;&gt;Начало расшифрованного кода &lt;code&gt;E8 00 00 00 00 58&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;r3TY&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/89/c6/89c6f300-855c-49eb-972a-9774deead2fe.png&quot; width=&quot;494&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;pp7H&quot;&gt;После расшифрования выполнение передается на расшифрованный участок, который представляет собой новый шелл-код. Далее перейдем к участку расшифрованного шелл-кода, с которого начинается выполнени. Для этого в x32dbg нажмем горячую клавишу &lt;code&gt;Ctrl+G&lt;/code&gt; и введем адрес, оканчивающийся на ...7ad (первые байты всегда будут разные).&lt;/p&gt;
  &lt;figure id=&quot;r0qs&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b4/ba/b4ba263c-4f97-4e65-8358-7ef4b55d0aff.png&quot; width=&quot;490&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;dxtz&quot;&gt;Перейдем в функцию &lt;code&gt;call ...07EB&lt;/code&gt;. В данной функции модуль получает адреса WinAPI функций VirtualAlloc, VirtualFree, RtlDecompressBuffer, memcpy с помощью GetProcAddress.&lt;/p&gt;
  &lt;p id=&quot;9rF7&quot;&gt;Спускаемся ниже и видим выполнение функции RtlDecompressBuffer.&lt;/p&gt;
  &lt;figure id=&quot;oURo&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/17/d9/17d9f601-c1d6-4120-97c3-aad7761293f0.png&quot; width=&quot;717&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;h8DP&quot;&gt;В параметре CompressedBuffer находится адрес сжатых данных, которые мы получили после расшифрования начиная со смещения 0x7AD длиной 0x1c3cc. Сжатые данные расположены по смещению 0x523.&lt;/p&gt;
  &lt;figure id=&quot;R76o&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d1/42/d14222dc-d79d-4c9c-9f09-76368f51d2bd.png&quot; width=&quot;610&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ArvD&quot;&gt;Перейдем к адресу UncompressBuffer после выполнения функции RtlDecompressBuffer и увидим расшифрованные данные, которые представляют собой основной модуль PlugX.&lt;/p&gt;
  &lt;figure id=&quot;wTjt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6f/d5/6fd5d58e-37b4-46a6-b4bf-543dad83c26c.png&quot; width=&quot;528&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ZQkk&quot;&gt;Процесс получения основной полезной нагрузки следующий: расшифрование ресурса BIN, выполнение шелл-кода из ресурса BIN, расшифрование следующего этапа шелл-кода по смещению 0x7AD файла ресурса, выполнение второго этапа шелл-кода, декомпреcсия основной полезной нагрузки.&lt;/p&gt;
  &lt;p id=&quot;RbYl&quot;&gt;После извлечения основной полезной нагрузки второй этап шелл-кода проверяет сигнатуру расшифрованной нагрузки PlugX, где MZ и PE заменены на XV.&lt;/p&gt;
  &lt;p id=&quot;f4IQ&quot;&gt;Основная нагрузка представляет собой динамическую библиотеку. Для проведения статического анализа основной полезной нагрузки PlugX yнеобходимо заменить XV на MZ и PE и загрузить в IDA Pro.&lt;/p&gt;
  &lt;p id=&quot;j8gH&quot;&gt;После исполнения загрузчика выполнение передается в основную нагрузку, где в переменной lpReserved содержится структура, в которой хранится адрес конфигурации. Первые 4 байта конфигурации содержат размер (0x5ba) (см. Рисунок ниже).&lt;/p&gt;
  &lt;figure id=&quot;65zz&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dd/1c/dd1cb9ca-b7d7-4163-9cd0-a0f7305df0a6.png&quot; width=&quot;529&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;euj1&quot;&gt;Все строки основной нагрузки зашифрованы. Функция расшифрования строк находится по адресу &lt;code&gt;....15D7&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;40FL&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/84/16/8416f316-a885-46b3-bfb0-dbe566f5816f.png&quot; width=&quot;879&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PaP1&quot;&gt;На вход функции расшифрования подается строка и ее длина, причем первые 4 байта представляют собой константу для инициализации переменных key1 и key2. Разработаем Python3 скрипт для IDA Pro&lt;/p&gt;
  &lt;pre id=&quot;0FkF&quot;&gt;iimport struct
import idaapi


lobyte = lambda v3: v3 &amp;amp; 0xFF
hibyte = lambda v3: (v3 &amp;amp; 0xFF00) &amp;gt;&amp;gt; 8

lobyte2 = lambda v3: (v3 &amp;amp; 0xff0000) &amp;gt;&amp;gt; 16
hibyte2 = lambda v3: (v3 &amp;amp; 0xff000000) &amp;gt;&amp;gt; 24

def decrypt(b):
    
    const_ = struct.unpack(&amp;#x27;&amp;lt;I&amp;#x27;,b[:4])[0]
    k1 = const_ ^ 0x13352af
    k2 = const_ ^ 0xa7
    result = []
    for i in b[4:]:
        k1 = (k1 + 0x6FD) &amp;amp; 0xffffffff
        k2 = (k2 - 0x305B) &amp;amp; 0xffffffff
        a = ((((((((((lobyte(k1) - hibyte(k1)) &amp;amp; 0xff) ^ lobyte2(k1)) - hibyte2(k1) &amp;amp; 0xff) ^ lobyte(k2)) - hibyte(k2)) &amp;amp; 0xff) ^ lobyte2(k2)) - hibyte2(k2)) &amp;amp; 0xff) ^ i
        result.append(a)
    return &amp;quot;&amp;quot;.join([chr(i) for i in result])
    

def main(start,size):
    b = bytearray()
    w = open(&amp;#x27;C:\\Users\\User\Downloads\\result.txt&amp;#x27;,&amp;#x27;bw+&amp;#x27;)
    for i in range(size):
        x = idaapi.get_byte(start + i)
        b.append(x)
    d = decrypt(b)
    print(d)
&lt;/pre&gt;
  &lt;p id=&quot;Mbam&quot;&gt;Загрузим данный скрипт в IDA Pro (File-&amp;gt;Script File). При расшифровании определнной строки в командной строке Python IDA Pro вводим адрес и размер строки, к примеру, main(0x1002411c,7).&lt;/p&gt;
  &lt;p id=&quot;zUXo&quot;&gt;Все расшифрованные строки модуля представлены ниже.&lt;/p&gt;
  &lt;pre id=&quot;HrkG&quot;&gt;SeDebugPrivilege
SeTcbPrivilege
Global\
Global\
\\.\PIPE\
http
https
socks
ftp
%APPDATA%\Mozilla\Firefox
profiles.in
Path
Profile0
prefs.js
user_pref(&amp;quot;network.proxy.http&amp;quot;
user_pref(&amp;quot;network.proxy.http_port&amp;quot;
user_pref(&amp;quot;network.proxy.ftp&amp;quot;
user_pref(&amp;quot;network.proxy.ftp_port&amp;quot;
user_pref(&amp;quot;network.proxy.ssl&amp;quot;
user_pref(&amp;quot;network.proxy.ssl_port&amp;quot;
user_pref(&amp;quot;network.proxy.socks&amp;quot;
user_pref(&amp;quot;network.proxy.socks_port&amp;quot;
user_pref(&amp;quot;network.proxy.socks_version&amp;quot;
%WINDIR%\SYSTEM32\SERVICES.EXE
GlobalMemoryStatusEx
GetNativeSystemInfo
\\.\PIPE\
PlugInfo
DISK
DISK
KeyLogger
Nethood
Netstat
Option
PortMap
Process
Regedit
Screen
Service
Shell
SQL
Telnet
static
%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d
NUM%d
F%d
Back
Tab
Cls
Enter
Pause
Esc
PageUp
PageDn
End
/]
Left
Up
Rigth
Down
Select
Print
Exec
PrtSc
Ins
Del
Hlp
LWin
RWin
Apps
Sleep
Numlock
Scroll
[Ctl+Alt+%s]
[Ctl+%s]
[Alt+%s]
[%s]
System Idle Process
System
System
System
System
SeShutdownPrivilege
SeShutdownPrivilege
SeShutdownPrivilege
NT AUTHORITY
SYSTEM
NT AUTHORITY
SYSTEM
NT AUTHORITY
SYSTEM
System Idle Process
System
System
CompanyName
FileD
CíÖ,z
FileVersion
ProductName
ProductVersion
\SystemRoot\
\??\
CompanyName
FileDescription
FileVersion
ProductName
ProductVersion
DISPLAY
DISPLAY
DISPLAY
DISPLAY
%4.4d%2.2d%2.2d%2.2d%
ÿ&amp;#x27;½ê¬ÒN
DISPLAY
WINSTA0
image/jpeg
DISPLAY
*.*
.jpg
*.*
.jpg
%
Comp
FileDescription
FileVersion
ProductName
ProductVersion
SYSTEM\CurrentControlSet\Services\
SYSTEM\CurrentControlSet\Services\
\Parameters
Se
IfN
ServiceDll
CMD /Q
CONIN$
CONIN$
CONOUT$
wininet.dll
HttpSendRequestA
HttpSendRequestW
HttpSendRequestExA
HttpSendRequestExW
L Ú´
\Documents and Settings\All Users\DRM
\Documents and Settings\All Users\DRM
\Documents and Settings\All Users\Application Data
\ProgramData
\ProgramData
\ProgramData
\ProgramData
IsWow64Process
kernel32
~MHZ
HARDWARE\DESCRIPTION\SYSTEM\CENTRALPROCESSOR\0
QueryFullProcessImageNameW
kernel32
\SystemRoot\
\??\
\VarFileInfo\Translation
\StringFileInf
@kVI2Ý8
NTDLL.DLL
WTSGetActiveConsoleSes
0
Ùëú
WTSQueryUserToken
%windir%\explorer.exe
%AUTO%\X
X
X
X
%windir%\system32
%sªBb
%windir%\system32\msiexec.exe
127.0.0.1
127.0.0.1
127.0.0.1
127.0.0.1
TEST
X
X
XXXXXXXX
HTTP://
DnsFr
Proxy-Auth: 
Proxy-Authorization: Basic 
GET 
POST 
CONNECT 
HTTP://
Proxy-Auth: 
Proxy-Authorization: Basic 
CONNECT %s:%d HTTP/1.1  
Content
Content-Type: text/html  
Proxy-Authorization: Basic
Proxy-Connection: Keep-Alive
HTTP/1.0 200 
HTTP/1.1 200 
http
socks
%s=%s:%d
*/*
/%p%p%p
GET
G7: 
Mozilla/4.0 (compatible; MSIE 
IE
SOFTWARE\Microsoft\Internet Explorer\Version Vector
; Windows NT %d.%d
SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform
SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform
SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform
SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\User Agent\Post Platform

&lt;/pre&gt;
  &lt;p id=&quot;RygC&quot;&gt;Конфигурация основного модуля PlugX расшифровывается по алгоритму расшифрования строк (DecryptString_15d7), описанному выше и с полученным данными выполняется декомпресия (RtlDecompressBuffer). В конфигурации по умолчанию указан управляющий сервер &lt;code&gt;45.76.211.18&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;qUm1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a7/3f/a73f53c5-4371-468e-9293-f7dd4bb51835.png&quot; width=&quot;519&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TyNa&quot;&gt;Также в модуле присутствует возможность загрузки конфигурации модуля из файла, расположенного в домашнем каталоге вредоноса.&lt;/p&gt;
  &lt;p id=&quot;8uum&quot;&gt;После расшифрования конфигурации начинается процесс выполнения. Запущенному процессу добавляются привиллегии SeTcbPrivilege (действует как часть операционной системы), SeDebugPrivilege (позволяет получить доступ к любому процессу или потоку). Далее создается новый поток, в котором выполняются дальнейшие действия.&lt;/p&gt;
  &lt;p id=&quot;nCnF&quot;&gt;В модуле присутствует функция генерации строк.&lt;/p&gt;
  &lt;pre id=&quot;2AMr&quot;&gt;int __usercall GenerateString@&amp;lt;eax&amp;gt;(unsigned int a1@&amp;lt;eax&amp;gt;, int a2, int a3)
{
  UINT (__stdcall *GetSystemDirectoryW)(LPWSTR, UINT); // eax
  HMODULE v5; // eax
  BOOL (__stdcall *ProcAddress)(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD); // eax
  HMODULE v7; // eax
  DWORD v8; // eax
  int v9; // ecx
  int v10; // edi
  int v11; // eax
  __int16 v13[3]; // [esp+10h] [ebp-250h] BYREF
  __int16 v14; // [esp+16h] [ebp-24Ah]
  __int16 name[34]; // [esp+210h] [ebp-50h] BYREF
  int v16; // [esp+254h] [ebp-Ch] BYREF
  int v17; // [esp+258h] [ebp-8h] BYREF
  unsigned int v18; // [esp+25Ch] [ebp-4h] BYREF

  GetSystemDirectoryW = (UINT (__stdcall *)(LPWSTR, UINT))dword_1002C87C;
  if ( !dword_1002C87C )
  {
    v5 = (HMODULE)sub_100016FC();
    GetSystemDirectoryW = (UINT (__stdcall *)(LPWSTR, UINT))GetProcAddress(v5, &amp;quot;GetSystemDirectoryW&amp;quot;);
    dword_1002C87C = (int)GetSystemDirectoryW;
  }
  GetSystemDirectoryW((LPWSTR)v13, 512);
  v14 = 0;
  ProcAddress = (BOOL (__stdcall *)(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD))dword_1002C5F4;
  if ( !dword_1002C5F4 )
  {
    v7 = (HMODULE)sub_100016FC();
    ProcAddress = (BOOL (__stdcall *)(LPCWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD))GetProcAddress(v7, &amp;quot;GetVolumeInformationW&amp;quot;);
    dword_1002C5F4 = (int)ProcAddress;
  }
  if ( ProcAddress((LPCWSTR)v13, (LPWSTR)v13, 512, &amp;amp;v18, (LPDWORD)&amp;amp;v17, (LPDWORD)&amp;amp;v16, (LPWSTR)v13, 512) )
    v8 = 0;
  else
    v8 = sub_1000157A();
  if ( v8 )
    v18 = a1;
  else
    v18 ^= a1;
  v9 = (v18 &amp;amp; 0xF) + 3;
  LOWORD(v10) = 0;
  HIWORD(v10) = 0;
  if ( v9 &amp;gt; 0 )
  {
    do
    {
      v11 = v18 &amp;lt;&amp;lt; 7;
      name[v10++] = v18 % 0x1A + 97;
      v18 = 8 * (v11 - (v18 &amp;gt;&amp;gt; 3) + 20140121) - ((v11 - (v18 &amp;gt;&amp;gt; 3) + 20140121) &amp;gt;&amp;gt; 7) - 20140121;
    }
    while ( v10 &amp;lt; v9 );
  }
  name[v9] = 0;
  string_wcopy(a2, a3);
  string_wconcat(a2, (int)name);
  return 0;
}
&lt;/pre&gt;
  &lt;p id=&quot;dxb1&quot;&gt;Она предназначена для создания обновленного файла конфигурации, а также при создании мьютекса &lt;code&gt;Global\\%p%p%p&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;svkF&quot;&gt;В модуле присутствует код закрепления в системе с помощью создания службы, имя службы указано в конфигурации модуля. Но в текущей конфгурации модуля парметров закрепления не обнаружено.&lt;/p&gt;
  &lt;p id=&quot;82lR&quot;&gt;Для установления связи с управляющим сервером используются WinAPI функции HttpOpenRequestA, HttpAddRequestHeadersA,HttpSendrequestHeadersA, InternetReadFile. В заголовок добавляется значение &lt;code&gt;G7:&amp;lt;Base64(DecryptString(data))&amp;gt;&lt;/code&gt; зашифрованных по алгоритму шифрования строк и закодированных в Base64. Трафик в теле ответа шифруется по тому же алгоритму, что и строки. Содердимое запроса на управляющий сервер представлена ниже.&lt;/p&gt;
  &lt;pre id=&quot;xzEV&quot;&gt;GET /D203C2D94728FF89BC4E3C39 HTTP/1.1
Accept: */*
G7: Lx/fXCz8J4qfquNfy6wK4pcupeE=
User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.2; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)
Host: 45.76.211.18:443
Connection: Keep-Alive
Cache-Control: no-cache
&lt;/pre&gt;
  &lt;h2 id=&quot;clCr&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;jU2K&quot;&gt;Мы с вами разобрали модуль семейства PlugX, расшифровали основную нагрузку, в которой заменена сигнатура MZ и PE на XV. Разобрали алгоритм расшифрования строк, а также конфигурацию модуля.&lt;/p&gt;

</content></entry><entry><id>threathunt_pedia:EBYsz4Z_DOU</id><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia/EBYsz4Z_DOU?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><title>Исследование Badger BRC4</title><published>2024-01-19T13:36:17.277Z</published><updated>2024-02-08T17:47:29.340Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a7/5f/a75f9662-f928-48ad-bb7d-3d660e07efa5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/15/cc/15ccd261-616d-4ad6-bf0c-f4439cc4fbb3.png&quot;&gt;Сегодня проанализируем шелл-код Badger Brute Ratel C4, файл. Проведем динамичесий и статический анализ вредоносного кода, восстановим алгоритм декодирования функций (API Hashing), расшифруем полезную нагрузку и конфигурацию модуля.</summary><content type="html">
  &lt;p id=&quot;ckNM&quot;&gt;Сегодня проанализируем шелл-код Badger Brute Ratel C4, &lt;a href=&quot;https://bazaar.abuse.ch/sample/4f88738e04447344100bb9532c239032b86e71d8037ccb121e2959f37fff53cf/&quot; target=&quot;_blank&quot;&gt;файл&lt;/a&gt;. Проведем динамичесий и статический анализ вредоносного кода, восстановим алгоритм декодирования функций (API Hashing), расшифруем полезную нагрузку и конфигурацию модуля.&lt;/p&gt;
  &lt;p id=&quot;x3fP&quot;&gt;Больше информации об информационной безопасности, реверсу малвари и расследованию инцидентов в канале &lt;a href=&quot;https://t.me/threathunt_pedia&quot; target=&quot;_blank&quot;&gt;https://t.me/threathunt_pedia&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;UgWb&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;0Xot&quot;&gt;Используемые утилиты:&lt;/h2&gt;
  &lt;ol id=&quot;qtAu&quot;&gt;
    &lt;li id=&quot;gn92&quot;&gt;&lt;a href=&quot;https://github.com/OALabs/BlobRunner&quot; target=&quot;_blank&quot;&gt;Blobrunner&lt;/a&gt; - инструмент для отладки шелл-кода.&lt;/li&gt;
    &lt;li id=&quot;dfeL&quot;&gt;&lt;a href=&quot;https://github.com/mandiant/speakeasy&quot; target=&quot;_blank&quot;&gt;SpeakEasy&lt;/a&gt; - эмулятор, предназначенный для эмуляции вредоносных программ ядра и пользовательского режима Windows.&lt;/li&gt;
    &lt;li id=&quot;QxrL&quot;&gt;&lt;a href=&quot;https://github.com/NationalSecurityAgency/ghidra&quot; target=&quot;_blank&quot;&gt;Ghidra&lt;/a&gt; - это платформа обратного проектирования программного обеспечения (SRE)/&lt;/li&gt;
    &lt;li id=&quot;VZ37&quot;&gt;&lt;a href=&quot;https://hex-rays.com/ida-pro/&quot; target=&quot;_blank&quot;&gt;IDA Pro&lt;/a&gt; - инструмент для анализа двоичного кода.&lt;/li&gt;
    &lt;li id=&quot;r8cM&quot;&gt;&lt;a href=&quot;https://github.com/x64dbg/x64dbg&quot; target=&quot;_blank&quot;&gt;x64Debug&lt;/a&gt; - бинарный отладчик с открытым исходным кодом для Windows&lt;/li&gt;
    &lt;li id=&quot;NVuP&quot;&gt;&lt;a href=&quot;https://github.com/horsicq/Detect-It-Easy&quot; target=&quot;_blank&quot;&gt;Die&lt;/a&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;XCa9&quot;&gt;Исследование шелл-кода&lt;/h2&gt;
  &lt;p id=&quot;ouri&quot;&gt;Для статического анализа шелл-кода будем использовать Ghidra. Испортируем файл и выберем компилятор.&lt;/p&gt;
  &lt;figure id=&quot;BNCP&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/15/cc/15ccd261-616d-4ad6-bf0c-f4439cc4fbb3.png&quot; width=&quot;489&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vkhn&quot;&gt;Выбираем x86 архитектуру, 64 разрядный процесс и компилятор gcc. Если код не преобразовался, то нажмем горячую клавишу &lt;code&gt;D&lt;/code&gt; или &lt;code&gt;Правая клавиша мыши-&amp;gt;Disassemble&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;Vw7v&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4c/3e/4c3eef9d-f8ee-4ff0-90ef-83badf373ea2.png&quot; width=&quot;495&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;cdIB&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/44/a7/44a7f3f7-64ac-4867-861e-560e6aabef97.png&quot; width=&quot;374&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qcOf&quot;&gt;Командами &lt;code&gt;PUSH&lt;/code&gt; в стек складывается большой объем данных. Спустимся по коду ниже и разберем дальнейшие действия шелл-кода.&lt;/p&gt;
  &lt;figure id=&quot;n115&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cb/e2/cbe202a7-3efd-42af-809e-c10c1ddb2ff6.png&quot; width=&quot;388&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cOei&quot;&gt;Начнем проводить динамический анализ шелл-кода, чтобы подробнее разобрать реализию, запустим blobrunner.&lt;/p&gt;
  &lt;p id=&quot;d1FO&quot;&gt;&lt;code&gt;blobrunner64.exe 4f88738e04447344100bb9532c239032b86e71d8037ccb121e2959f37fff53cf.unknown&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;yITy&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/88/07/88078acb-8de7-4515-82b0-838d4c765e37.png&quot; width=&quot;961&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gks7&quot;&gt;Помним, что мы отлаживаем x64 разрядный шелл-код, поэтому нам необходимо в x64dbg поставить точку останова на потоке с идентификатором, указаном в строке &lt;code&gt;Created Thread:&lt;/code&gt; утилиты Blobrunner. Присоединяемся к созданному процессу, ставим точку останова и начинаем отлаживать код.&lt;/p&gt;
  &lt;figure id=&quot;mGGq&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/be/0d/be0d47d8-fccf-42fd-a677-bdf8527bf94d.png&quot; width=&quot;380&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;I2Tc&quot;&gt;аходим в функцию &lt;code&gt;13a69d944d7&lt;/code&gt; (Горячая клавиша F7 в x64dbg).&lt;/p&gt;
  &lt;figure id=&quot;iQSt&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4b/33/4b334a30-7ba7-45c2-88c2-c565c7d25e0f.png&quot; width=&quot;464&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;uTXU&quot;&gt;Спускаемся ниже и видим вызов функции &lt;code&gt;call 13a69d93e67&lt;/code&gt;, на вход ей поступает значение &lt;code&gt;0x3e192526&lt;/code&gt;. Зайдем в данную функцию.&lt;/p&gt;
  &lt;p id=&quot;v9aE&quot;&gt;В данной функции реализована следующая логика. Получение адреса динамической библиотеки ntdll.dll, далее адреса всех функций экспорта, следующим этапом имя экспортируемой функции подается на вход &lt;code&gt;call 13a69d94557&lt;/code&gt; для расчета хэш-значения.&lt;/p&gt;
  &lt;figure id=&quot;Xr6I&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c0/f4/c0f42fce-cd4b-4264-813a-8afcb09e69c3.png&quot; width=&quot;709&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1fz7&quot;&gt;Полученное хэш-значение сравнивается со значением &lt;code&gt;0x3e192526&lt;/code&gt;. Разберем алгоритм хэширования и напишем его алгоритм на Python3. Для этого зайдем в функцию &lt;code&gt;13a69d94557&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;f2pu&quot;&gt;Код реализации хэширования представлен ниже.&lt;/p&gt;
  &lt;figure id=&quot;zWz0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bc/41/bc41d9a5-db1c-4592-be7a-bcfd58613476.png&quot; width=&quot;556&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;jPY7&quot;&gt;Имя экспортированной функции из динамической библиотеки по байтово складывается с общей суммой, которая преобразуется по алгоритму ror13.&lt;/p&gt;
  &lt;pre id=&quot;7hBc&quot;&gt;def hash_api_brc4(name_api):
    sum = 0
    for i in  name_api:
        c = ord(i)
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff) + c) &amp;amp;0xffffffffffffffff
    return hex(sum)
&lt;/pre&gt;
  &lt;p id=&quot;Nzbs&quot;&gt;В Ghidra найдем все хэш-значения и преобразуем их. Горячей клавишей &lt;code&gt;;&lt;/code&gt; можно добавить комментарий к строке в дизассемблере.&lt;/p&gt;
  &lt;pre id=&quot;atsd&quot;&gt;kernel32.dll-&amp;gt;GetProcAddress  0x7c0dfcaa
kernel32.dll-&amp;gt;LoadLibraryA 0xec0e4e8e
kernel32.dll-&amp;gt;WaitForSingleObject 0xce05d9ad
ntdll.dll-&amp;gt;LdrGetDllHandleEx 0xec6b915d
ntdll.dll-&amp;gt;LdrGetProcedureAddress 0xe54cc407
ntdll.dll-&amp;gt;NtAllocateVirtualMemory 0xd33bcabd
ntdll.dll-&amp;gt;NtFlushInstructionCache 0x534c0ab8
ntdll.dll-&amp;gt;NtProtectVirtualMemory 0x8c394d89
ntdll.dll-&amp;gt;RtlAllocateHeap 0x3e192526
ntdll.dll-&amp;gt;RtlFreeHeap 0xda12b8
ntdll.dll-&amp;gt;NtAllocateVirtualMemory 0xd33bcabd
ntdll.dll-&amp;gt;RtlAllocateHeap 0x3e192526
ntdll.dll-&amp;gt;RtlFreeHeap 0xda12b8
&lt;/pre&gt;
  &lt;p id=&quot;GRmL&quot;&gt;Значение хэш-суммы 0x3e192526 соответствует функции RtlAllocateHeap.&lt;/p&gt;
  &lt;p id=&quot;XSN1&quot;&gt;В функции &lt;code&gt;13a69d944d7&lt;/code&gt; реализован алгоритм выделения кучи с помощью функции RtlAllocateHeap и копирование полезной нагрузки размером 0x39410 из стека в выделенную оласть памяти.&lt;/p&gt;
  &lt;figure id=&quot;yEcc&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/48/98/4898e1b5-a7a9-4ae4-8113-9fcbc22b4f2a.png&quot; width=&quot;579&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7ksO&quot;&gt;Во втором выполнении функции&lt;code&gt;13a69d944d7&lt;/code&gt; копируется закодированная Base64 конфигурация модуля размером 0x13c в выделенную область кучи.&lt;/p&gt;
  &lt;figure id=&quot;DzO3&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7d/33/7d3361d9-118d-4162-8e9c-d3044731e24d.png&quot; width=&quot;578&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KnpQ&quot;&gt;Далее проанализируем функцию &amp;#x60;call 13A69D94587&amp;#x60;, в которой реализован основной функционал по расшифрованию и запуску основной нагрузки.&lt;/p&gt;
  &lt;p id=&quot;gDEf&quot;&gt;В данной функции происходит получение адресов функций: RtlFreeHeap, NtProtectVirtualMemory, LdrGetHandleEx, LdrGetProcedureAddress.&lt;/p&gt;
  &lt;p id=&quot;l1co&quot;&gt;Спустимся ниже и увидим еще одно константное значение 0x6a4abc5b, которое поступает на вход функции &amp;#x60;...f97&amp;#x60;. Расмотрим его подробнее.&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;Jxae&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/1e/c11e61fc-a2d4-433e-b015-1280643c7e54.png&quot; width=&quot;545&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nw9G&quot;&gt;Код функции хэширования имени DLL библиотеки.&lt;/p&gt;
  &lt;figure id=&quot;Bwc9&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3e/11/3e11c9ed-02b9-4798-8400-27d18888900b.png&quot; width=&quot;441&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;H0PE&quot;&gt;В данной функции реализован алгоритм хэширования имени DLL библиотеки. Напишем его на Python3.&lt;/p&gt;
  &lt;pre id=&quot;4q2z&quot;&gt;def dll_hashing(name_dll):
    sum = 0
    for i in name_dll:
        c = ord(i)
        if c &amp;gt;= 0x61:
            c -= 0x20
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff) + c) &amp;amp;0xffffffffffffffff
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff)) &amp;amp;0xffffffffffffffff
    return sum
&lt;/pre&gt;
  &lt;p id=&quot;8nE6&quot;&gt;Функция 0x6a4abc5b является хэш значением динамической библиотеки KERNEL32.DLL.&lt;/p&gt;
  &lt;p id=&quot;ImjQ&quot;&gt;Далее с помощью функции LdrGetDllHandleEx загружает динамическую функцию Kernel32.dll.&lt;/p&gt;
  &lt;p id=&quot;WgDQ&quot;&gt;Следующим этапом начинается процесс расшифрования полезной нагрузки Badger BRC3 в функции &lt;code&gt;call 13a69d948a7&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;RnUg&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/60/d5602bc3-5798-4511-8c27-c83c9864e26d.png&quot; width=&quot;421&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QLF9&quot;&gt;Увидев код ниже, который представляет собой алгоритм расширения ключа, можно сделать вывод, что нагрузка зашифрована RC4.&lt;/p&gt;
  &lt;figure id=&quot;W7XM&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7b/c5/7bc5378a-c455-498a-aeaf-23667135b02d.png&quot; width=&quot;442&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Q4Cz&quot;&gt;В качестве ключа передаются последние 8 байтов скопированной полезной нагрузки. Ключ равен &lt;code&gt;23 64 66 26 2F 61 2E 65&lt;/code&gt;. Расшифруем полезную нагрузку.&lt;/p&gt;
  &lt;figure id=&quot;73UH&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1f/c0/1fc09923-0573-40b9-bd50-cecad04169ad.png&quot; width=&quot;1247&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;JAG2&quot;&gt;В итоге получили PE файл с удаленной MZ сигнатурой.&lt;/p&gt;
  &lt;p id=&quot;LtXr&quot;&gt;Далее полученный код загружается в процесс методом &lt;a href=&quot;https://www.ired.team/offensive-security/code-injection-process-injection/reflective-dll-injection&quot; target=&quot;_blank&quot;&gt;ReflectiveDLLInjection&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;WZei&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/29/9c/299c025b-c6f8-4f7b-afbb-947c31f29cf5.png&quot; width=&quot;515&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rRlA&quot;&gt;Код расшифрования файла конфигурации расположен в основной DLL Badger. Но не много опишу его тут.&lt;/p&gt;
  &lt;p id=&quot;hEtp&quot;&gt;Конфигурация расположена в Base64 данных, зашифрованных по алгоритму RC4. Ключом является предпоследние 8 байтов расшифрованной полезной нагрузки DLL Badger BRC4. Последние 8 байт это зашифрованный ключ расшифрования полезной нагрузки, тот что мы получили на предыдущем шаге.&lt;/p&gt;
  &lt;figure id=&quot;gSdl&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/b7/95b71038-a075-4abb-89f0-267ac8baf722.png&quot; width=&quot;602&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9ZlE&quot;&gt;Расшифруем с помощью утилиты CyberChef.&lt;/p&gt;
  &lt;figure id=&quot;uXJQ&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/98/5998479f-8c4d-4f45-bc56-0dc9ee5ac49b.png&quot; width=&quot;1207&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gRAp&quot;&gt;В конфигурации каждый параметр отделен вертикальной чертой. В выявленном нам конфигурации указан управляющий сервер &lt;code&gt;deve.dread.ie&lt;/code&gt;. Так конфигурация хранится В памяти процесса конфигурация хранится в зашифрованном blob-объекте (RC4+base64), но ключ шифрования для RC4 указан в основной нагрузки DLL Badger BRC4.&lt;/p&gt;
  &lt;p id=&quot;rfTe&quot;&gt;На данном этапе мы с вами разобрали загрузчик основной нагрузки DLL Badger BRC4. Нам удалось разобрать алгоритм хэширования API функций, который схож с реализацией в CobaltStrike. Расшифровали полезную нагрузку, которая представляет из себя DLL без заголовка MZ, а также расшифровали конфигурацию вредоноса.&lt;/p&gt;

</content></entry><entry><id>threathunt_pedia:L5ehCuQJaXQ</id><link rel="alternate" type="text/html" href="https://teletype.in/@threathunt_pedia/L5ehCuQJaXQ?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=threathunt_pedia"></link><title>Исследование Golang дроппера с нагрузкой CobaltStrike</title><published>2024-01-11T19:43:11.111Z</published><updated>2024-02-08T17:46:35.930Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/52/71/5271aa90-7256-4ca6-908f-afaa3cd8bdf9.png"></media:thumbnail><summary type="html">Сегодня мы с вами проведем исследование [вредоносного файла](https://bazaar.abuse.ch/sample/acb0bce25d3edf9c3074dcc1cf7f4e25c10bdfadba049e640f6a7ec4590b5f10/), представляющий собой Golang дроппер. Основная задача исследуемого модуля установка шелл-кода CobaltStrike.  Мы с вами научимся проводить динамический и статичесикй анализ, разберем алгоритм хэширования API функций и разработаем собственный декодер на Python3.</summary><content type="html">
  &lt;p id=&quot;fm5d&quot;&gt;Сегодня мы с вами проведем исследование &lt;a href=&quot;https://bazaar.abuse.ch/sample/acb0bce25d3edf9c3074dcc1cf7f4e25c10bdfadba049e640f6a7ec4590b5f10/&quot; target=&quot;_blank&quot;&gt;вредоносного файла&lt;/a&gt;, представляющий собой Golang дроппер. Основная задача исследуемого модуля установка шелл-кода CobaltStrike. Мы с вами научимся проводить динамический и статичесикй анализ, разберем алгоритм хэширования API функций и разработаем собственный декодер на Python3.&lt;/p&gt;
  &lt;h2 id=&quot;uwmw&quot;&gt;Используемые утилиты:&lt;/h2&gt;
  &lt;ol id=&quot;hPkz&quot;&gt;
    &lt;li id=&quot;oSI8&quot;&gt;&lt;a href=&quot;https://github.com/OALabs/BlobRunner&quot; target=&quot;_blank&quot;&gt;Blobrunner&lt;/a&gt; - инструмент для отладки шелл-кода.&lt;/li&gt;
    &lt;li id=&quot;KmeL&quot;&gt;&lt;a href=&quot;https://github.com/mandiant/speakeasy&quot; target=&quot;_blank&quot;&gt;SpeakEasy&lt;/a&gt; - эмулятор, предназначенный для эмуляции вредоносных программ ядра и пользовательского режима Windows.&lt;/li&gt;
    &lt;li id=&quot;fQ6g&quot;&gt;&lt;a href=&quot;https://github.com/NationalSecurityAgency/ghidra&quot; target=&quot;_blank&quot;&gt;Ghidra&lt;/a&gt; - это платформа обратного проектирования программного обеспечения (SRE)/&lt;/li&gt;
    &lt;li id=&quot;EVZm&quot;&gt;&lt;a href=&quot;https://hex-rays.com/ida-pro/&quot; target=&quot;_blank&quot;&gt;IDA Pro&lt;/a&gt; - инструмент для анализа двоичного кода.&lt;/li&gt;
    &lt;li id=&quot;ZwCv&quot;&gt;&lt;a href=&quot;https://github.com/x64dbg/x64dbg&quot; target=&quot;_blank&quot;&gt;x64Debug&lt;/a&gt; - бинарный отладчик с открытым исходным кодом для Windows&lt;/li&gt;
    &lt;li id=&quot;jLnr&quot;&gt;&lt;a href=&quot;https://github.com/horsicq/Detect-It-Easy&quot; target=&quot;_blank&quot;&gt;Die&lt;/a&gt;.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;32o1&quot;&gt;Информация об исполняемом файле&lt;/h2&gt;
  &lt;p id=&quot;wAbj&quot;&gt;Первоначально получим инфорамацию об исполняемом файле, для этого загрузим в утилиту Die.&lt;/p&gt;
  &lt;figure id=&quot;RB3J&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/45/a9/45a919f2-f51f-4f7e-92fe-f9faed80a013.png&quot; width=&quot;926&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;1ZTE&quot;&gt;Исследование дроппера&lt;/h2&gt;
  &lt;p id=&quot;N2im&quot;&gt;При исследования файлов на Go возникает множество трудностей: потерянные имена функций, нераспознанные строки в файле. Проблем анализа бинарных файлов на Go описаны в статье &lt;a href=&quot;https://habr.com/en/articles/758310&quot; target=&quot;_blank&quot;&gt;Реверс бинарных файлов Golang с использованием Ghidra. Часть 1&lt;/a&gt; . Для решения данных проблем разработана коллекция скриптов &lt;a href=&quot;https://github.com/SentineLabs/AlphaGolang&quot; target=&quot;_blank&quot;&gt;AlphaGolang&lt;/a&gt; для IDA Pro 7.6 и &lt;a href=&quot;https://github.com/getCUJO/ThreatIntel/tree/master/Scripts/Ghidra&quot; target=&quot;_blank&quot;&gt;Ghidra Script&lt;/a&gt; для Ghidra.&lt;/p&gt;
  &lt;p id=&quot;ibqj&quot;&gt;Загрузим вредонос в IDA Pro x64 и проведем его статичесский анализ. На вкладке &lt;code&gt;Function&lt;/code&gt; находим функцию &lt;code&gt;main.main&lt;/code&gt; и приступаем к анализу.&lt;/p&gt;
  &lt;figure id=&quot;CTT8&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/59/8659a00d-a4a6-456a-bd99-d7f1da92b67c.png&quot; width=&quot;1364&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;vbBK&quot;&gt;На вкладке псевдокод, сгенерированный Hex Rays можно увидеть строку &lt;code&gt;LeslieCheungKwok&lt;/code&gt;, декодирование данных из Base 64 и функцию &lt;code&gt;main_DecrptogAES&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;DLev&quot;&gt;Посмотрим содержимое функции &lt;code&gt;main_DecrptogAES&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;65ip&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a3/88/a38815f9-5f76-422d-b805-640b1a94b986.png&quot; width=&quot;698&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8ddm&quot;&gt;Также содежимое полезной нагрузки.&lt;/p&gt;
  &lt;figure id=&quot;fMnT&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/47/1c/471c2b91-9b7e-4960-bf0f-cabcb8471248.png&quot; width=&quot;747&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yn6D&quot;&gt;Вышеописанные участок кода расшифровывает полезную нагрузку по следующему алгоритму: дкодирование из Base64, далее расшифрования по алгоритму AES в режиме CBC, ключ и вектор инициализации равен &lt;code&gt;LeslieCheungKwok&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;bah9&quot;&gt;Расшифруем полезную нагрузку и проанализруем полученный шелл-код, размером 1600 байт, для этого воспользуемся утилитой CyberChef.&lt;/p&gt;
  &lt;figure id=&quot;s5gV&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d6/59/d6597717-afeb-440c-a1d5-fdaf36d20100.png&quot; width=&quot;1528&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3hUL&quot;&gt;Далее в функции &lt;code&gt;main_build&lt;/code&gt; происходит запуск расшифрованного шелл-кода с помощью Golang пакета Syscal.&lt;/p&gt;
  &lt;figure id=&quot;rIrS&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b2/5e/b25eb071-3c91-4cfa-af4d-f5d3c5db94fe.png&quot; width=&quot;523&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;2fnr&quot;&gt;Анализ шелл-кода CobaltStrike&lt;/h2&gt;
  &lt;p id=&quot;NpRX&quot;&gt;После получения шелл-кода определим его функциональность с помощью утилиты SpeakEasy. Сохраним результат отчета в файл mem.zip.&lt;/p&gt;
  &lt;p id=&quot;awp8&quot;&gt;&lt;code&gt;speakeasy -t cobalt.sc -r -a x64 -d mem.zip&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;qksW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/e8/8ae86702-5e13-4935-8641-7cada30eef75.png&quot; width=&quot;1545&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AMbV&quot;&gt;Основная задача вредоносного кода загрузка полезной нагрузки с управляющего сервера &lt;code&gt;124.221.100.99&lt;/code&gt;. Взглянем глубже на шелл-код, проведем его динамический и статический анализ.&lt;/p&gt;
  &lt;p id=&quot;98Cp&quot;&gt;Проведем статический анализ шелл-кода в Ghidra. Импортируем файл в наш проект, далее выбираем архитектуру, компилятор и порядок байт.&lt;/p&gt;
  &lt;figure id=&quot;NufN&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/d9/2dd99da7-03e9-4094-a1a6-d1011985a719.png&quot; width=&quot;492&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;twUj&quot;&gt;Код будет представлять байтовую последовательность, нам необходимо его преобразовать в ассемблерные инструкции, для этого нажмем горячую клавишу &lt;code&gt;D&lt;/code&gt; или Правая клавиша мыши-&amp;gt;Disassemble.&lt;/p&gt;
  &lt;figure id=&quot;BABX&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/d2/0bd29e4e-da7f-45f7-af85-5a06bb83db9c.png&quot; width=&quot;405&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hUfE&quot;&gt;Все вызовы функций в шелл-коде будут выполнятся посредством хэширования API. Функция поиска хэша функции выполняется в инструкции &lt;code&gt;call RBP&lt;/code&gt;. Восстановим алгоритм хэширования с помощью динамического анализа. Для этого нам понадобится blobrunner.64exe и x64dbg.&lt;/p&gt;
  &lt;p id=&quot;oocX&quot;&gt;Запускаем blobrunner64.exe.&lt;/p&gt;
  &lt;p id=&quot;kcrM&quot;&gt;&lt;code&gt;blobrunner64.exe cobalt.cs&lt;/code&gt;&lt;/p&gt;
  &lt;figure id=&quot;SZz1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/47/a4/47a4c2fc-b7bd-4abc-83c5-716fc5fcc42e.png&quot; width=&quot;790&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RTVD&quot;&gt;Для поддержки отладки x64 шелл-кода загрузчик Blobrunner создает приостановленный поток, в нашем случае его идентификатор 6092.&lt;/p&gt;
  &lt;p id=&quot;X4R9&quot;&gt;Далее открываем x64dbg, нажимаем на вкладку Файл-&amp;gt;Присоединиться и выбираем процесс blobrunner64.exe.&lt;/p&gt;
  &lt;p id=&quot;m9Ni&quot;&gt;В отладчике x64dbg переходим во вкладку Потоки и ставим точку останова на вход потока с идентификатором 6092. Не забываем, что идентификатор и точка входа при новом запуске будет разный. Далее при запуске Blobrunner64 нажимаем на любую клавишу и в x64dbg попадем на точку входа шелл-кода.&lt;/p&gt;
  &lt;figure id=&quot;kSjO&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/4f/d54f7e23-f58c-46d0-a96c-bfe30d29db8d.png&quot; width=&quot;543&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;i7Yd&quot;&gt;Нам необходимо зайти в функцию &lt;code&gt;call rbp&lt;/code&gt;, как видно из рисунка на вход подается хэш сумма 0x726774c.&lt;/p&gt;
  &lt;p id=&quot;egNL&quot;&gt;Первое что приосходит это формирование константы от имени dll функции.&lt;/p&gt;
  &lt;figure id=&quot;UNyD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/db/1f/db1fd844-0834-45b5-bfa3-a298c5441d4c.png&quot; width=&quot;144&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gs4F&quot;&gt;Следующим этапом имя экспортированной функции из динамической библиотеки по байтово преобразуется по алгоритму ror13 и сумируется.&lt;/p&gt;
  &lt;figure id=&quot;yfdI&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/4f/d54f7e23-f58c-46d0-a96c-bfe30d29db8d.png&quot; width=&quot;543&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LCha&quot;&gt;Напишем алгоритм хэширования API функций Cobalt Strike на Python.&lt;/p&gt;
  &lt;pre id=&quot;B7uL&quot;&gt;def generate_const(name_dll):
    sum = 0
    for i in name_dll:
        c = ord(i)
        if c &amp;gt;= 0x61:
            c -= 0x20
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff) + c) &amp;amp;0xffffffffffffffff
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff)) &amp;amp;0xffffffffffffffff
    sum = (ror(sum,0xd,max_bits)&amp;amp;0xffffffffffffffff )
    sum = (ror(sum,0xd,max_bits)&amp;amp;0xffffffffffffffff )
    return sum

def hash_api_cs(name_api,name_dll):
    const_ = generate_const(name_dll)
    sum = 0
    for i in  name_api:
        c = ord(i)
        sum = ((ror(sum,0xd,max_bits) &amp;amp; 0xffffffffffffffff) + c) &amp;amp;0xffffffffffffffff
    sum = (ror(sum,0xd,max_bits)&amp;amp;0xffffffffffffffff )
    sum =  (sum + const_) &amp;amp; 0xffffffff
    return hex(sum)
&lt;/pre&gt;
  &lt;p id=&quot;IUzK&quot;&gt;Преобразуем все хэши функций.&lt;/p&gt;
  &lt;pre id=&quot;KrH3&quot;&gt;ExitProcess 0x56a2b5f0
VirtualAlloc 0xe553a458
HttpOpenRequestA 0x3b2e55eb
HttpSendRequestA 0x7b18062d
InternetConnectA 0xc69f8957
InternetOpenA 0xa779563a
InternetReadFile 0xe2899612
&lt;/pre&gt;
  &lt;h2 id=&quot;cge7&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;gc56&quot;&gt;При разборе данной малвари мы с вами расшифровали полезную нагрузку, научились отлаживать шелл-код с помощью утилиты blobrunner, написали декодер хэш-сумм используемых API функций.&lt;/p&gt;

</content></entry></feed>