
Rol de Ansible para configurar redireccionadores para C2 de red team.
Rol de Ansible que permite desplegar rápidamente un redirector en un servidor existente con reglas de proxy mod_rewrite,
Compatible con Debian y Ubuntu, probado en Digital ocean y Azure
Consulta threat.tevora.com/automating-redirector-deployment-with-ansible para un blog que recorre los redirectors, Ansible y un análisis en profundidad de este rol
Para comenzar, clona este repositorio, instala Ansible y coloca este repositorio en tu carpeta de roles. Consulta el siguiente playbook de ejemplo para ver un ejemplo de cómo construir la configuración de tu instancia de redirector
Ejemplo de playbook de instancia 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"
],
}
]
Desglose del ejemplo:
- hosts: EnigmaticEmu
Esto especifica los hosts en los que se ejecutará el playbook.
Para que este playbook se ejecute correctamente, se debe usar un archivo de inventario con el hostname o la IP de EnigmaticEmu definidos.
gather_facts: False
La tarea de gather facts de Ansible falla en versiones más recientes de Ubuntu sin Python 2 instalado.
desactivamos gather facts, así que nos aseguramos de instalar Python 2 primero. Esto es solo una especie de arranque de compatibilidad.
user: root
esto especifica con qué usuario iniciar sesión en el servidor remoto; Ansible realiza todas sus configuraciones a través de SSH.
Cambia esto al usuario que quieras usar.
*si necesitas usar sudo, puede que tengas que añadir become: true y ejecutar ansible-playbook con --ask-become-pass.
pre_tasks:
tasks: Ahora hemos llegado a la parte buena, ¡las tareas de nuestro playbook!- include_role:
como puedes imaginar, esto especifica un rol a incluir, y la siguiente línea name: redirectors especifica incluir nuestro rol redirectors.
vars:
aquí es donde hacemos el trabajo pesado de nuestra configuración.
Nuestro servidor contiene tres variables: le_email, hop_dir y vhosts.
le_email se usa para especificar la dirección de correo que utilizamos para lets_encrypt; asegúrate de usar una que controles.
¿Recuerdas el hop_dir que usamos en la tarea de copia de nuestro rol? ¡Aquí es donde se define! El hop_dir debe ubicarse en ./files/ relativo a la ubicación del propio playbook.
hosts: [...]
nuestra variable vhosts es una lista de diccionarios de configuración de vhost. Esto nos permite configurar múltiples vhosts con diferentes dominios y perfiles C2 por servidor.
Recuerda que esta variable es una lista, ya que será importante en cómo generamos las plantillas de nuestros archivos de configuración y en otras formas en las que usamos estas variables en nuestro rol redirectors.
servername: 'fakeamazon.com'
este es el hostname de nuestro servidor, y DEBES tener un registro DNS para este hostname que apunte a la IP del servidor.
http_port y https_port son bastante autoexplicativos. Elige en qué puertos escucharán http y https
observa que antes de continuar tenemos múltiples formas de definir reglas de mod_rewrite en la configuración. Esto se debe en gran parte a la experimentación y a los planes para integrar este playbook con una API de Python
c2filters: [...]
una lista de diccionarios c2filter
Cualquier solicitud cuya URI coincida con rewritefilter hará proxy de la conexión a host
configs[...]
una lista de cadenas de configuración
Cada cadena se añadirá al archivo.
config_files[...] nombre de archivo o ruta
lista de nombres de archivo o rutas. El contenido de cada archivo se añadirá a Apache
útil para aprovechar la salida de herramientas de automatización de mod_rewrite, como la increíble herramienta de @Inspired-Secs: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html
Formateamos esta configuración mayormente en JSON (YAML es un superconjunto de JSON), pero puedes formatearla como quieras siempre que coincida.
Observa en la configuración cómo hay múltiples vhosts, y cada uno puede usar uno o más métodos para especificar cómo se inyecta en las plantillas de configuración.
Creamos un archivo de configuración por vhost porque Letsencrypt, específicamente el componente certbot-apache, no soporta más de un vhost por archivo de configuración. Debido a esto, aprovisionaremos múltiples archivos de configuración al servidor.
Ejecutar el Playbook
Para ejecutar el rol, crea tu playbook siguiendo el ejemplo que hemos visto y ejecuta ansible-playbook -i <your_hosts_file> <your_playbook>. Asegúrate de que este rol esté en el directorio de roles en la misma ruta que tu playbook, y de que tus archivos hop y/o de configuración estén colocados correctamente. La estructura de tu directorio debería verse así:
├── 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