
Rôle Ansible pour configurer des redirrecteurs pour le C2 de red team.
Rôle Ansible qui permet de déployer rapidement un redirector sur un serveur existant avec des règles de proxy mod_rewrite,
Prend en charge Debian et Ubuntu, testé sur Digital Ocean et Azure
Voir threat.tevora.com/automating-redirector-deployment-with-ansible pour un article de blog qui passe en revue les redirectors, Ansible, et une analyse approfondie de ce rôle
Pour commencer, clonez ce dépôt, installez Ansible et placez ce dépôt dans votre dossier roles. Voir l'exemple de playbook ci-dessous pour un exemple de construction de la configuration de votre instance redirector
Exemple de playbook d'instance 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"
],
}
]
Détail de l'exemple :
- hosts: EnigmaticEmu
Ceci spécifie les hôtes sur lesquels le playbook sera exécuté.
Pour que ce playbook s'exécute correctement, un fichier d'inventaire doit être utilisé avec le nom d'hôte ou l'IP d'EnigmaticEmu défini.
gather_facts: False
La tâche Ansible « gather facts » échoue sur les versions plus récentes d'Ubuntu sans Python 2 installé.
Nous désactivons « gather facts », afin de pouvoir installer Python 2 d'abord. C'est juste un peu de bootstrap de compatibilité.
user: root
ceci spécifie l'utilisateur avec lequel se connecter au serveur distant, Ansible effectue toutes ses configurations via SSH.
Modifiez cela selon l'utilisateur que vous souhaitez utiliser.
become: true et appeler ansible-playbook avec --ask-become-pass.pre_tasks:
tasks: Nous voici arrivés à la partie intéressante, les tâches de notre playbook !- include_role:
comme vous pouvez l'imaginer, cela spécifie un rôle à inclure, et la ligne suivante name: redirectors précise d'inclure notre rôle redirectors.
Nous avons formaté cette configuration principalement en JSON (YAML est un sur-ensemble de JSON), mais vous pouvez la formater comme vous le souhaitez tant que cela correspond.
Remarquez dans la configuration la présence de plusieurs vhosts, et chacun peut utiliser une ou plusieurs méthodes pour spécifier comment il est injecté dans les modèles de configuration.
Nous créons un fichier de configuration par vhost car Letsencrypt, plus précisément le composant certbot-apache, ne prend pas en charge plus d'un vhost par fichier de configuration. C'est pourquoi nous allons provisionner plusieurs fichiers de configuration sur le serveur.
Exécution du playbook
Pour exécuter le rôle, créez votre playbook sous la forme de l'exemple que nous avons vu et lancez ansible-playbook -i <your_hosts_file> <your_playbook>. Assurez-vous que ce rôle se trouve dans le répertoire roles au même emplacement que votre playbook, et que vos fichiers hop et/ou de configuration sont placés correctement. La structure de votre répertoire devrait ressembler à ceci :
├── 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
vars:
c'est ici que se trouve l'essentiel de notre configuration.
Notre configuration contient trois variables : le_email, hop_dir et vhosts.
L'e-mail est utilisé pour spécifier l'adresse e-mail que nous utilisons pour lets_encrypt, assurez-vous d'en contrôler une.
Vous vous souvenez du hop_dir utilisé dans la tâche de copie de notre rôle ? C'est ici qu'il est défini ! Le hop_dir doit se trouver dans ./files/ par rapport à l'emplacement du playbook lui-même.
hosts: [...]
notre variable vhosts est une liste de dictionnaires de configuration vhost. Cela nous permet de configurer plusieurs vhosts avec différents domaines et profils C2 par serveur.
Rappelez-vous que cette variable est une liste, car cela sera important dans la façon dont nous générons nos fichiers de configuration à partir de modèles et dans les autres manières dont nous utilisons ces variables dans notre rôle redirectors.
servername: 'fakeamazon.com'
c'est le nom d'hôte de notre serveur, et vous DEVEZ avoir un enregistrement DNS pour ce nom d'hôte pointant vers l'IP du serveur.
http_port et https_port sont assez explicites. Choisissez sur quels ports http et https écouteront.
notez avant de continuer que nous avons plusieurs façons de définir les règles mod_rewrite dans la configuration. Cela est en grande partie dû à l'expérimentation et aux projets d'intégration de ce playbook avec une API Python.
c2filters: [...]
une liste de dictionnaires c2filter.
Toute requête dont l'URI correspond à rewritefilter transmettra la connexion par proxy à host.
configs[...]
une liste de chaînes de configuration.
Chaque chaîne sera ajoutée au fichier.
config_files[...] nom de fichier ou chemin
liste de noms de fichiers ou de chemins. Le contenu de chaque fichier sera ajouté à Apache.
utile pour exploiter la sortie d'outils d'automatisation mod_rewrite tels que l'excellent outil de @Inspired-Secs : https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html