Ansible角色,可快速将转发器部署到现有服务器,并配置mod_rewrite代理规则。
支持Debian和Ubuntu,已在Digital Ocean和Azure上测试。
详见博客文章threat.tevora.com/automating-redirector-deployment-with-ansible,其中介绍了转发器、Ansible以及本角色的深入讲解。
开始使用前,请克隆此仓库,安装Ansible,并将此仓库放置在角色的文件夹中。以下示例playbook展示了如何配置转发器实例。
实例Playbook示例 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
指定playbook将在哪些主机上执行。
要使此playbook正确执行,必须使用一个库存文件,其中定义主机名或IP指向engigmatic emu。
gather_facts: False
Ansible的gather facts任务在未安装Python 2的新版Ubuntu上会失败。
我们禁用gather facts,以便首先确保安装Python 2。这仅是一些兼容性引导配置。
user: root
指定登录远程服务器的用户。Ansible通过SSH执行所有配置。
请将此更改为您要使用的任意用户。
*如果需要sudo,可能需要添加become: true并使用--ask-become-pass调用ansible-playbook。
pre_tasks:
这些行用于安装Python 2(如果不存在)并运行gather facts。
tasks: 现在进入正题——playbook的任务!
- include_role:
顾名思义,指定要包含的角色,下一行name: redirectors指定包含我们的redirectors角色。
vars:
这里定义配置的核心部分。
我们的服务器包含三个变量:le_email、hop_dir和vhosts。
le_email用于指定我们用于Let's Encrypt的电子邮件地址,请确保使用您可控制的邮箱。
还记得我们在角色的copy任务中使用的hop_dir吗?就是在这里定义的!hop_dir应位于相对于playbook所在位置的./files/目录下。
hosts: [...]
vhosts变量是vhost配置字典的列表。这样我们就可以为每个服务器设置多个具有不同域名和C2配置文件的虚拟主机。
请记住此变量是一个列表,因为它在我们的redirectors角色中用于模板配置文件及其他用途时将非常重要。
servername: 'fakeamazon.com'
这是服务器的hostname,您必须有一条DNS记录将该hostname指向服务器的IP地址。
http_port 和 https_port 不言自明。选择HTTP和HTTPS监听的端口。
注意,在继续之前,我们在配置中有多种定义mod rewrite规则的方式。这主要源于实验,以及计划将此playbook与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
我们将此配置主要格式化为JSON(YAML是JSON的超集),但您可以根据需要以任何格式编写,只要匹配即可。
注意配置中有多个虚拟主机,每个主机可以使用一种或多种指定注入配置模板的方式。
我们为每个虚拟主机创建一个配置文件,因为Let's Encrypt(具体来说是certbot-apache组件)不支持一个配置文件包含多个虚拟主机。因此,我们将向服务器提供多个配置文件。
运行Playbook
要运行角色,请按照我们上面示例的形式创建playbook,然后运行ansible-playbook -i <your_hosts_file> <your_playbook>。确保此角色位于与playbook相同路径下的roles目录中,并且您的hop和/或config文件已正确放置。您的目录结构应如下所示:
├── 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