Упаковщик: отсутствует
Даты компиляции:
- 11:22:57 16.11.2017 (версия для архитектуры x86)
- 11:22:54 16.11.2017 (версия для архитектуры x64)
SHA1-хеши:
- b6fba9877ad79ce864d75b91677156a33a59399e (x86)
- 8cc16ad99b40ff76ae68d7b3284568521e6413d9 (x64)
Описание
Trojan.XPath.2 представляет собой драйвер многофункционального бэкдора XPath. Имеет две версии — как для 32-разрядных, так и для 64-разрядных операционных систем семейства Microsoft Windows. Задача компонента — внедрение загрузчика полезной нагрузки в процесс lsass.exe, а также фильтрация трафика.
Принцип действия
В качестве установщика драйвера выступает Trojan.XPath.1.
Работа в ОС Windows, начиная с версии Vista и выше, основана на исходном коде WinDivert версии в промежутке 1.1 (30.06.2013) - 1.2 (17.07.2015).
Работа в ОС Windows, начиная с Windows 2000 и до версии Vista, основана на исходном коде WinPcap.
Драйверы имеют следующие цифровые подписи:
CN = Anhua Xinda (Beijing) Technology Co., Ltd.
OU = Digital ID Class 3 - Microsoft Software Validation v2
O = Anhua Xinda (Beijing) Technology Co., Ltd.
L = Beijing
S = Beijing
C = CN
CN = 长沙马沙电子科技有限公司
O = 长沙马沙电子科技有限公司
L = 长沙市
S = 湖南省
C = CN
Троян получает адреса необходимых функций из файла NDIS.SYS:
Затем проверяет, какой из имеющихся модулей — hal.dll, halmacpi.dll или halacpi.dll — был загружен, и получает из него адреса нескольких функций:
Далее проверяется загрузка модуля ntdll.dll. Если он не загружен, Trojan.XPath.2 самостоятельно отображает файл в память, после чего получает адреса необходимых функций:
После этого создает устройство \\Device\\test1 и символическую ссылку \\DosDevices\\test1.
Через PsSetCreateProcessNotifyRoutine устанавливает функцию обратного вызова, в которой отслеживает создание процесса lsass.exe. Как только такой процесс запускается, читает модуль загрузчика (Trojan.XPath.3) из реестра [\\registry\\machine\\SOFTWARE\\Microsoft\\LoginInfo] 'DirectDraw'. Затем распаковывает его и внедряет в процесс lsass.exe. В 64-битной версии драйвера внедрение кода происходит через функцию PsSetLoadImageNotifyRoutine.
Программа ожидает, пока не сможет открыть \\Systemroot\\explorer.exe, после чего через IoCreateDriver создает драйвер \\FileSystem\\FsBaiduHips.
Прописывает следующие значения в реестре:
- [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\yyyyyyyyGoogle] 'Group' = "Boot Bus Extender";
- [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\yyyyyyyyGoogle] 'DependOnService' = "FltMgr";
- [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\yyyyyyyyGoogle\\Instances] 'DefaultInstance' = 'yyyyyyyyGoogle Instance';
- [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\yyyyyyyyGoogle\\Instances\\yyyyyyyyGoogle Instance] 'Altitude' = '399999';
- [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\yyyyyyyyGoogle\\Instances\\yyyyyyyyGoogle Instance] 'Flags' = '00000000'.
Далее пытается зарегистрироваться в качестве мини-фильтра. Если функция FltRegisterFilter возвращает ошибку STATUS_FLT_INSTANCE_ALTITUDE_COLLISION, то программа уменьшает на единицу значение Altitude, а затем пробует снова.
При регистрации мини-фильтром для IRP_MJ_CREATE устанавливается функция обратного вызова PreOperation:
Для IRP_MJ_QUERY_INFORMATION устанавливается функция обратного вызова:
Для IRP_MJ_DIRECTORY_CONTROL задаются как PreOperation, так и PostOperation функции обратного вызова. С помощью этих четырех функций происходит сокрытие файла драйвера.
Затем создает устройство \\Device\\BaiduHips и символическую ссылку \\DosDevices\\BaiduHips.
Дальнейшее поведение зависит от версии ОС на зараженном компьютере.
BaiduHips (Windows 2000, Windows XP, Windows Server 2003)
Программа регистрирует NDIS-протокол BaiduHips.
Для осуществления функции сетевого экрана драйвер осуществляет перехват функций SendHandler, ReceiveHandler, ReceivePacketHandler, OpenAdapterCompleteHandler:
Установка хуков происходит только после получения IOCTL-кода 0x80000800. После этого программа начинает осуществлять фильтрацию трафика (см. ниже).
BaiduHips (Windows Vista, Windows Server 2008 и выше)
Создает WDF-драйвер, при этом в качестве пути сервиса передает [\\Registry\\Machine\\System\\CurrentControlSet\\Services\\BaiduHips].
Дальнейшая инициализация схожа со стандартной инициализацией WinDivert драйвера. Будет производиться отслеживание трафика, переданного по протоколу IPv4.
Самое важное отличие от стандартного WinDivert состоит в функции windivert_filter, которая осуществляет фильтрацию пакетов (см. ниже).
Firewall
Вторая (помимо запуска полезной нагрузки) главная функция драйвера — это фильтрация трафика. Сетевой экран фильтрует TCP/UDP пакеты, переданные по IPv4.Правила задаются в виде структур:
#pragma pack(push, 1)
struct st_fw_add_tcp
{
_WORD protocol;
_DWORD pid;
_BYTE src_mac[6];
_BYTE dst_mac[6];
_DWORD ack;
_DWORD sn;
_DWORD src_ip;
_DWORD dst_ip;
_WORD src_port;
_WORD dst_port;
};
#pragma pack(pop)
При этом поля src_mac, dst_mac, ack, sn являются необязательными. Стоит отметить, что в зависимости от направления пакета поля будут сравниваться соответствующим образом. Т. е. для обмена пакета в обе стороны между двумя устройствами достаточно одного правила, где адресатом является тот компьютер, на котором работает этот руткит.
Добавление правил сетевого экрана возможно двумя способами:
- через соответствующий IOCTL-код;
- с помощью отправки специально сформированных пакетов по протоколу TCP.
Специальный пакет №1
TCP-пакет со следующими параметрами:
- значение AckNum установлено 0x87ED5409;
- значение SeqNum установлено 0x1243FDEC;
- установлен флаг RST.
При получении такого пакета в сетевой экран вносится правило, разрешающее прохождение трафика с IP-адреса отправителя и порта src_port + 1 до указанного адресата и в обратную сторону.
Специальный пакет №2
Размер TCP-пакета должен быть 32 байта. Первые 4 байта — ключ для расшифровки остальной части данных. Функция дешифровки:
Далее происходит сравнение байтов с 4 по 12 со строкой 1I2#aLeb. При совпадении в сетевой экран вносится правило, разрешающее трафик с IP-адреса и порта отправителя.
Стоит отметить, что процесс TCP Handshake не производится, и флаги игнорируются. Важен лишь размер данных и сами данные.
IOCTL-коды
IOCTL-коды трояна:
- 0x80000800 — установить хуки на сетевых функциях (доступен только на ОС младше Windows Vista);
- 0x80000815 — добавить правило сетевого экрана для протокола TCP;
- 0x80000819 — удалить правило сетевого экрана для протокола TCP;
- 0x8000081D — добавить правило сетевого экрана для протокола UDP;
- 0x80000821 — удалить правило сетевого экрана для протокола UDP;
- 0x80001005 — установить значение двух переменных (не используются).
IOCTL-коды от WinDivert (доступны только на ОС, начиная с версии Vista и выше):
- 0x80002422 — получить перенаправленный (diverted) пакет;
- 0x80002425 — отправить пакет;
- 0x80002429 — начать фильтрацию;
- 0x8000242D — установить уровень;
- 0x80002431 — установить приоритет;
- 0x80002435 — установить флаги;
- 0x80002439 — установить параметр;
- 0x8000243E — получить значение параметра.
Артефакты
Помимо пути до файлов проекта, раскрытого в PDB-путях:
Z:\desk_codes\project_xpath\ObjFile\SecKernel\SecKernel.pdb
Z:\desk_codes\project_xpath\ObjFile\SecKernel64\SecKernel.pdb
в коде присутствуют имена конкретных файлов с исходными кодами трояна:
bwctrl.c
Ndis5.c
Ndis6.c
SecKernel.c
Также присутствуют различные отладочные сообщения:
out of memory2
out of memory3
out of memory4
del tcp pid:%d,%d,%d\n
size not match:%d,%d\n
get:%wZ mac:%02x-%02x-%02x-%02x-%02x-%02x
test my tcp packet,eth len:%d,%d-->%d\n
init drv :%d,%d\n
init drv :%x\n
\C:\InjectIntoProcess crash
\C:\NewProcess crash
\C:\ProcessGone crash
\C:\ProcessCallback crash
\C:\InitDriver crash