
レッドチームC2向けリダイレクタを設定するAnsibleロール
Ansibleロール。既存のサーバーにmod_rewriteプロキシルールを用いたリダイレクタを迅速にデプロイできます。
DebianおよびUbuntuをサポート、Digital OceanとAzureでテスト済み。
リダイレクタ、Ansible、および本ロールの詳細な解説については、threat.tevora.com/automating-redirector-deployment-with-ansible のブログを参照してください。
開始するには、このリポジトリをクローンし、Ansibleをインストールし、このリポジトリをrolesフォルダに配置します。リダイレクタインスタンスの設定方法の例として、以下のサンプルプレイブックを参照してください。
Instance Playbook Sample 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
これはプレイブックが実行されるホストを指定します。
このプレイブックが正しく実行されるためには、hostnameまたはEnigmaticEmuのIPが定義されたインベントリファイルを使用する必要があります。
gather_facts: False
新しいバージョンのUbuntuでPython 2がインストールされていない場合、Ansibleのgather_factsタスクが失敗します。
gather_factsを無効にして、最初にPython 2をインストールできるようにします。これは互換性を確保するためのブートストラップ処理です。
user: root
リモートサーバーにログオンするユーザーを指定します。Ansibleはすべての設定をSSH経由で実行します。
使用したい任意のユーザーに変更してください。
*sudoが必要な場合は、become: true を追加し、--ask-become-pass を付けてansible-playbookを実行する必要があるかもしれません。
pre_tasks:
tasks: ここからが本番です。プレイブックのタスクです。- include_role:
ご想像の通り、これはインクルードするロールを指定し、次の行 name: redirectors でリダイレクタロールをインクルードします。
vars:
ここで設定の核心部分を記述します。
サーバーには3つの変数(le_email、hop_dir、vhosts)があります。
Le emailはLet's Encryptで使用するメールアドレスを指定します。自分が管理しているものを使用してください。
ロールのコピータスクで使用したhop_dirはここで定義されます。hop dirはプレイブック自身の位置から相対パスの ./files/ に配置してください。
hosts: [...]
vhosts変数はvhost設定辞書のリストです。これにより、サーバーごとに異なるドメインとC2プロファイルを持つ複数のvhostをセットアップできます。
この変数はリストであることに注意してください。これは設定ファイルのテンプレート化や、リダイレクタロール内でこれらの変数を使用する他の方法において重要です。
servername: 'fakeamazon.com'
サーバーのホスト名です。このホスト名がサーバーのIPを指すDNSレコードが必須です。
http_port および https_port は説明不要です。httpとhttpsがリッスンするポートを選択してください。
先に進む前に、設定内でmod rewriteルールを定義する方法が複数あることに注意してください。これは主に実験と、このプレイブックをPython APIと統合する計画によるものです。
c2filters: [...]
c2filter辞書のリストです。
URIが rewritefilter に一致するリクエストは、host への接続をプロキシします。
configs[...]
設定文字列のリストです。
各文字列がファイルに追加されます。
config_files[...] ファイル名またはパス
ファイル名またはパスのリストです。各ファイルの内容がApacheに追加されます。
@Inspired-Secの素晴らしいツール(https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html)のようなmod_rewrite自動化ツールの出力を活用するのに便利です。
この設定は主にJSON形式で記述しています(YAMLはJSONのスーパーセットです)が、整合性が取れていれば好きな形式で記述できます。
設定内に複数のvhostがあり、それぞれが設定テンプレートへの注入方法を1つまたは複数指定できることに注意してください。
vhostごとに1つの設定ファイルを作成しています。これは、Let's Encrypt(特にcertbot-apacheコンポーネント)が1つの設定ファイルで複数のvhostをサポートしていないためです。そのため、複数の設定ファイルをサーバーにプロビジョニングします。
Playbookの実行
ロールを実行するには、説明した例の形式でプレイブックを作成し、ansible-playbook -i <your_hosts_file> <your_playbook> を実行します。このロールがプレイブックと同じパスの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