Как насчет того, чтобы поднять планку устойчивости к IR системам в редиректорах C2.
Компания Red Teaming увидела несколько отличных идей о том, как бороться с IR и направлять их в ложное русло, одновременно предлагая устойчивую сеть редиректоров C2.
Эта работа объединяет многие из этих замечательных идей в одну легковесную утилиту, имитирующую Apache2, являющейся простым обратным прокси-сервером HTTP(S).
Сочетание профилей Malleable C2, знания пула плохих IP-адресов и гибкости простого добавления новой проверки и неправильной маршрутизации - привело к созданию отталкивающего инструмента для проверки IR.
Если какой-либо недопустимый входящий пакет достигнет RedWarden - вы можете перенаправить, сбросить или просто проксировать его!
Резюме
Эта программа действует как обратный прокси-сервер HTTP/HTTPS с несколькими ограничениями, налагаемыми на входящие HTTP-запросы C2, выбирая, какие пакеты направлять на Teamserver, а какие отбрасывать, аналогично ограничениям файла .htaccess, установленным в mod_rewrite Apache2.
RedWarden был создан для решения проблемы уклонения от IR/AV/EDR/Sandboxes на уровне редиректора C2. Он предназначен для замены классических настроек Apache2 + mod_rewrite, используемых для этой цели.
Функции:
- Синтаксический анализатор профиля C2, способный проверять входящие HTTP/S-запросы строго в соответствии с профилем и отбрасывать пакеты в случае нарушения
- Возможность отфильтровывать/восстанавливать нежелательные заголовки HTTP, добавленные промежуточными системами, такими как прокси и кеши (например, CloudFlare), чтобы соответствовать действующему профилю.
- Интегрированный тщательно подобранный массивный черный список пулов и диапазонов IPv4, которые, как известно, связаны с поставщиками ИТ-безопасности
- Фильтруемые записи логов вывода (как в комбинированном журнале доступа Apache2, так и в пользовательских форматах RedWarden), полезные для отслеживания событий/проблем однорангового подключения
- Возможность запрашивать IPv4-адрес подключающегося однорангового узла по IP-геолокации/whois-информации и сравнивать это с заранее заданными регулярными выражениями, чтобы исключить одноранговые узлы, подключающиеся за пределами доверенных организаций/стран/городов и т.д.
- Встроенная функция защиты от атак Replay, обеспечивающая регистрацию хэш-сумм MD5 принятых запросов в локально хранящуюся базу данных SQLite и предотвращение ранее принятых запросов.
- Позволяет определять состояние ProxyPass для передачи запросов, соответствующих определенному URL-адресу, на другие хосты.
- Поддержка нескольких командных серверов
- Поддержка множества хостов с обратным проксированием/сайтов для перенаправления, предоставляемых в случайном порядке, что позволяет балансировать нагрузку на трафик или создавать более универсальные инфраструктуры.
- Может восстанавливать HTTP-пакеты в соответствии с ожидаемым профилем в случае, если некоторые из заголовков были повреждены в трафике.
- Бессонные ночи, потраченные на устранение неполадок, "почему мой маячок не работает через CloudFlare/CDN/Domain Fronting" закончились благодаря подробным подробным журналам запросов/ответов HTTP(S)
RedWarden принимает на вход профиль Malleable C2 и имя хоста командного сервера:порт. Затем он анализирует предоставленные разделы профиля, чтобы понять контракт и передавать только те входящие запросы, которые его удовлетворили, а другие направляет неверно.
Такие секции, как http-stager, http-get, http-post и их соответствующие uris, заголовки, шаблоны добавления/добавления, User-Agent используются для различения легитимного запроса маячка и несвязанного интернет-шума или IR/AV/EDR вне связанных пакеты.
Программа извлекает выгоду из чудесных известных диапазонов плохих IP-адресов от: curi0usJack и других: https://gist.github.com/curi0usJack/971385e8334e189d93a6cb4671238b10
Использование черного списка IP-адресов вместе с поиском известных плохих ключевых слов с помощью запросов DNS с обратным IP и проверки заголовков HTTP обеспечивает надежность и значительно увеличивает отказоустойчивость редиректора для неавторизованных одноранговых узлов, желающих изучить инфраструктуры злоумышленников.
Неверные пакеты могут быть неправильно маршрутизированы в соответствии с тремя стратегиями:
- redirect: просто перенаправляйте одноранговый узел на другие веб-сайты, такие как Rick Roll.
- reset: немедленно прервать TCP-соединение.
- proxy: получение ответа с другого веб-сайта, чтобы максимально точно имитировать клонированный/взломанный веб-сайт.
Эта конфигурация обязательна в файле конфигурации:
В примере ниже показан результат перенаправления на https://googole.com:
Используйте это с умом, оставайтесь в безопасности.
Требования
Эта программа может работать только в системах Linux, поскольку она использует fork для создания нескольких процессов.
Также ожидается установка системной команды openssl, поскольку она используется для генерации сертификатов SSL.
Наконец, легко установите все зависимости Python3 PIP с помощью команды:
bash $ sudo pip3 install -r requirements.txt
Использование
Пример использования
Минимальный файл конфигурации RedWarden config.yaml может содержать такие данные:
Затем программу можно запустить, указав ей путь к файлу конфигурации:
Приведенный выше вывод содержит строку, указывающую на то, что произошел неавторизованный, несовместимый с нашим входящим запросом профиля C2 запром, который был отброшен из-за представленной несовместимой строки User-Agent:
Случаи применения
Установите геолокацию IP для отправителей трафика маячка
Вы очень хорошо прошли пре-фишинг и OSINT. Теперь вы знаете, где живут ваши цели, и имеете некоторые подсказки, откуда должен исходить трафик, или, по крайней мере, как обнаружить полностью вспомогательный трафик. Как наложить геолокацию IP на запросы маячков?
RedWarden приходит на помощь!
Допустим, вы хотите принимать трафик только из Польши, Европы. Ваши результаты пре-фишинга/OSINT показывают, что:
- 89.64.64.150 - это законный IP-адрес одной из ваших целей, происходящий из Польши.
- 59.99.140.76, тогда как этот - нет, и он достиг ваших систем как обычный пакет интернет-шума.
Вы можете использовать утилиту RedWarden lib/ipLookupHelper.py для сбора метаданных IP Geo об этих двух адресах:
Запрос покажет вывод
А другой ответит так
Теперь вы видите, что в первом было "страна": "Польша", а во втором "страна": "Индия". Обладая этими знаниями, мы готовы разработать наши ограничения в виде здоровенного словаря YAML:
Каждая из записей этого словаря принимает регулярное выражение для сопоставления с определенными метаданными IP Geo IP-адреса входящего однорангового узла. Мы используем три записи в свойстве страны, чтобы разрешить запросы, имеющие одно из указанных значений.
Установив это в своей конфигурации, вы можете проверить, будет ли другой IP-адрес проходить через дискриминатор IP-геолокации RedWarden или нет, с помощью утилиты ipLookupHelper, принимающей второй параметр:
Самая последняя строка сообщает вам, будет ли пакет заблокирован или принят.
И это все! Сконфигурируйте ограничения геолокации IP с умом и безопасностью, внимательно проверьте журналы RedWarden на предмет любых записей DROP, связанных с IP-геолокацией, и сохраняйте чистый и аккуратный трафик C2!
Исправление подделанных запросов маячка
Если вам довелось использовать системы, такие как AWS Lambda или CloudFlare, в качестве фронтинга домена/редиректора , вы наверняка сталкивались с ситуацией, когда некоторые из ваших пакетов не могли быть приняты командным сервером, поскольку они отклонялись от согласованного контракта. Был ли изменен или удален HTTP-заголовок, переупорядоченные файлы cookie или что-то еще - держу пари, вы потратили впустую много часов вашей жизни.
Для борьбы с проблемами процесса настройки каналов C2 и временным вмешательством в систему RedWarden предлагает функции восстановления пакетов маячка.
Он делает это, проверяя, каким должен быть пакет в профиле, и может восстанавливать настроенные заголовки HTTP до согласованных значений в соответствии с требованиями профиля.
Рассмотрим следующий простой профиль:
Вы видите это Accept-Encoding? Каждый запрос маяка должен содержать этот заголовок и это значение. Что произойдет, если ваш маяк попадет в системы CloudFlare, и они отправят запрос, который будет удален из этого заголовка или вместо него будет Accept-Encoding: gzip? Командный серве сбросит запрос на месте.
Установив этот заголовок в разделе конфигурации RedWarden под названием repair_these_headers, вы можете обезопасить свое соединение:
Примеры результатов
Давайте посмотрим на результат, который производит прокси.
При выборе опции verbose: True для детализации будет установлено значение INFO, самое большее, чтобы указать принятые запросы от отброшенных.
Запрос может быть принят, если он соответствует всем критериям, заданным в файле конфигурации RedWarden. За такой ситуацией последует журнал записей [ALLOW, ...]:
Если запрос не прошел какую-либо из проверок, выполняемых RedWarden для каждого запроса, будет выдана соответствующая строка [DROP, ...], содержащая информацию о причине отбрасывания:
Тонкая настройка политик отбрасывания
Существует множество причин, по которым можно отказаться от запроса. Каждую из этих проверок можно независимо включать и выключать в соответствии с требованиями или в процессе точной настройки или исправления ошибочного решения:
Выдержка из example-config.yaml:
По умолчанию все эти проверки выполняются принудительно.
Включение отладки: True заполнит буфер вашей консоли множеством строк журнала, описывающих каждый шаг, который RedWarden предпринимает в своем сложном процессе принятия решений. Если вы хотите видеть свои запросы и ответы полностью - установите значение true для отладки и трассировки и погрузитесь в бремя логирования журнала!
FAQ
- Может ли эта программа работать без Malleable профиля?
Да, она может. Однако логика проверки запросов будет отключена, все остальное должно работать нормально: принудительное определение геолокации IP, логика обратного просмотра, список заблокированных IP-адресов и т.д.
- Можно ли эту программу легко адаптировать и к другим фреймворкам C2? Например, Mythic, Covenant и т.д.?
Легко нет. С некоторыми усилиями - да. Как я описал ниже, инструмент написан плохо, что сделает адаптацию других C2 затруднительной. Однако это вполне выполнимо, если учесть время и усилия.
- Мои пакеты сбрасываются. Почему?
Попробуйте включить debug: True и trace: True, чтобы собрать как можно больше журналов. Затем вам нужно будет просмотреть журналы и выяснить, что происходит. Пакеты выглядят именно так, как вы ожидали, в вашем профиле? Или, может быть, в сети произошло тонкое вмешательство, которое заставило RedWarden отбросить пакет (и это могло заставить командный сервер отбросить его?).
Известные проблемы
- Программа может немного увеличить пропускную способность интерактивного сна.
- Логика обработки ProxyPass далека от совершенства и действительно содержит ошибки (и о боже, это убого!).
- Странные формы файлов конфигурации могут подорвать парсер RedWarden и заставить его пожаловаться.
Самый простой способ преодолеть это - скопировать example-config.yaml и поработать над ним.
Боже мой, почему этот код - такая инженерная чушь?
Мой Код - это ОДИН ГРЕБАНЫЙ БОЛЬШОЙ АД ПОСТРОЕННЫЙ ИЗ ГОВНА И ПАЛОК - я признаю это - и для этого тоже есть честная причина: проект разрабатывался на 90% во время фактических взаимодействий с RT. Как мы все знаем, такого рода мероприятия требуют множества дел, и времени на разработку надлежащего сложного инструмента практически не остается. Не говоря уже о критичности этой программы в настройке проекта. Первоначально инструмент начинался с простого прокси-скрипта, написанного на Python2, чтобы затем развиваться как прокси с плагинами, получил плагин malleable_redirector - и с тех пор я очень старался, чтобы proxy2 поддерживал обратную совместимость с другими плагинами, которые я сделал для него, и придерживаюсь своей первоначальной цели.
Однако пришло время отпустить его, провести ребрендинг и начать исправлять все появившиеся неприятные запахи кода.
С учетом всего вышесказанного, пожалуйста, выразите мне некоторую степень сострадания, когда поднимаете вопросы, отправляете запросы на пул и пытаетесь помочь, а не осуждать!
Спасибо!
ЧТО НУЖНО СДЕЛАТЬ
- Изучить возможность использования каналов Threat Intelligence в гнусных целях - например, для обнаружения поставщиков средств безопасности на основе IP-адресов.
- Добавить поддержку базы данных MaxMind GeoIP/API
- Реализовать поддержку подписей JA3 как при обнаружении, так и при блокировке и олицетворении для поддельных настроек nginx/Apache2/пользовательских настроек.
- Добавить уникальную логику отслеживания маячков, чтобы предложить гибкость отказа от промежуточных и коммуникационных процессов по собственному усмотрению прокси.
- Ввести ограничение по времени при предложении возможностей перенаправления (прокси только в рабочее время)
- Добавить логику аутентификации и авторизации прокси на CONNECT/relay.
- Добавить целевое перенаправление мобильных пользователей
- Добавить параметры конфигурации, чтобы определить пользовательские заголовки HTTP, которые должны быть введены, или те, которые будут удалены.
- Добавить параметры конфигурации, чтобы требовать наличия определенных заголовков HTTP в запросах, соответствующих критериям ProxyPass.
- Интерактивный интерфейс, позволяющий вводить простые символы, управляющие подробностью вывода журнала, аналогично Nmap
- Переписать логику парсера профиля на pyMalleableC2. Когда я впервые начал кодить собственную логику парсера, на Github не было такого инструментария.
- Отрефакторить всю кодовую базу
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://github.com/mgeeky/RedWarden
Компания Red Teaming увидела несколько отличных идей о том, как бороться с IR и направлять их в ложное русло, одновременно предлагая устойчивую сеть редиректоров C2.
Эта работа объединяет многие из этих замечательных идей в одну легковесную утилиту, имитирующую Apache2, являющейся простым обратным прокси-сервером HTTP(S).
Сочетание профилей Malleable C2, знания пула плохих IP-адресов и гибкости простого добавления новой проверки и неправильной маршрутизации - привело к созданию отталкивающего инструмента для проверки IR.
Если какой-либо недопустимый входящий пакет достигнет RedWarden - вы можете перенаправить, сбросить или просто проксировать его!
Резюме
Эта программа действует как обратный прокси-сервер HTTP/HTTPS с несколькими ограничениями, налагаемыми на входящие HTTP-запросы C2, выбирая, какие пакеты направлять на Teamserver, а какие отбрасывать, аналогично ограничениям файла .htaccess, установленным в mod_rewrite Apache2.
RedWarden был создан для решения проблемы уклонения от IR/AV/EDR/Sandboxes на уровне редиректора C2. Он предназначен для замены классических настроек Apache2 + mod_rewrite, используемых для этой цели.
Функции:
- Синтаксический анализатор профиля C2, способный проверять входящие HTTP/S-запросы строго в соответствии с профилем и отбрасывать пакеты в случае нарушения
- Возможность отфильтровывать/восстанавливать нежелательные заголовки HTTP, добавленные промежуточными системами, такими как прокси и кеши (например, CloudFlare), чтобы соответствовать действующему профилю.
- Интегрированный тщательно подобранный массивный черный список пулов и диапазонов IPv4, которые, как известно, связаны с поставщиками ИТ-безопасности
- Фильтруемые записи логов вывода (как в комбинированном журнале доступа Apache2, так и в пользовательских форматах RedWarden), полезные для отслеживания событий/проблем однорангового подключения
- Возможность запрашивать IPv4-адрес подключающегося однорангового узла по IP-геолокации/whois-информации и сравнивать это с заранее заданными регулярными выражениями, чтобы исключить одноранговые узлы, подключающиеся за пределами доверенных организаций/стран/городов и т.д.
- Встроенная функция защиты от атак Replay, обеспечивающая регистрацию хэш-сумм MD5 принятых запросов в локально хранящуюся базу данных SQLite и предотвращение ранее принятых запросов.
- Позволяет определять состояние ProxyPass для передачи запросов, соответствующих определенному URL-адресу, на другие хосты.
- Поддержка нескольких командных серверов
- Поддержка множества хостов с обратным проксированием/сайтов для перенаправления, предоставляемых в случайном порядке, что позволяет балансировать нагрузку на трафик или создавать более универсальные инфраструктуры.
- Может восстанавливать HTTP-пакеты в соответствии с ожидаемым профилем в случае, если некоторые из заголовков были повреждены в трафике.
- Бессонные ночи, потраченные на устранение неполадок, "почему мой маячок не работает через CloudFlare/CDN/Domain Fronting" закончились благодаря подробным подробным журналам запросов/ответов HTTP(S)
RedWarden принимает на вход профиль Malleable C2 и имя хоста командного сервера:порт. Затем он анализирует предоставленные разделы профиля, чтобы понять контракт и передавать только те входящие запросы, которые его удовлетворили, а другие направляет неверно.
Такие секции, как http-stager, http-get, http-post и их соответствующие uris, заголовки, шаблоны добавления/добавления, User-Agent используются для различения легитимного запроса маячка и несвязанного интернет-шума или IR/AV/EDR вне связанных пакеты.
Программа извлекает выгоду из чудесных известных диапазонов плохих IP-адресов от: curi0usJack и других: https://gist.github.com/curi0usJack/971385e8334e189d93a6cb4671238b10
Использование черного списка IP-адресов вместе с поиском известных плохих ключевых слов с помощью запросов DNS с обратным IP и проверки заголовков HTTP обеспечивает надежность и значительно увеличивает отказоустойчивость редиректора для неавторизованных одноранговых узлов, желающих изучить инфраструктуры злоумышленников.
Неверные пакеты могут быть неправильно маршрутизированы в соответствии с тремя стратегиями:
- redirect: просто перенаправляйте одноранговый узел на другие веб-сайты, такие как Rick Roll.
- reset: немедленно прервать TCP-соединение.
- proxy: получение ответа с другого веб-сайта, чтобы максимально точно имитировать клонированный/взломанный веб-сайт.
Эта конфигурация обязательна в файле конфигурации:
#
# What to do with the request originating not conforming to Beacon, whitelisting or
# ProxyPass inclusive statements:
# - 'redirect' it to another host with (HTTP 301),
# - 'reset' a TCP connection with connecting client
# - 'proxy' the request, acting as a reverse-proxy against specified action_url
# (may be dangerous if client fetches something it shouldn't supposed to see!)
#
# Valid values: 'reset', 'redirect', 'proxy'.
#
# Default: redirect
#
drop_action: redirect
В примере ниже показан результат перенаправления на https://googole.com:
Используйте это с умом, оставайтесь в безопасности.
Требования
Эта программа может работать только в системах Linux, поскольку она использует fork для создания нескольких процессов.
Также ожидается установка системной команды openssl, поскольку она используется для генерации сертификатов SSL.
Наконец, легко установите все зависимости Python3 PIP с помощью команды:
bash $ sudo pip3 install -r requirements.txt
Использование
Пример использования
Минимальный файл конфигурации RedWarden config.yaml может содержать такие данные:
port:
- 80/http
- 443/https
profile: jquery-c2.3.14.profile
ssl_cacert: /etc/letsencrypt/live/attacker.com/fullchain.pem
ssl_cakey: /etc/letsencrypt/live/attacker.com/privkey.pem
teamserver_url:
- 1.2.3.4:8080
drop_action: reset
Затем программу можно запустить, указав ей путь к файлу конфигурации:
bash$ sudo python3 RedWarden.py -c config.yaml
[INFO] 19:21:42: Loading 1 plugin...
[INFO] 19:21:42: Plugin "malleable_redirector" has been installed.
[INFO] 19:21:42: Preparing SSL certificates and keys for https traffic interception...
[INFO] 19:21:42: Using provided CA key file: ca-cert/ca.key
[INFO] 19:21:42: Using provided CA certificate file: ca-cert/ca.crt
[INFO] 19:21:42: Using provided Certificate key: ca-cert/cert.key
[INFO] 19:21:42: Serving http proxy on: 0.0.0.0, port: 80...
[INFO] 19:21:42: Serving https proxy on: 0.0.0.0, port: 443...
[INFO] 19:21:42: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:21:42: == Valid malleable http-get request inbound.
[INFO] 19:21:42: Plugin redirected request from [code.jquery.com] to [1.2.3.4:8080]
[INFO] 19:21:42: [RESPONSE] HTTP 200 OK, length: 5543
[INFO] 19:21:45: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:21:45: == Valid malleable http-get request inbound.
[INFO] 19:21:45: Plugin redirected request from [code.jquery.com] to [1.2.3.4:8080]
[INFO] 19:21:45: [RESPONSE] HTTP 200 OK, length: 5543
[INFO] 19:21:46: [REQUEST] GET /
[...]
[ERROR] 19:24:46: [DROP, reason:1] inbound User-Agent differs from the one defined in C2 profile.
[...]
[INFO] 19:24:46: [RESPONSE] HTTP 301 Moved Permanently, length: 212
[INFO] 19:24:48: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:24:48: == Valid malleable http-get request inbound.
[INFO] 19:24:48: Plugin redirected request from [code.jquery.com] to [1.2.3.4:8080]
[...]
Приведенный выше вывод содержит строку, указывающую на то, что произошел неавторизованный, несовместимый с нашим входящим запросом профиля C2 запром, который был отброшен из-за представленной несовместимой строки User-Agent:
[...]
[DROP, reason:1] inbound User-Agent differs from the one defined in C2 profile.
[...]
Случаи применения
Установите геолокацию IP для отправителей трафика маячка
Вы очень хорошо прошли пре-фишинг и OSINT. Теперь вы знаете, где живут ваши цели, и имеете некоторые подсказки, откуда должен исходить трафик, или, по крайней мере, как обнаружить полностью вспомогательный трафик. Как наложить геолокацию IP на запросы маячков?
RedWarden приходит на помощь!
Допустим, вы хотите принимать трафик только из Польши, Европы. Ваши результаты пре-фишинга/OSINT показывают, что:
- 89.64.64.150 - это законный IP-адрес одной из ваших целей, происходящий из Польши.
- 59.99.140.76, тогда как этот - нет, и он достиг ваших систем как обычный пакет интернет-шума.
Вы можете использовать утилиту RedWarden lib/ipLookupHelper.py для сбора метаданных IP Geo об этих двух адресах:
bash$ python3 ipLookupHelper.py
Usage: ./ipLookupHelper.py <ipaddress> [malleable-redirector-config]
Use this small utility to collect IP Lookup details on your target IPv4 address and verify whether
your 'ip_geolocation_requirements' section of proxy2 malleable-redirector-config.yaml would match that
IP address. If second param is not given - no
Запрос покажет вывод
bash$ python3 ipLookupHelper.py 89.64.64.150
[dbg] Following IP Lookup providers will be used: ['ip_api_com', 'ipapi_co']
[.] Lookup of: 89.64.64.150
[dbg] Calling IP Lookup provider: ipapi_co
[dbg] Calling IP Lookup provider: ip_api_com
[dbg] New IP lookup entry cached: 89.64.64.150
[.] Output:
{
"organization": [
"UPC Polska Sp. z o.o.",
"UPC.pl",
"AS6830 Liberty Global B.V."
],
"continent": "Europe",
"continent_code": "EU",
"country": "Poland",
"country_code": "PL",
"ip": "89.64.64.150",
"city": "Warsaw",
"timezone": "Europe/Warsaw",
"fulldata": {
"status": "success",
"country": "Poland",
"countryCode": "PL",
"region": "14",
"regionName": "Mazovia",
"city": "Warsaw",
"zip": "00-202",
"lat": 52.2484,
"lon": 21.0026,
"timezone": "Europe/Warsaw",
"isp": "UPC.pl",
"org": "UPC Polska Sp. z o.o.",
"as": "AS6830 Liberty Global B.V.",
"query": "89.64.64.150"
},
"reverse_ip": "89-64-64-150.dynamic.chello.pl"
}
А другой ответит так
bash$ python3 ipLookupHelper.py 59.99.140.76
[dbg] Following IP Lookup providers will be used: ['ip_api_com', 'ipapi_co']
[dbg] Read 1 cached entries from file.
[.] Lookup of: 59.99.140.76
[dbg] Calling IP Lookup provider: ip_api_com
[dbg] New IP lookup entry cached: 59.99.140.76
[.] Output:
{
"organization": [
"",
"BSNL Internet",
"AS9829 National Internet Backbone"
],
"continent": "Asia",
"continent_code": "AS",
"country": "India",
"country_code": "IN",
"ip": "59.99.140.76",
"city": "Palakkad",
"timezone": "Asia/Kolkata",
"fulldata": {
"status": "success",
"country": "India",
"countryCode": "IN",
"region": "KL",
"regionName": "Kerala",
"city": "Palakkad",
"zip": "678001",
"lat": 10.7739,
"lon": 76.6487,
"timezone": "Asia/Kolkata",
"isp": "BSNL Internet",
"org": "",
"as": "AS9829 National Internet Backbone",
"query": "59.99.140.76"
},
"reverse_ip": ""
}
Теперь вы видите, что в первом было "страна": "Польша", а во втором "страна": "Индия". Обладая этими знаниями, мы готовы разработать наши ограничения в виде здоровенного словаря YAML:
ip_geolocation_requirements:
organization:
continent:
continent_code:
country:
- Poland
- PL
- Polska
country_code:
city:
timezone:
Каждая из записей этого словаря принимает регулярное выражение для сопоставления с определенными метаданными IP Geo IP-адреса входящего однорангового узла. Мы используем три записи в свойстве страны, чтобы разрешить запросы, имеющие одно из указанных значений.
Установив это в своей конфигурации, вы можете проверить, будет ли другой IP-адрес проходить через дискриминатор IP-геолокации RedWarden или нет, с помощью утилиты ipLookupHelper, принимающей второй параметр:
Самая последняя строка сообщает вам, будет ли пакет заблокирован или принят.
И это все! Сконфигурируйте ограничения геолокации IP с умом и безопасностью, внимательно проверьте журналы RedWarden на предмет любых записей DROP, связанных с IP-геолокацией, и сохраняйте чистый и аккуратный трафик C2!
Исправление подделанных запросов маячка
Если вам довелось использовать системы, такие как AWS Lambda или CloudFlare, в качестве фронтинга домена/редиректора , вы наверняка сталкивались с ситуацией, когда некоторые из ваших пакетов не могли быть приняты командным сервером, поскольку они отклонялись от согласованного контракта. Был ли изменен или удален HTTP-заголовок, переупорядоченные файлы cookie или что-то еще - держу пари, вы потратили впустую много часов вашей жизни.
Для борьбы с проблемами процесса настройки каналов C2 и временным вмешательством в систему RedWarden предлагает функции восстановления пакетов маячка.
Он делает это, проверяя, каким должен быть пакет в профиле, и может восстанавливать настроенные заголовки HTTP до согласованных значений в соответствии с требованиями профиля.
Рассмотрим следующий простой профиль:
http-get {
set uri "/api/abc";
client {
header "Accept-Encoding" "gzip, deflate";
metadata {
base64url;
netbios;
base64url;
parameter "auth";
}
}
...
Вы видите это Accept-Encoding? Каждый запрос маяка должен содержать этот заголовок и это значение. Что произойдет, если ваш маяк попадет в системы CloudFlare, и они отправят запрос, который будет удален из этого заголовка или вместо него будет Accept-Encoding: gzip? Командный серве сбросит запрос на месте.
Установив этот заголовок в разделе конфигурации RedWarden под названием repair_these_headers, вы можете обезопасить свое соединение:
#
# This option repairs Beacon requests's header value by restoring to what was expected in Malleable C2 profile.
#
# If RedWarden validates inbound request's HTTP headers, according to policy drop_malleable_without_expected_header_value:
# "[IP: DROP, reason:6] HTTP request did not contain expected header value:"
#
# and detects some header is missing or was overwritten along the wire, the request will be dropped.
#
# We can relax this policy a bit however, since there are situations in which Cache systems (such as Cloudflare) could tamper with our
# requests thus breaking Malleable contracts. What we can do is to specify list of headers, that should be overwritten back to their values
# defined in provided Malleable profile.
#
# So for example, if our profile expects:
# header "Accept-Encoding" "gzip, deflate";
#
# but we receive a request having following header set instead:
# Accept-Encoding: gzip
#
# Because it was tampered along the wire by some of the interim systems (such as web-proxies or caches), we can
# detect that and set that header's value back to what was expected in Malleable profile.
#
# In order to protect Accept-Encoding header, as an example, the following configuration could be used:
# repair_these_headers:
# - Accept-Encoding
#
# Default: <empty-list>
#
repair_these_headers:
- Accept-Encoding
Примеры результатов
Давайте посмотрим на результат, который производит прокси.
При выборе опции verbose: True для детализации будет установлено значение INFO, самое большее, чтобы указать принятые запросы от отброшенных.
Запрос может быть принят, если он соответствует всем критериям, заданным в файле конфигурации RedWarden. За такой ситуацией последует журнал записей [ALLOW, ...]:
[INFO] 2021-04-24/17:30:48: [REQUEST] GET /js/scripts.js
[INFO] 2021-04-24/17:30:48: == Valid malleable http-get (variant: default) request inbound.
[INFO] 2021-04-24/17:30:48: [ALLOW, 2021-04-24/19:30:48, 111.222.223.224] "/js/scripts.js" - UA: "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
[INFO] 2021-04-24/17:30:48: Connected peer sent 2 valid http-get and 0 valid http-post requests so far, out of 15/5 required to consider him temporarily trusted
[INFO] 2021-04-24/17:30:48: Plugin redirected request from [attacker.com] to [127.0.0.1:5555]
Если запрос не прошел какую-либо из проверок, выполняемых RedWarden для каждого запроса, будет выдана соответствующая строка [DROP, ...], содержащая информацию о причине отбрасывания:
[INFO] 2021-04-24/16:48:28: [REQUEST] GET /
[ERROR] 2021-04-24/16:48:29: [DROP, 2021-04-24/18:48:28, reason:1, 128.14.211.186] inbound User-Agent differs from the one defined in C2 profile.
[INFO] 2021-04-24/16:48:29: [DROP, 2021-04-24/18:48:28, 128.14.211.186] "/" - UA: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
[ERROR] 2021-04-24/16:48:29: [REDIRECTING invalid request from 128.14.211.186 (zl-dal-us-gp3-wk107.internet-census.org)] GET /
Тонкая настройка политик отбрасывания
Существует множество причин, по которым можно отказаться от запроса. Каждую из этих проверок можно независимо включать и выключать в соответствии с требованиями или в процессе точной настройки или исправления ошибочного решения:
Выдержка из example-config.yaml:
#
# Fine-grained requests dropping policy - lets you decide which checks
# you want to have enforced and which to skip by setting them to False
#
# Default: all checks enabled
#
policy:
# [IP: ALLOW, reason:0] Request conforms ProxyPass entry (url="..." host="..."). Passing request to specified host
allow_proxy_pass: True
# [IP: ALLOW, reason:2] Peer's IP was added dynamically to a whitelist based on a number of allowed requests
allow_dynamic_peer_whitelisting: True
# [IP: DROP, reason:1] inbound User-Agent differs from the one defined in C2 profile.
drop_invalid_useragent: True
# [IP: DROP, reason:2] HTTP header name contained banned word
drop_http_banned_header_names: True
# [IP: DROP, reason:3] HTTP header value contained banned word:
drop_http_banned_header_value: True
# [IP: DROP, reason:4b] peer's reverse-IP lookup contained banned word
drop_dangerous_ip_reverse_lookup: True
# [IP: DROP, reason:4e] Peer's IP geolocation metadata contained banned keyword! Peer banned in generic fashion.
drop_ipgeo_metadata_containing_banned_keywords: True
# [IP: DROP, reason:5] HTTP request did not contain expected header
drop_malleable_without_expected_header: True
# [IP: DROP, reason:6] HTTP request did not contain expected header value:
drop_malleable_without_expected_header_value: True
# [IP: DROP, reason:7] HTTP request did not contain expected (metadata|id|output) section header:
drop_malleable_without_expected_request_section: True
# [IP: DROP, reason:8] HTTP request was expected to contain (metadata|id|output) section with parameter in URI:
drop_malleable_without_request_section_in_uri: True
# [IP: DROP, reason:9] Did not found append pattern:
drop_malleable_without_prepend_pattern: True
# [IP: DROP, reason:10] Did not found append pattern:
drop_malleable_without_apppend_pattern: True
# [IP: DROP, reason:11] Requested URI does not aligns any of Malleable defined variants:
drop_malleable_unknown_uris: True
# [IP: DROP, reason:12] HTTP request was expected to contain <> section with URI-append containing prepend/append fragments
drop_malleable_with_invalid_uri_append: True
По умолчанию все эти проверки выполняются принудительно.
Включение отладки: True заполнит буфер вашей консоли множеством строк журнала, описывающих каждый шаг, который RedWarden предпринимает в своем сложном процессе принятия решений. Если вы хотите видеть свои запросы и ответы полностью - установите значение true для отладки и трассировки и погрузитесь в бремя логирования журнала!
FAQ
- Может ли эта программа работать без Malleable профиля?
Да, она может. Однако логика проверки запросов будет отключена, все остальное должно работать нормально: принудительное определение геолокации IP, логика обратного просмотра, список заблокированных IP-адресов и т.д.
- Можно ли эту программу легко адаптировать и к другим фреймворкам C2? Например, Mythic, Covenant и т.д.?
Легко нет. С некоторыми усилиями - да. Как я описал ниже, инструмент написан плохо, что сделает адаптацию других C2 затруднительной. Однако это вполне выполнимо, если учесть время и усилия.
- Мои пакеты сбрасываются. Почему?
Попробуйте включить debug: True и trace: True, чтобы собрать как можно больше журналов. Затем вам нужно будет просмотреть журналы и выяснить, что происходит. Пакеты выглядят именно так, как вы ожидали, в вашем профиле? Или, может быть, в сети произошло тонкое вмешательство, которое заставило RedWarden отбросить пакет (и это могло заставить командный сервер отбросить его?).
Известные проблемы
- Программа может немного увеличить пропускную способность интерактивного сна.
- Логика обработки ProxyPass далека от совершенства и действительно содержит ошибки (и о боже, это убого!).
- Странные формы файлов конфигурации могут подорвать парсер RedWarden и заставить его пожаловаться.
Самый простой способ преодолеть это - скопировать example-config.yaml и поработать над ним.
Боже мой, почему этот код - такая инженерная чушь?
Мой Код - это ОДИН ГРЕБАНЫЙ БОЛЬШОЙ АД ПОСТРОЕННЫЙ ИЗ ГОВНА И ПАЛОК - я признаю это - и для этого тоже есть честная причина: проект разрабатывался на 90% во время фактических взаимодействий с RT. Как мы все знаем, такого рода мероприятия требуют множества дел, и времени на разработку надлежащего сложного инструмента практически не остается. Не говоря уже о критичности этой программы в настройке проекта. Первоначально инструмент начинался с простого прокси-скрипта, написанного на Python2, чтобы затем развиваться как прокси с плагинами, получил плагин malleable_redirector - и с тех пор я очень старался, чтобы proxy2 поддерживал обратную совместимость с другими плагинами, которые я сделал для него, и придерживаюсь своей первоначальной цели.
Однако пришло время отпустить его, провести ребрендинг и начать исправлять все появившиеся неприятные запахи кода.
С учетом всего вышесказанного, пожалуйста, выразите мне некоторую степень сострадания, когда поднимаете вопросы, отправляете запросы на пул и пытаетесь помочь, а не осуждать!
ЧТО НУЖНО СДЕЛАТЬ
- Изучить возможность использования каналов Threat Intelligence в гнусных целях - например, для обнаружения поставщиков средств безопасности на основе IP-адресов.
- Добавить поддержку базы данных MaxMind GeoIP/API
- Реализовать поддержку подписей JA3 как при обнаружении, так и при блокировке и олицетворении для поддельных настроек nginx/Apache2/пользовательских настроек.
- Добавить уникальную логику отслеживания маячков, чтобы предложить гибкость отказа от промежуточных и коммуникационных процессов по собственному усмотрению прокси.
- Ввести ограничение по времени при предложении возможностей перенаправления (прокси только в рабочее время)
- Добавить логику аутентификации и авторизации прокси на CONNECT/relay.
- Добавить целевое перенаправление мобильных пользователей
- Добавить параметры конфигурации, чтобы определить пользовательские заголовки HTTP, которые должны быть введены, или те, которые будут удалены.
- Добавить параметры конфигурации, чтобы требовать наличия определенных заголовков HTTP в запросах, соответствующих критериям ProxyPass.
- Интерактивный интерфейс, позволяющий вводить простые символы, управляющие подробностью вывода журнала, аналогично Nmap
- Переписать логику парсера профиля на pyMalleableC2. Когда я впервые начал кодить собственную логику парсера, на Github не было такого инструментария.
- Отрефакторить всю кодовую базу
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://github.com/mgeeky/RedWarden