
Role Ansible para configurar redirecionadores para C2 de red team
Role Ansible que permite implantar rapidamente um redirector num servidor existente com regras de proxy mod_rewrite,
Suporta Debian e Ubuntu, testado na Digital Ocean e no Azure.
Consulte threat.tevora.com/automating-redirector-deployment-with-ansible para um artigo de blog que aborda redirectors, ansible e um mergulho a fundo neste role.
Para começar, clone este repositório, instale o ansible e coloque este repositório na sua pasta de roles. Veja abaixo o playbook de exemplo que mostra como construir a configuração da sua instância de redirector.
Exemplo de Playbook de Instância 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"
],
}
]
Análise do exemplo:
- hosts: EnigmaticEmu
Isto especifica os hosts em que o playbook será executado.
Para que este playbook seja executado corretamente, deve ser utilizado um ficheiro de inventário com o hostname ou IP do EnigmaticEmu definido.
gather_facts: False
A tarefa gather facts do ansible falha nas versões mais recentes do Ubuntu sem python 2 instalado.
Desativamos o gather facts para garantir que o python 2 seja instalado primeiro. Isto é apenas um mecanismo de arranque/compatibilidade.
user: root
Isto especifica com que utilizador iniciar sessão no servidor remoto; o ansible realiza todas as suas configurações através de ssh.
Altere isto para o utilizador que quiser usar.
*se precisar de sudo, poderá ser necessário adicionar become: true e chamar o ansible-playbook com --ask-become-pass
pre_tasks:
tasks: Agora chegámos à parte boa: as tarefas do nosso playbook!- include_role:
Como pode imaginar, isto especifica um role a incluir, e a linha seguinte name: redirectors especifica a inclusão do nosso role redirectors.
vars:
É aqui que fazemos o essencial da nossa configuração.
O nosso servidor contém três vars: le_email, hop_dir e vhosts.
O le_email é usado para especificar o endereço de email que utilizamos para o lets_encrypt; certifique-se de usar um que controla.
Lembra-se do hop_dir que usámos na tarefa de cópia do nosso role? É aqui que é definido! O diretório hop deve estar localizado em ./files/ em relação ao local do próprio playbook.
hosts: [...]
A nossa variável vhosts é uma lista de dicionários de configuração de vhosts. Isto permite configurar vários vhosts com diferentes domínios e perfis C2 por servidor.
Lembre-se de que esta variável é uma lista, pois será importante na forma como geramos os nossos ficheiros de configuração e noutras formas de usar estas variáveis no nosso role redirectors.
servername: 'fakeamazon.com'
Este é o hostname do nosso servidor, e TEM de ter um registo DNS para este hostname a apontar para o IP do servidor.
http_port e https_port são bastante autoexplicativos. Escolha em que portas o http e o https vão escutar.
Repare que, antes de continuarmos, temos várias formas de definir regras mod rewrite na configuração. Isto deve-se em grande parte à experimentação e aos planos de integrar este playbook com uma API Python.
c2filters: [...]
Uma lista de dicionários c2filter.
Qualquer pedido cujo URI corresponda a rewritefilter fará proxy da ligação para host.
configs[...]
Uma lista de strings de configuração.
Cada string será adicionada ao ficheiro.
config_files[...] nome do ficheiro ou caminho
Lista de nomes de ficheiros ou caminhos. O conteúdo de cada ficheiro será adicionado ao Apache.
Útil para aproveitar a saída de ferramentas de automação de mod_rewrite, como a excelente ferramenta do @Inspired-Sec: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html
Formatámos esta configuração maioritariamente em JSON (YAML é um superconjunto de JSON), mas pode formatá-la como preferir, desde que corresponda.
Repare na configuração como existem vários vhosts, e cada um pode usar um ou mais métodos para especificar como está a ser injetado nos modelos de configuração.
Criamos um ficheiro de configuração por vhost porque o Letsencrypt, especificamente o componente certbot-apache, não suporta mais do que um vhost por ficheiro de configuração. Por isso, vamos provisionar vários ficheiros de configuração para o servidor.
Executar o Playbook
Para executar o role. Crie o seu playbook no formato do exemplo que abordámos e execute ansible-playbook -i <your_hosts_file> <your_playbook>. Certifique-se de que este role está no diretório de roles no mesmo caminho do seu playbook, e que os seus ficheiros de hop e/ou de configuração estão colocados corretamente. A estrutura do seu diretório deverá ter o seguinte aspeto:
├── 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