UserGate: вскрываем средство для DDoS-атак на российскую ИТ-инфраструктуру

Discussion in 'Мировые новости. Обсуждения.' started by alexzir, 23 Jun 2023.

  1. alexzir

    alexzir Well-Known Member

    Joined:
    29 Oct 2019
    Messages:
    962
    Likes Received:
    2,311
    Reputations:
    25
    [​IMG]
    Введение

    В начале апреля 2023 года на одном из хостов был обнаружен подозрительный файл mhddos_proxy_linux_arm64 (MD5: 9e39f69350ad6599420bbd66e2715fcb), загружаемый вместе с определенным Docker-контейнером. По открытым источникам стало понятно, что данный файл представляет из себя свободно распространяемый инструмент для осуществления распределённой атаки на отказ в обслуживании (DDoS), направленный против российской ИТ-инфраструктуры.

    После запуска программа получает все необходимые настройки и автоматически инициирует массированные сетевые подключения к целевым хостам на различных уровнях TCP/IP для осуществления отказа в обслуживании.

    Так как данная программа не является вредоносной в привычном для антивирусных продуктов смысле – не осуществляет закрепления и самораспространения, не пытается скрыть своего присутствия на устройстве, и на текущий момент не используется для управления устройством или похищения информации с него – ни один антивирус не считает этот файл вредоносным и не пытается предотвратить его выполнения. А ведь в отличие от обычного вредоноса, выполнение такой программы приводит к непредумышленному участию в действиях, наказуемых по законодательству РФ, что может быть критичнее, чем компрометация личного устройства или корпоративной сети.

    [​IMG]
    Поэтому было решено проанализировать данный инструмент с целью выявления точного списка его целей, а также возможных индикаторов присутствия на устройстве.

    Данный материал будет полезен для специалистов по ИБ/ИТ, а также для всех интересующихся внутренним устройством языка Python и обфускацией ПО. Помимо исследования, предоставляется список целей, извлеченный из внутренней конфигурации инструмента.

    Первая часть статьи потребует от читателя знания Python. Для второй части неплохо было бы иметь базовые навыки реверс-инжиниринга. А в третьей части статьи требуются глубокие знания Python и C, или же уверенные навыки реверс-инжиниринга. Если же вам интересны исключительно полученные результаты, а не технические подробности - можете сразу переходить к заключению.

    mhddos. Это проект с открытым исходным кодом, предоставляющий широкий функционал по сетевому стресс-тестированию на различных уровнях OSI (Layer 4 - транспортный и Layer 7 - приложений) и множеством поддерживаемых протоколов, с возможностью обхода некоторых капч для защиты сайтов от DDoS-атак, и использованием многочисленных прокси-серверов. То есть функционал инструмента известен, и любой желающий со знанием Python может его изучить. Однако MHDDoS распространяется с исходными кодами, а не в виде бинарного файла…

    А вот по запросу "mhddos_proxy" уже можно найти репозиторий кастомизированного проекта mhddos_proxy и его описание в Telegraph от авторов, сетующих на то, что оригинальный mhddos уже перестал выдавать хорошую производительность, и предоставляющих новую, более удобную версию скрипта, в которой список целей выбирается самими разработчиками и поставляется с конфигурацией. Что ж, эффективно защитить исходники на Python невозможно, так ведь? Тогда просто найдём конфигурацию со списком целей в исходниках, делов на пару минут!

    [​IMG]
    Нейросетевой питон
    Открываем репозиторий, в глаза сразу же бросается файл config.json:

    [​IMG]
    Конфигурация инструмента
    Списки проксей по этим ссылкам уже недоступны – теперь в указанных репозиториях вместо файлов “1(2,3,4).txt”, располагаются файлы “11.txt”, однако они зашифрованы и не предназначены для данной версии mhddos_proxy.

    URL с целями (файл “11.txt”) все ещё можно скачать, и эти файлы постоянно обновляются. Однако после скачивания файла 11.txt становится понятно, что это совсем не текст:

    [​IMG]
    Содержимое файла 11.txt
    Получается что программа каким-то образом декодирует данный файл. Значит нужно найти процедуры этого декодирования или расшифрования. Поиск по коду строки “config.json” приводит к нужному методу _possibly_decrypt в файле src/targets.py:

    [​IMG]
    Фрагмент файла src/targets.py
    Данный метод сравнивает первые 4 байта файла со списком версий в словаре ENC_KEYS, и если есть совпадение, то расшифровывает оставшиеся данные файла соответствующим ключом из словаря с использованием алгоритма шифрования ChaCha20Poly1305. Сам словарь при этом содержит всего одну версию с ключом:

    ENC_KEYS = {b'\xe4\xdc\xf7\x1f': b'fZPK2OTLiNdqVDBxJTSMuph/rfLzpFWHDmHC1/+rR1s='}
    И она в точности совпадает с первыми 4-мя байтами файла конфигурации из файла 11.txt. Что ж, нам повезло, ведь это значит что и мы тоже можем повторить то же самое локально: просто копируем данный фрагмент кода и запускаем на своей машине (возможно, потребуется скачать пакет cryptography для python). На выходе получаем что-то интересное:

    [​IMG]
    Фрагмент расшифрованного файла с целями для DDoS-атаки
    А именно - список из около четырёхсот URL-ов сайтов российских федеральных и муниципальных учреждений, образовательных организаций, провайдеров интернет-услуг. Дополнив этот список другими файлами, закодированными base64 или зашифрованными данным алгоритмом, получаем около 500 URL-ов, вот лишь некоторые из них:

    URLs
    Ознакомиться с полным списком и проверить наличие в нём интересующего ресурса можно в файле.

    Но тут всего лишь 500 ссылок. Исключая многочисленные домены МИД РФ и сервера Билайна, остаётся и того меньше – что-то не густо. Следует отметить, что по ссылкам из конфига можно найти и другие файлы, также зашифрованные, но уже на другом ключе, которые так и не удалось расшифровать. Возможно, в них содержится ещё большее число доменов.

    Разработчиком предпринята попытка исключения использования инструмента против определённых целей: в файле src/exclude.py указаны соответствующие IP (например, внутренние сетевые адреса, Cloudflare, DNS-сервера Google), а в обфусцированном файле src/vendor/rotate.py исключается атака по доменам зоны .ua. Можем деобфусцировать его вручную, просто последовательно применяя base64 (например, с помощью https://www.base64decode.org/), декодируя текст в экранированных hex-строках (например, через https://codepen.io/kamakalolii/pen/RKNoMr), и смещая текст с помощью rot13 (https://rot13.com/). Либо можно воспользоваться любым онлайн-интерпретатором Python и скопировать туда обфусцированный код. На выходе получится следующее:

    Code:
    from yarl import URL
    suffix = '.ua'
    params = [
    (URL('https://profile.sber.ru'), '84.252.144.102'),
    (URL('https://3dsec.sberbank.ru'), '62.76.205.110'),
    (URL('https://cdek.ru'), '178.248.238.208'),
    (URL('https://lk.platon.ru'), '83.169.194.22'),
    (URL('https://auth.kontur.ru'), '46.17.206.15'),
    ]
    В файле src/vendor/useragents.py также находятся упакованные Useragent-ы для подключения к сайтам, однако это стандартная информация для мимикрии под легитимные устройства, и не представляет интереса.

    В файле src/utils.py также можно обнаружить код для обхода защиты от ботов на Госуслугах (код создания правильной Cookie):

    Code:
    from yarl import URL
    suffix = '.ua'
    params = [
    (URL('https://profile.sber.ru'), '84.252.144.102'),
    (URL('https://3dsec.sberbank.ru'), '62.76.205.110'),
    (URL('https://cdek.ru'), '178.248.238.208'),
    (URL('https://lk.platon.ru'), '83.169.194.22'),
    (URL('https://auth.kontur.ru'), '46.17.206.15'),
    ]
    Хорошо, мы получили и расшифровали конфигурацию. Но обнаруженный изначально файл mhddos_proxy_arm64 не является питоновским скриптом, так откуда же он взялся? Ответ находится в том же репозитории: разработчик указывает, что python-проект с открытым исходным кодом уже устарел, и призывает всех переходить на новую версию в другом репозитории mhddos_proxy_releases. К сожалению, в данном репозитории отсутствуют исходные коды, и инструмент распространяется только в виде исполняемых программ. Следовательно, придётся применять методы реверс-инжиниринга.

    Скачиваем сборку для linux под x86 (mhddos_proxy_linux v81, MD5: a004b948f72c6eb14f348cc698bda16e) - её будет проще исследовать, чем бинарь для ARM. Открываем в дизассемблере, смотрим строки и видим характерные строки начинающиеся с _PYI:

    [​IMG]
    Фрагмент строк программы
    Данные строки указывают на то, что исходный код был упакован с помощью PyInstaller. Это проект с открытым исходным кодом, предназначенный для компиляции Python-проектов в исполняемые файлы с целью удобного распространения, и защиты исходного кода от копирования и модификации.

    Полный разбор по ссылке
     
    Suicide likes this.