
Роль Ansible для настройки редиректоров для C2 красной команды
Ansible-роль, позволяющая быстро развернуть редиректор на существующем сервере с proxy-правилами mod_rewrite.
Поддерживает Debian и Ubuntu, протестирована в Digital Ocean и Azure.
См. threat.tevora.com/automating-redirector-deployment-with-ansible — блог, в котором рассказывается о редиректорах, Ansible и глубоком погружении в эту роль.
Чтобы начать, клонируйте этот репозиторий, установите Ansible и поместите этот репозиторий в папку roles. Пример плейбука ниже показывает, как настроить конфигурацию экземпляра редиректора.
Пример плейбука для экземпляра provision_redirector_example.yml
- hosts: EnigmaticEmu
gather_facts: False
user: root
pre_tasks:
- name: Install python for Ansible
raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
changed_when: False
- setup: # aka gather_facts
tasks:
- include_role:
name: redirectors
vars:
le_email: '[email protected]'
hop_dir: hops/empire_hop
vhosts: [
{
servername: 'fakeamazon.com',
http_port: 80,
https_port: 443,
c2filters: [
{
rewritefilter: '^/orders/track/?$',
host: '123.124.125.126'
}
],
configs: [
'RewriteRule !\.php$ https://www.amazon.com/%{REQUEST_URI} [L,R=302]'
]
},
{
servername: 'fakegoogle.com',
http_port: 80,
https_port: 443,
config_files: [
"redirectors.txt",
"apache_tweaks.conf"
],
}
]
Разбор примера:
- hosts: EnigmaticEmu
Указывает, на каких хостах будет выполняться плейбук.
Для корректного выполнения плейбука необходимо использовать файл инвентаря с именем хоста или IP-адресом EnigmaticEmu.
gather_facts: False
Задача сбора фактов Ansible ломается на новых версиях Ubuntu без установленного Python 2.
Мы отключаем сбор фактов, чтобы сначала установить Python 2. Это своего рода начальная загрузка для совместимости.
user: root
Указывает, под каким пользователем подключаться к удалённому серверу. Ansible выполняет все настройки через SSH.
Измените на того пользователя, которого хотите использовать.
Если требуется sudo, возможно, нужно добавить become: true и вызвать ansible-playbook с опцией --ask-become-pass.
pre_tasks:
tasks: Теперь мы добрались до главного — задач нашего плейбука!- include_role:
Как вы уже догадались, это указывает на включение роли, а следующая строка name: redirectors задаёт нашу роль redirectors.
vars:
Здесь мы задаём основу конфигурации.
Наш сервер содержит три переменные: le_email, hop_dir и vhosts.
le_email используется для указания адреса электронной почты для Let's Encrypt; убедитесь, что вы контролируете этот адрес.
Помните переменную hop_dir, которую мы использовали в задаче копирования нашей роли? Вот где она определяется! Каталог hop_dir должен находиться в папке ./files/ относительно расположения самого плейбука.
Мы отформатировали эту конфигурацию в основном в JSON (YAML — надмножество JSON), но вы можете отформатировать её как угодно, если она совпадает.
Обратите внимание в конфигурации на наличие нескольких виртуальных хостов, каждый из которых может использовать один или несколько способов указания того, как он встраивается в шаблоны конфигурации.
Мы создаём один конфигурационный файл на виртуальный хост, потому что Let's Encrypt, а точнее компонент certbot-apache, не поддерживает более одного виртуального хоста в одном конфигурационном файле. По этой причине мы будем развёртывать на сервере несколько конфигурационных файлов.
Запуск плейбука
Чтобы запустить роль, создайте плейбук по образцу, который мы разобрали, и выполните ansible-playbook -i <ваш_файл_хостов> <ваш_плейбук>. Убедитесь, что эта роль находится в каталоге roles в том же пути, что и ваш плейбук, а ваши hop- и/или конфигурационные файлы размещены правильно. Структура ваших каталогов должна выглядеть так:
├── my_playbook.yml
├── files
│ └── empire_hop
│ └── news
│ └── login.php
└── roles
├── redirectors
│ ├── files
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ ├── tasks
│ │ ├── apache.yml
│ │ ├── letsencrypt.yml
│ │ └── main.yml
│ ├── templates
│ │ ├── apache_sslvhost.conf.j2
│ │ └── apache_vhost.conf.j2
│ └── vars
hosts: [...]
Наша переменная vhosts — это список словарей конфигурации виртуальных хостов. Это позволяет настроить несколько виртуальных хостов с разными доменами и профилями C2 на одном сервере.
Помните, что эта переменная — список, это важно для того, как мы формируем наши конфигурационные файлы и как используем эти переменные в роли redirectors.
servername: 'fakeamazon.com'
Это имя хоста нашего сервера; у вас должна быть DNS-запись для этого имени, указывающая на IP-адрес сервера.
http_port и https_port — довольно очевидны. Выберите порты, на которых будут работать HTTP и HTTPS.
Обратите внимание: прежде чем продолжить, у нас есть несколько способов определения правил mod_rewrite в конфигурации. Это в основном связано с экспериментами и планами интегрировать этот плейбук с Python API.
c2filters: [...]
Список словарей c2filter.
Любой запрос, URI которого совпадает с rewritefilter, будет проксировать соединение на host.
configs[...]
Список строк конфигурации.
Каждая строка будет добавлена в файл.
config_files[...] имя файла или путь
Список имён файлов или путей. Содержимое каждого файла будет добавлено в Apache.
Полезно для использования результатов инструментов автоматизации mod_rewrite, таких как отличный инструмент @Inspired-Sec: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html