
Ruolo Ansible per configurare redirector per il C2 del red team
Ruolo Ansible che consente di distribuire rapidamente un redirector su un server esistente con regole proxy mod_rewrite,
Supporta Debian e Ubuntu, testato su DigitalOcean e Azure
Vedi threat.tevora.com/automating-redirector-deployment-with-ansible per un blog che illustra i redirector, Ansible e un'analisi approfondita di questo ruolo
Per iniziare, clona questo repository, installa Ansible e posiziona questo repository nella tua cartella roles. Vedi il playbook di esempio qui sotto per un esempio di come creare la configurazione della tua istanza redirector.
Esempio di Playbook dell'istanza 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"
],
}
]
Analisi dell'esempio:
- hosts: EnigmaticEmu
Specifica gli host su cui verrà eseguito il playbook.
Affinché questo playbook venga eseguito correttamente, è necessario utilizzare un file di inventario con definito il nome host o l'IP di EnigmaticEmu.
gather_facts: False
Il task Ansible gather facts si rompe sulle versioni più recenti di Ubuntu senza Python 2 installato.
Disabilitiamo gather facts per assicurarci di installare prima Python 2. È solo una questione di bootstrap per la compatibilità.
user: root
Specifica con quale utente accedere al server remoto; Ansible esegue tutte le sue configurazioni tramite SSH.
Cambialo con l'utente che preferisci usare.
*se devi usare sudo, potrebbe essere necessario aggiungere become: true e invocare ansible-playbook con --ask-become-pass
pre_tasks:
gather facts
tasks: Ora siamo arrivati alla parte buona, i task del nostro playbook!- include_role:
Come puoi immaginare, specifica un ruolo da includere, e la riga successiva specifica di includere il nostro ruolo redirectors.
Abbiamo formattato questa configurazione per lo più in JSON (YAML è un superset di JSON), ma puoi formattarla come preferisci purché corrisponda.
Nota nella configurazione come ci siano più vhost, e ognuno può usare uno o più metodi per specificare come viene iniettato nei template di configurazione.
Creiamo un file di configurazione per vhost perché Let's Encrypt, in particolare il componente certbot-apache, non supporta più di un vhost per file di configurazione. Per questo motivo, forniremo più file di configurazione al server.
Esecuzione del Playbook
Per eseguire il ruolo, crea il tuo playbook nella forma dell'esempio che abbiamo trattato ed esegui ansible-playbook -i <your_hosts_file> <your_playbook>. Assicurati che questo ruolo sia nella directory roles nello stesso percorso del tuo playbook e che i tuoi file hop e/o di configurazione siano posizionati correttamente. La struttura della tua directory dovrebbe apparire così:
├── 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
name: redirectorsvars:
È qui che facciamo la parte sostanziosa della nostra configurazione.
Il nostro server contiene tre variabili: le_email, hop_dir e vhosts.
le_email viene usata per specificare l'indirizzo email che utilizziamo per Let's Encrypt; assicurati di usarne uno che controlli.
Ricordi la hop_dir che abbiamo usato nel task di copia del nostro ruolo? È qui che viene definita! La hop dir dovrebbe trovarsi in ./files/ rispetto alla posizione del playbook stesso.
hosts: [...]
La nostra variabile vhosts è una lista di dizionari di configurazione dei vhost. Questo ci permette di impostare più vhost con domini e profili C2 diversi per server.
Ricorda che questa variabile è una lista, perché sarà importante per come creiamo i template dei nostri file di configurazione e per gli altri modi in cui usiamo queste variabili nel nostro ruolo redirectors.
servername: 'fakeamazon.com'
Questo è l'hostname del nostro server, e DEVI avere un record DNS per questo hostname che punti all'IP del server.
http_port e https_port sono abbastanza autoesplicativi. Scegli su quali porte http e https ascolteranno.
Nota: prima di proseguire, abbiamo più modi per definire le regole mod_rewrite nella configurazione. Ciò è dovuto in gran parte alla sperimentazione e ai piani per integrare questo playbook con un'API Python.
c2filters: [...]
Una lista di dict c2filter.
Qualsiasi richiesta il cui URI corrisponde a rewritefilter inoltrerà la connessione a host.
configs[...]
Una lista di stringhe di configurazione.
Ogni stringa verrà aggiunta al file.
config_files[...] nome file o percorso
Lista di nomi di file o percorsi. Il contenuto di ogni file verrà aggiunto ad Apache.
Utile per sfruttare l'output di strumenti di automazione di mod_rewrite come il fantastico strumento di @Inspired-Secs: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html