Я уже упоминал о проблемах с изображениями, но ни одно решение не дало результатов, кроме ссылки на аналогичную проблему, которая также не была решена.
Ссылка, которую я пытаюсь вставить:
https://reconshell.com/redwarden-flexible-cobaltstrike-malleable-redirector/
Ссылка на RSS-канал
https://reconshell.com/tag/cobaltstrike/feed/
HTML-код (после обработки):
<figure class="wp-block-image size-large"></figure>
<p><strong><span class="has-inline-color has-vivid-purple-color">C2-прокси обратного типа для Cobalt Strike, который отбивает атаки Blue Teams, антивирусов, EDR-систем и сканеров путем проверки пакетов и сопоставления с гибкими профилями (malleable profiles)</span></strong></p>
<hr class="wp-block-separator">
<p>(ранее известное как плагин <em>malleable_redirector</em> для <a href="https://github.com/mgeeky/proxy2" target="_blank" rel="noopener">proxy2</a>)</p>
<p><strong>Давайте поднимем планку устойчивости C2-редиректоров к расследованиям инцидентов (IR), согласны?</strong></p>
<p>В сфере Red Teaming появилось <a href="https://bluescreenofjeff.com/2016-04-12-combatting-incident-responders-with-apache-mod_rewrite/" target="_blank" rel="noopener">несколько</a> <a href="https://posts.specterops.io/automating-apache-mod-rewrite-and-cobalt-strike-malleable-c2-profiles-d45266ca642" target="_blank" rel="noopener">различных</a> <a href="https://gist.github.com/curi0usJack/971385e8334e189d93a6cb4671238b10" target="_blank" rel="noopener">отличных</a> идей о том, как противостоять специалистам по реагированию на инциденты и вводить их в заблуждение, одновременно предоставляя устойчивую к расследованиям сеть C2-редиректоров.</p>
<p>Эта работа объединяет многие из этих отличных идей в один легкий инструмент, имитирующий Apache2 в своей основе как простой HTTP(S) обратный прокси.</p>
<p>Объединение понимания гибких C2-профилей, знания о пулах «плохих» IP-адресов и гибкости легкого добавления новой логики проверки и перенаправления позволило создать хитрый отпугиватель для проверок со стороны специалистов по реагированию на инциденты.</p>
<figure class="wp-block-image size-large"></figure>
<p>Если какой-либо недопустимый входящий пакет достигнет RedWarden — вы можете <code>перенаправить</code> (redirect), <code>сбросить</code> (reset) или просто <code>проксировать</code> (proxy) его!</p>
<h2><a href="https://github.com/mgeeky/RedWarden#abstract" target="_blank" rel="noopener"></a></h2>
<h2><strong>Аннотация</strong></h2>
<p>Эта программа действует как HTTP/HTTPS обратный прокси с несколькими ограничениями, налагаемыми на входящие C2 HTTP-запросы, выбирая, какие пакеты направлять на Teamserver, а какие отбрасывать, аналогично ограничениям файла .htaccess, предписанным в <code>mod_rewrite</code> Apache2.</p>
<p><code>RedWarden</code> был создан для решения проблемы обхода IR/AV/EDR/песочниц на уровне C2-редиректора. Он предназначен для замены классических конфигураций Apache2 + mod_rewrite, используемых для этой цели.</p>
<p><strong>Возможности:</strong></p>
<ul><li>Парсер гибких C2-профилей (Malleable C2 Profile), способный строго валидировать входящие HTTP/S-запросы согласно контракту профиля и отбрасывать пакеты, нарушающие его (покрывает Malleable Profiles 4.0+ с вариантами)</li><li>Возможность отфильтровывать/восстанавливать неожиданные и нежелательные HTTP-заголовки, добавленные промежуточными системами, такими как прокси и кэши (например, CloudFlare), чтобы соответствовать валидному контракту Malleable.</li><li>Интегрированный тщательно подобранный черный список IPv4-пулов и диапазонов, известных как принадлежащие поставщикам ИБ</li><li>Записи журнала в формате, удобном для grep (как в комбинированном журнале доступа Apache2, так и в собственном формате RedWarden), полезные для отслеживания событий/проблем подключения пиров</li><li>Возможность запрашивать IPv4-адрес подключающегося пира через сервисы геолокации/whois и сопоставлять его с заранее определенными регулярными выражениями, чтобы исключить пиров, подключающихся из недоверенных организаций/стран/городов и т.д.</li><li>Встроенная защита от атак повторного воспроизведения (Replay attacks), обеспечиваемая логированием MD5-хэшей принятых запросов в локальную SQLite-базу данных и предотвращением повторных запросов.</li><li>Позволяет определять директивы ProxyPass для передачи запросов, соответствующих определенным URL, на другие хосты</li><li>Поддержка нескольких Teamserver</li><li>Поддержка множества хостов/сайтов для обратного проксирования, перечисляемых в случайном порядке, что позволяет балансировать нагрузку или создавать более разветвленную инфраструктуру</li><li>Может восстанавливать HTTP-пакеты в соответствии с ожидаемым контрактом Malleable, если некоторые заголовки были повреждены в трафике</li><li>Бессонные ночи, проведенные за отладкой «почему мой Beacon не работает через CloudFlare/CDN/Domain Fronting», остались позади благодаря подробным логам HTTP(S) запросов/ответов</li></ul>
<p>RedWarden принимает на вход профиль Malleable C2 и <code>hostname:port</code> teamserver. Затем он парсит предоставленные разделы профиля Malleable, чтобы понять контракт и пропускать только те входящие запросы, которые ему соответствуют, вводя в заблуждение остальные.</p>
<p>Разделы, такие как <code>http-stager</code>, <code>http-get</code>, <code>http-post</code> и их соответствующие URI, заголовки, паттерны prepend/append, User-Agent, используются для различения легитимных запросов beacon и постороннего интернет-шума или пакетов IR/AV/EDR, выходящих за рамки допустимого.</p>
<p>Программа использует известные «плохие» диапазоны IP-адресов от curi0usJack и других:</p>
<pre class="wp-block-preformatted">https://gist.github.com/curi0usJack/971385e8334e189d93a6cb4671238b10</pre>
<p>Использование черного списка IP-адресов вместе с поиском известных «плохих» ключевых слов через обратные DNS-запросы и проверку HTTP-заголовков значительно повышает надежность и устойчивость редиректора к несанкционированным пирам, желающим изучить инфраструктуру атакующего.</p>
<p>Недопустимые пакеты могут быть перенаправлены согласно одной из трех стратегий:</p>
<ul><li><strong>redirect</strong>: Просто перенаправить пира на другой сайт, например, на Rick Roll.</li><li><strong>reset</strong>: Немедленно разорвать TCP-соединение.</li><li><strong>proxy</strong>: Получить ответ с другого сайта, чтобы максимально точно имитировать клонированный/захваченный сайт.</li></ul>
<p>Эта конфигурация задается в файле конфигурации:</p>
<pre class="wp-block-preformatted">#
# Что делать с запросами, не соответствующими Beacon, whitelist или
# инклюзивным директивам ProxyPass:
# - 'redirect' на другой хост (HTTP 301),
# - 'reset' TCP-соединение с подключающимся клиентом
# - 'proxy' запрос, действуя как обратный прокси для указанного action_url
# (может быть опасно, если клиент получит доступ к тому, что не должен видеть!)
#
# Допустимые значения: 'reset', 'redirect', 'proxy'.
#
# По умолчанию: redirect
#
drop_action: redirect</pre>
<p>Ниже приведен пример результата <code>redirect</code> на <code>https://googole.com</code>:</p>
<figure class="wp-block-image size-large"></figure>
<p>Используйте с умом, оставайтесь в безопасности.</p>
<h3><a href="https://github.com/mgeeky/RedWarden#requirements" target="_blank" rel="noopener"></a></h3>
<h3><strong><span class="has-inline-color has-vivid-cyan-blue-color">Требования</span></strong></h3>
<p>Эта программа может работать только в системах Linux, так как использует fork для создания нескольких процессов.</p>
<p>Также ожидается, что системная команда <code>openssl</code> будет установлена, так как она используется для генерации SSL-сертификатов.</p>
<p>Наконец, установите все зависимости Python3 PIP легко с помощью:</p>
<pre class="wp-block-preformatted">bash $ sudo pip3 install -r requirements.txt</pre>
<h2><a href="https://github.com/mgeeky/RedWarden#usage" target="_blank" rel="noopener"></a></h2>
<h2>Использование</h2>
<h3><a href="https://github.com/mgeeky/RedWarden#example-usage" target="_blank" rel="noopener"></a></h3>
<h3><span class="has-inline-color has-vivid-cyan-blue-color">Пример использования</span></h3>
<p>Минимальный файл конфигурации <strong>config.yaml</strong> RedWarden может содержать:</p>
<pre class="wp-block-preformatted">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</pre>
<p>Затем программу можно запустить, указав путь к файлу конфигурации:</p>
<pre class="wp-block-preformatted">bash$ sudo python3 RedWarden.py -c config.yaml
[INFO] 19:21:42: Загрузка 1 плагина...
[INFO] 19:21:42: Плагин "malleable_redirector" установлен.
[INFO] 19:21:42: Подготовка SSL-сертификатов и ключей для перехвата HTTPS-трафика...
[INFO] 19:21:42: Использование предоставленного файла ключа CA: ca-cert/ca.key
[INFO] 19:21:42: Использование предоставленного файла сертификата CA: ca-cert/ca.crt
[INFO] 19:21:42: Использование предоставленного ключа сертификата: ca-cert/cert.key
[INFO] 19:21:42: Запуск HTTP-прокси на: 0.0.0.0, порт: 80...
[INFO] 19:21:42: Запуск HTTPS-прокси на: 0.0.0.0, порт: 443...
[INFO] 19:21:42: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:21:42: == Валидный входящий запрос malleable http-get.
[INFO] 19:21:42: Плагин перенаправил запрос с [code.jquery.com] на [1.2.3.4:8080]
[INFO] 19:21:42: [RESPONSE] HTTP 200 OK, длина: 5543
[INFO] 19:21:45: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:21:45: == Валидный входящий запрос malleable http-get.
[INFO] 19:21:45: Плагин перенаправил запрос с [code.jquery.com] на [1.2.3.4:8080]
[INFO] 19:21:45: [RESPONSE] HTTP 200 OK, длина: 5543
[INFO] 19:21:46: [REQUEST] GET /
[...]
[ERROR] 19:24:46: [DROP, reason:1] Входящий User-Agent отличается от определенного в C2-профиле.
[...]
[INFO] 19:24:46: [RESPONSE] HTTP 301 Moved Permanently, длина: 212
[INFO] 19:24:48: [REQUEST] GET /jquery-3.3.1.min.js
[INFO] 19:24:48: == Валидный входящий запрос malleable http-get.
[INFO] 19:24:48: Плагин перенаправил запрос с [code.jquery.com] на [1.2.3.4:8080]
[...]</pre>
<p>В приведенном выше выводе есть строка, указывающая на то, что был получен несанкционированный входящий запрос, не соответствующий нашему C2-профилю, который был отброшен из-за несовместимой строки User-Agent:</p>
<pre class="wp-block-code"><code> [...]
[DROP, reason:1] Входящий User-Agent отличается от определенного в C2-профиле.
[...]
</code></pre>
<h2><a href="https://github.com/mgeeky/RedWarden#use-cases" target="_blank" rel="noopener"></a></h2>
<h2><strong>Сценарии использования</strong></h2>
<h3><a href="https://github.com/mgeeky/RedWarden#impose-ip-geolocation-on-your-beacon-traffic-originators" target="_blank" rel="noopener"></a></h3>
<h3><span class="has-inline-color has-vivid-cyan-blue-color">Наложение ограничений по геолокации IP на источники трафика Beacon</span></h3>
<p>Вы отлично провели Pre-Phish и OSINT. Теперь вы знаете, где находятся ваши цели, и имеете подсказки, откуда должен исходить трафик, или хотя бы как обнаруживать полностью посторонний трафик. Как наложить ограничения по геолокации IP на запросы Beacon на редиректоре?</p>
<p>RedWarden приходит на помощь!</p>
<p>Допустим, вы хотите принимать только трафик, исходящий из Польши, Европа. Результаты вашего Pre-Phish/OSINT указывают на то, что:</p>
<ul><li><code>89.64.64.150</code> — это легитимный IP одной из ваших целей, исходящий из Польши</li><li><code>59.99.140.76</code> — этот же IP не является легитимным и достиг ваших систем как обычный пакет интернет-шума.</li></ul>
<p>Вы можете использовать утилиту RedWarden <code>lib/ipLookupHelper.py</code> для сбора метаданных геолокации IP об этих двух адресах:</p>
<pre class="wp-block-preformatted">bash$ python3 ipLookupHelper.py
Использование: ./ipLookupHelper.py <ipaddress> [malleable-redirector-config]
Используйте эту небольшую утилиту для сбора деталей поиска IP по целевому IPv4-адресу и проверки того, соответствует ли он
разделу 'ip_geolocation_requirements' в файле конфигурации proxy2 malleable-redirector-config.yaml. Если второй параметр не указан — проверка не </ipaddress></pre>
<p>Первый запрос выдает:</p>
<pre class="wp-block-preformatted">bash$ python3 ipLookupHelper.py 89.64.64.150
[dbg] Будут использованы следующие провайдеры поиска IP: ['ip_api_com', 'ipapi_co']
[.] Поиск для: 89.64.64.150
[dbg] Вызов провайдера поиска IP: ipapi_co
[dbg] Вызов провайдера поиска IP: ip_api_com
[dbg] Новый элемент поиска IP закэширован: 89.64.64.150
[.] Вывод:
{
"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"
}</pre>
<p>а второй выдает:</p>
<pre class="wp-block-preformatted">bash$ python3 ipLookupHelper.py 59.99.140.76
[dbg] Будут использованы следующие провайдеры поиска IP: ['ip_api_com', 'ipapi_co']
[dbg] Прочитано 1 закэшированных элемента из файла.
[.] Поиск для: 59.99.140.76
[dbg] Вызов провайдера поиска IP: ip_api_com
[dbg] Новый элемент поиска IP закэширован: 59.99.140.76
[.] Вывод:
{
"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": ""
}</pre>
<p>Теперь вы видите, что у первого <code>"country": "Poland"</code>, а у второго <code>"country": "India"</code>. Имея эти знания, мы готовы разработать наши ограничения в виде объемного словаря YAML:</p>
<pre class="wp-block-preformatted">ip_geolocation_requirements:
organization:
continent:
continent_code:
country:
- Poland
- PL
- Polska
country_code:
city:
timezone:</pre>
<p>Каждый из элементов этого словаря принимает регулярное выражение для сопоставления с определенными метаданными геолокации IP входящего пира. Мы используем три элемента в свойстве <code>country</code>, чтобы разрешить запросы, имеющие одно из указанных значений.</p>
<p>После настройки этого в вашей конфигурации, вы можете проверить, пройдет ли другой IP-адрес через дискриминатор геолокации IP RedWarden или нет, с помощью утилиты <code>ipLookupHelper</code>, принимающей второй параметр:</p>
<figure class="wp-block-image size-large"></figure>
<p>Самая последняя строка говорит вам, будет ли пакет заблокирован или принят.</p>
<p>И это все! Настраивайте ограничения геолокации IP разумно и безопасно, внимательно проверяйте логи RedWarden на наличие записей DROP, связанных с геолокацией IP, и держите свой C2-трафик чистым!</p>
<h3><a href="https://github.com/mgeeky/RedWarden#repair-tampered-beacon-requests" target="_blank" rel="noopener"></a></h3>
<h3><strong><span class="has-inline-color has-vivid-cyan-blue-color">Восстановление поврежденных запросов Beacon</span></strong></h3>
<p>Если вы используете промежуточные системы, такие как AWS Lambda или CloudFlare, для Domain Fronting / редиректоров, вы наверняка сталкивались с ситуацией, когда некоторые из ваших пакетов не принимались Teamserver, так как они отклонялись от согласованного контракта Malleable. Был ли это поврежденный или удаленный HTTP-заголовок, переставленные куки или что-то еще — я уверен, что это отняло у вас много часов жизни.</p>
<p>Для борьбы с проблемами настройки C2-каналов и вмешательства промежуточных систем, RedWarden предлагает функциональность восстановления пакетов Beacon.</p>
<p>Он делает это, проверяя, каким должен быть пакет согласно Malleable Profile, и может восстановить настроенные HTTP-заголовки к их согласованным значениям в соответствии с требованиями профиля.</p>
<p>Рассмотрим следующий простой профиль:</p>
<pre class="wp-block-preformatted">http-get {
set uri "/api/abc";
client {
header "Accept-Encoding" "gzip, deflate";
metadata {
base64url;
netbios;
base64url;
parameter "auth";
}
}
...</pre>
<p>Вы видите этот <code>Accept-Encoding</code>? Каждый запрос Beacon должен содержать этот заголовок и это значение. Что произойдет, если ваш Beacon попадет в системы CloudFlare, и они выпустят запрос, из которого будет удален этот заголовок или в котором будет <code>Accept-Encoding: gzip</code> вместо указанного? Teamserver немедленно отбросит запрос.</p>
<p>Установив этот заголовок в разделе конфигурации RedWarden под названием <code>protect_these_headers_from_tampering</code>, вы можете спасти свое соединение:</p>
<pre class="wp-block-preformatted">#
# Если RedWarden валидирует HTTP-заголовки входящего запроса согласно политике drop_malleable_without_expected_header_value:
# "[IP: DROP, reason:6] HTTP-запрос не содержал ожидаемого значения заголовка:"
#
# и обнаруживает, что какой-то заголовок отсутствует или был перезаписан по пути, запрос будет отброшен. Однако мы можем немного ослабить эту политику,
# так как есть ситуации, когда кэш-системы (такие как Cloudflare) могут вмешиваться в наши запросы, тем самым
# нарушая контракты Malleable. Что мы можем сделать, так это указать список заголовков, значения которых должны быть перезаписаны обратно
# на те, что определены в предоставленном Malleable-профиле.
#
# Так, например, если наш профиль ожидает:
# header "Accept-Encoding" "gzip, deflate";
#
# но мы получаем запрос с установленным следующим заголовком:
# Accept-Encoding: gzip
#
# Поскольку он был поврежден по пути какой-то из промежуточных систем (таких как веб-прокси или кэши), мы можем
# обнаружить это и установить значение этого заголовка обратно на то, которое ожидалось в Malleable-профиле.
#
# Для защиты заголовка Accept-Encoding, например, можно использовать следующую конфигурацию:
# protect_these_headers_from_tampering:
# - Accept-Encoding
#
#
# По умолчанию: <empty-list>
#
protect_these_headers_from_tampering:
- Accept-Encoding</empty-list></pre>
<h3><a href="https://github.com/mgeeky/RedWarden#example-outputs" target="_blank" rel="noopener"></a></h3>
<h3><strong><span class="has-inline-color has-vivid-cyan-blue-color">Примеры вывода</span></strong></h3>
<p>Давайте посмотрим на вывод, который генерирует прокси.</p>
<p>При опции <code>verbose: True</code> уровень детализации будет установлен на INFO, показывая различие между принятыми и отброшенными запросами.</p>
<p>Запрос может быть принят, если он соответствует всем критериям, настроенным в файле конфигурации RedWarden. Такая ситуация будет сопровождаться записью в логе <code>[ALLOW, ...]</code>:</p>
<pre class="wp-block-preformatted">[INFO] 2021-04-24/17:30:48: [REQUEST] GET /js/scripts.js
[INFO] 2021-04-24/17:30:48: == Валидный входящий запрос malleable http-get (вариант: default).
[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: Подключенный пир отправил 2 валидных запроса http-get и 0 валидных запросов http-post, из 15/5 необходимых для временного доверия
[INFO] 2021-04-24/17:30:48: Плагин перенаправил запрос с [attacker.com] на [127.0.0.1:5555]</pre>
<p>Если запрос не пройдет какую-либо из проверок, которые RedWarden выполняет для каждого запроса, будет выведена соответствующая строка <code>[DROP, ...]</code>, содержащая информацию о причине сброса <strong>reason</strong>:</p>
<pre class="wp-block-preformatted">[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] Входящий User-Agent отличается от определенного в C2-профиле.
[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 /</pre>
<h3><a href="https://github.com/mgeeky/RedWarden#drop-policies-fine-tuning" target="_blank" rel="noopener"></a></h3>
<h3><strong><span class="has-inline-color has-vivid-cyan-blue-color">Тонкая настройка политик сброса</span></strong></h3>
<p>Существует множество причин, по которым запрос может быть отброшен. Каждая из этих проверок может быть независимо включена или выключена в соответствии с требованиями или в процессе тонкой настройки или исправления ошибочных решений:</p>
<p>Выдержка из <code>example-config.yaml</code>:</p>
<pre class="wp-block-preformatted">#
# Детализированная политика сброса запросов - позволяет решить, какие проверки
# вы хотите强制执行, а какие пропустить, установив их в False
#
# По умолчанию: все проверки включены
#
policy:
# [IP: ALLOW, reason:0] Запрос соответствует записи ProxyPass (url="..." host="..."). Передача запроса на указанный хост
allow_proxy_pass: True
# [IP: ALLOW, reason:2] IP пира был динамически добавлен в белый список на основе количества разрешенных запросов
allow_dynamic_peer_whitelisting: True
# [IP: DROP, reason:1] Входящий User-Agent отличается от определенного в C2-профиле.
drop_invalid_useragent: True
# [IP: DROP, reason:2] Имя HTTP-заголовка содержало запрещенное слово
drop_http_banned_header_names: True
# [IP: DROP, reason:3] Значение HTTP-заголовка содержало запрещенное слово:
drop_http_banned_header_value: True
# [IP: DROP, reason:4b] Обратный поиск IP пира содержал запрещенное слово
drop_dangerous_ip_reverse_lookup: True
# [IP: DROP, reason:4e] Метаданные геолокации IP пира содержали запрещенное ключевое слово! Пир заблокирован в общем порядке.
drop_ipgeo_metadata_containing_banned_keywords: True
# [IP: DROP, reason:5] HTTP-запрос не содержал ожидаемый заголовок
drop_malleable_without_expected_header: True
# [IP: DROP, reason:6] HTTP-запрос не содержал ожидаемое значение заголовка:
drop_malleable_without_expected_header_value: True
# [IP: DROP, reason:7] HTTP-запрос не содержал ожидаемый заголовок раздела (metadata|id|output):
drop_malleable_without_expected_request_section: True
# [IP: DROP, reason:8] HTTP-запрос должен был содержать раздел (metadata|id|output) с параметром в URI:
drop_malleable_without_request_section_in_uri: True
# [IP: DROP, reason:9] Не найден паттерн prepend:
drop_malleable_without_prepend_pattern: True
# [IP: DROP, reason:10] Не найден паттерн append:
drop_malleable_without_apppend_pattern: True
# [IP: DROP, reason:11] Запрошенный URI не соответствует ни одному из определенных в Malleable вариантов:
drop_malleable_unknown_uris: True
# [IP: DROP, reason:12] HTTP-запрос должен был содержать раздел <> с URI-append, содержащим фрагменты prepend/append
drop_malleable_with_invalid_uri_append: True</pre>
<p>По умолчанию все эти проверки强制执行.</p>
<p>Включение <code>debug: True</code> завалит ваш буфер консоли множеством строк журнала, описывающих каждый шаг, который RedWarden делает в своем сложном процессе принятия решений. Если вы хотите видеть полные тела ваших запросов и ответов — установите <code>debug</code> и <code>trace</code> в true и погрузитесь в логирование!</p>
<h2><a href="https://github.com/mgeeky/RedWarden#faq" target="_blank" rel="noopener"></a></h2>
<h2><strong><span class="has-inline-color has-vivid-cyan-blue-color">Часто задаваемые вопросы (FAQ)</span></strong></h2>
<p><strong>– Может ли эта программа работать без Malleable Profile?</strong></p>
<p>Да, может. Однако логика проверки запросов будет отключена, остальное должно работать нормально: принудительная геолокация IP, логика обратного поиска, черный список IP и т.д.</p>
<p><strong>– Может ли эта программа быть легко адаптирована для других C2-фреймворков? Например, Mythic, Covenant и т.д.?</strong></p>
<p>Легко — нет. С некоторыми усилиями — да. Как я описал ниже, инструмент написан плохо, что сделает адаптацию для других C2 болезненной. Однако это вполне выполнимо при наличии времени и усилий.</p>
<p><strong>– Мои пакеты отбрасываются. Почему?</strong></p>
<p>Попробуйте включить <code>debug: True</code> и <code>trace: True</code>, чтобы собрать как можно больше логов. Затем вам нужно будет просмотреть логи и проверить, что происходит. Выглядят ли пакеты именно так, как вы ожидали в вашем Malleable-профиле? Или, возможно, было тонкое вмешательство по сети, которое заставило RedWarden отбросить пакет (и это могло заставить Teamserver отбросить его тоже)?</p>
<h2><a href="https://github.com/mgeeky/RedWarden#known-issues" target="_blank" rel="noopener"></a></h2>
<h2><strong><span class="has-inline-color has-vivid-cyan-blue-color">Известные проблемы</span></strong></h2>
<ul><li>Он <em>может</em> добавить небольшое снижение производительности интерактивного сна (sleep throughput)</li><li>Логика обработки ProxyPass далека от идеала и <em>очень</em> баговата (и, о боже, как она некрасива!).</li><li>Странные формы файлов конфигурации могут сломать парсер RedWarden и заставить его жаловаться. Самый простой способ преодолеть это — скопировать <code>example-config.yaml</code> и работать с ним.</li></ul>
<h2><a href="https://github.com/mgeeky/RedWarden#oh-my-god-why-is-this-code-such-an-engineerical-piece-of-crap" target="_blank" rel="noopener"></a></h2>
<h2><span class="has-inline-color has-vivid-cyan-blue-color"><strong>О боже, почему этот код такой инженерный мусор?</strong></span></h2>
<p>Код — <em>ОДНА БОЛЬШАЯ АДСКАЯ КАТАСТРОФА</em> — я признаю это — и для этого есть честная причина: проект разрабатывался на 90% во время реальных Red Team-операций. Как мы все знаем, такие операции требуют выполнения множества задач, оставляя почти нет времени для правильной разработки сложного инструмента. Не говоря уже о критичности этой программы в настройке проекта. Инструмент изначально начал как простой прокси-скрипт, написанный на Python2, чтобы затем эволюционировать в прокси с плагинами, получив плагин <code>malleable_redirector</code> — и с тех пор я очень старался сохранить обратную совместимость <code>proxy2</code> (бедный я, я был как Microsoft!) с другими плагинами, которые я сделал для него, и придерживаться его первоначального назначения.</p>
<p>Но пришло время отпустить его, переименовать и начать исправлять все плохие кодовые запахи, которые были введены.</p>
<p>С учетом всего сказанного, пожалуйста, проявите некоторую степень сострадания ко мне при создании issue, отправке pull request и постарайтесь помочь, а не осуждать!  Спасибо!</p>
<h2><a href="https://github.com/mgeeky/RedWarden#todo" target="_blank" rel="noopener"></a></h2>
<h2><strong><span class="has-inline-color has-vivid-cyan-blue-color">Планы (TODO)</span></strong></h2>
<ul><li>Исследовать возможность использования фидов Threat Intelligence в зловещих целях — например, для обнаружения поставщиков ИБ на основе IP</li><li>Добавить поддержку базы данных/API MaxMind GeoIP</li><li>Реализовать поддержку сигнатур JA3 как для обнаружения и блокировки, так и для имитации поддельных nginx/Apache2/пользовательских конфигураций.</li><li>Добавить некоторую уникальную логику отслеживания beacons, чтобы предложить гибкость отказа от процессов staging и связи по усмотрению прокси</li><li>Ввести ограничение по времени суток при предоставлении возможностей перенаправления (<em>проксировать только в рабочее время</em>)</li><li>Добавить логику аутентификации и авторизации прокси для CONNECT/relay.</li><li>Добавить перенаправление для мобильных пользователей</li><li>Добавить опции конфигурации для определения пользовательских HTTP-заголовков, которые нужно внедрять, или тех, которые нужно удалять</li><li>Добавить опции конфигурации для требования наличия конкретных HTTP-заголовков в запросах, проходящих критерии ProxyPass.</li><li>Интерактивный интерфейс, позволяющий вводить простые символы для управления детализацией вывода журнала, аналогично Nmap</li><li>Переписать логику парсера Malleable-профилей на <a href="https://github.com/Porchetta-Industries/pyMalleableC2" target="_blank" rel="noopener">pyMalleableC2</a>. Когда я впервые начал писать свою логику парсера, такого набора инструментов на Github не было.</li><li>Рефакторинг всей кодовой базы</li></ul>
<h2><a href="https://github.com/mgeeky/RedWarden#author" target="_blank" rel="noopener"></a></h2>
<h2><strong><span class="has-inline-color has-pale-pink-color">Автор</span></strong></h2>
<pre class="wp-block-preformatted">Mariusz B. / mgeeky, '19-'21
<mb@binary-offensive.com></mb@binary-offensive.com></pre>
<hr class="wp-block-separator">
<div class="wp-block-buttons">
<div class="wp-block-button"><a class="wp-block-button__link" href="https://github.com/mgeeky/RedWarden" style="border-radius:6px" target="_blank" rel="noopener"><strong>Ссылка на Github</strong></a></div>
<div class="wp-block-button"><a class="wp-block-button__link" href="https://reconshell.com/best-arduino-books-available-for-developers/" style="border-radius:6px"><strong>Лучшие книги по Arduino для разработчиков</strong></a></div>
</div>
<p></p>
<hr>
<small>Это сопутствующая тема обсуждения для оригинальной записи по адресу <a href="https://reconshell.com/redwarden-flexible-cobaltstrike-malleable-redirector/">https://reconshell.com/redwarden-flexible-cobaltstrike-malleable-redirector/</a>. Вы можете начать обсуждение этой темы, упомянув её или ответив здесь.</small>
После недели поисков и отсутствия результатов, кроме как от нашего друга, который посоветовал мне руководство с фразой «не загружать изображения на сервер», и RSS будет показывать небольшой краткий обзор темы (что не является моим выбором), и другое решение, когда я исправляю картинку с помощью «пустой» вкладки.. так что:
<figure class="wp-block-image size-large"></figure>
должно перейти в

и это должно быть сделано для всей темы, чтобы исправить изображения; о чем я все еще удивляюсь, почему “discourse” не может сделать маленький плагин, если они не хотели ломать правила темы;
также после редактирования фотографий возникает больше конфликтов и совсем некомфортно, изображения снова ломаются без причины, и мне нужно переделывать редактирование и выбирать «вернуть к ревизии», чтобы исправить изображение, и так далее!!
я считаю, что эта ошибка/проблема существует с 2020 года, и они обещали что-то сделать в следующем году, “2021”, а мы уже в “2022”.. и ошибка все еще не исправлена… пожалуйста, не говорите, что это не важно, так как это сравнивается с “wordpress”, который является 1-й CMS в мире.. и discourse должен следовать его примеру.