
Ansible-Rolle zur Konfiguration von Redirectors für Red Team C2
Unterstützt Debian und Ubuntu, getestet in Digital Ocean und Azure
Siehe threat.tevora.com/automating-redirector-deployment-with-ansible für einen Blog, der Redirectors, Ansible und einen tiefen Einblick in diese Rolle erklärt.
Um zu beginnen, klonen Sie dieses Repository, installieren Sie Ansible und legen Sie dieses Repository in Ihrem roles-Ordner ab. Siehe untenstehendes Beispiel-Playbook für ein Beispiel, wie Sie Ihre Redirector-Instanzkonfiguration erstellen.
Beispiel-Playbook für die Instanz 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"
],
}
]
Aufschlüsselung des Beispiels:
- hosts: EnigmaticEmu
Dies gibt die Hosts an, auf denen das Playbook ausgeführt wird.
Damit dieses Playbook korrekt ausgeführt werden kann, muss eine Inventardatei mit dem Hostnamen oder der IP von EnigmaticEmu verwendet werden.
gather_facts: False
Der Ansible gather_facts-Task bricht auf neueren Versionen von Ubuntu ohne installiertes Python 2 ab.
Wir deaktivieren gather_facts, um sicherzustellen, dass zuerst Python 2 installiert wird. Dies ist nur ein Kompatibilitäts-Bootstrap.
user: root
Dies gibt den Benutzer an, mit dem die Anmeldung am entfernten Server erfolgt. Ansible führt alle Konfigurationen über SSH durch.
Ändern Sie dies auf den gewünschten Benutzer.
*Wenn Sie sudo benötigen, müssen Sie möglicherweise become: true hinzufügen und ansible-playbook mit --ask-become-pass aufrufen.
pre_tasks:
Diese Zeilen installieren Python 2, falls es nicht vorhanden ist, und führen gather_facts aus.
tasks:
Jetzt sind wir beim guten Teil angelangt, unseren Playbook-Tasks!
- include_role:
Wie Sie sich vorstellen können, gibt dies eine einzubindende Rolle an, und die nächste Zeile name: redirectors gibt an, dass unsere redirectors-Rolle eingebunden wird.
Wir haben diese Konfiguration größtenteils im JSON-Format formatiert (YAML ist eine Obermenge von JSON), aber Sie können sie beliebig formatieren, solange es übereinstimmt.
Beachten Sie in der Konfiguration, wie es mehrere vhosts gibt und jeder eine oder mehrere Methoden zur Angabe der Injektion in die Konfigurationsvorlagen verwenden kann.
Wir erstellen eine Konfigurationsdatei pro vhost, weil LetsEncrypt, genauer gesagt die certbot-apache-Komponente, nicht mehr als einen vhost pro Konfigurationsdatei unterstützt. Aus diesem Grund werden wir mehrere Konfigurationsdateien auf dem Server bereitstellen.
Ausführen des Playbooks
Um die Rolle auszuführen. Erstellen Sie Ihr Playbook in der Form des behandelten Beispiels und führen Sie ansible-playbook -i <your_hosts_file> <your_playbook> aus. Stellen Sie sicher, dass sich diese Rolle im roles-Verzeichnis im selben Pfad wie Ihr Playbook befindet und dass Ihre Hop- und/oder Konfigurationsdateien korrekt abgelegt sind. Ihr Verzeichnislayout sollte wie folgt aussehen:
├── 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:
Hier liegt der Kern unserer Konfiguration.
Unser Server enthält drei Variablen: le_email, hop_dir und vhosts.
le_email wird verwendet, um die E-Mail-Adresse anzugeben, die wir für LetsEncrypt verwenden. Stellen Sie sicher, dass Sie eine verwenden, die Sie kontrollieren.
Erinnern Sie sich an das hop_dir, das wir im copy-Task unserer Rolle verwendet haben? Hier wird es definiert! Das hop_dir sollte relativ zum Speicherort des Playbooks selbst in ./files/ liegen.
hosts: [...]
Unsere vhosts-Variable ist eine Liste von vhost-Konfigurationswörterbüchern. Dies ermöglicht es uns, mehrere vhosts mit verschiedenen Domänen und C2-Profilen pro Server einzurichten.
Denken Sie daran, dass diese Variable eine Liste ist, da dies wichtig für die Templating unserer Konfigurationsdateien und andere Arten der Verwendung dieser Variablen in unserer redirectors-Rolle ist.
servername: 'fakeamazon.com'
Dies ist der Hostname unseres Servers, und Sie MÜSSEN einen DNS-Eintrag für diesen Hostnamen haben, der auf die IP des Servers zeigt.
http_port und https_port sind ziemlich selbsterklärend. Wählen Sie, auf welchen Ports http und https lauschen sollen.
Beachten Sie, dass wir vor dem Fortfahren mehrere Möglichkeiten haben, mod_rewrite-Regeln in der Konfiguration zu definieren. Dies ist größtenteils auf Experimente und Pläne zur Integration dieses Playbooks mit einer Python-API zurückzuführen.
c2filters: [...]
Eine Liste von c2filter-Dictionaries.
Jede Anfrage, deren URI mit rewritefilter übereinstimmt, wird die Verbindung an host weiterleiten.
configs[...]
Eine Liste von Konfigurationszeichenfolgen.
Jede Zeichenfolge wird der Datei hinzugefügt.
config_files[...] Dateiname oder Pfad
Liste von Dateinamen oder Pfaden. Der Inhalt jeder Datei wird zu Apache hinzugefügt.
Nützlich für die Nutzung von mod_rewrite-Automatisierungswerkzeugausgaben wie dem großartigen Tool von @Inspired-Sec: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html