
레드 팀 C2를 위한 리다이렉터를 구성하는 Ansible 역할
Ansible 역할로, mod_rewrite 프록시 규칙을 사용하여 기존 서버에 리다이렉터를 신속하게 배포할 수 있습니다.
Debian 및 Ubuntu를 지원하며, Digital Ocean 및 Azure에서 테스트되었습니다.
리다이렉터, Ansible 및 이 역할에 대한 심층 분석 블로그는 threat.tevora.com/automating-redirector-deployment-with-ansible 을 참조하세요.
시작하려면 이 리포지토리를 클론하고, Ansible을 설치한 후, 이 리포지토리를 roles 폴더에 넣으세요. 아래 샘플 플레이북은 리다이렉터 인스턴스 구성을 빌드하는 방법의 예시입니다.
인스턴스 플레이북 샘플 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"
],
}
]
예제 설명:
- hosts: EnigmaticEmu
이는 플레이북이 실행될 호스트를 지정합니다.
이 플레이북이 올바르게 실행되려면, 엔그마틱 에뮤의 호스트명 또는 IP가 정의된 인벤토리 파일을 사용해야 합니다.
gather_facts: False
Ansible의 gather_facts 태스크는 Python 2가 설치되지 않은 최신 Ubuntu 버전에서 깨집니다.
gather_facts를 비활성화하여 Python 2를 먼저 설치할 수 있도록 합니다. 이는 호환성 부트스트랩을 위한 것입니다.
user: root
이는 원격 서버에 로그인할 사용자를 지정합니다. Ansible은 모든 구성을 SSH를 통해 수행합니다.
원하는 사용자로 변경하세요.
*sudo가 필요한 경우, become: true를 추가하고 ansible-playbook을 --ask-become-pass와 함께 호출해야 할 수도 있습니다.
pre_tasks:
tasks: 이제 본론에 도달했습니다. 플레이북 태스크입니다!- include_role:
예상대로, 이는 포함할 역할을 지정하며, 다음 줄 name: redirectors는 redirectors 역할을 포함하도록 지정합니다.
vars:
여기서 구성의 핵심 부분을 수행합니다.
서버에는 le_email, hop_dir, vhosts 세 가지 변수가 포함됩니다.
le_email은 lets_encrypt에 사용할 이메일 주소를 지정하는 데 사용됩니다. 자신이 제어하는 이메일을 사용해야 합니다.
역할의 복사 태스크에서 사용했던 hop_dir을 기억하시나요? 여기서 정의됩니다! hop 디렉토리는 플레이북 자체의 위치를 기준으로 ./files/ 아래에 위치해야 합니다.
hosts: [...]
vhosts 변수는 vhost 구성 딕셔너리의 리스트입니다. 이를 통해 서버별로 여러 도메인과 C2 프로필을 가진 여러 vhost를 설정할 수 있습니다.
이 변수는 리스트라는 점을 기억하세요. 이는 구성 파일을 템플릿화하는 방식과 redirectors 역할에서 이러한 변수를 사용하는 다른 방식에서 중요합니다.
servername: 'fakeamazon.com'
이는 서버의 호스트명이며, 이 호스트명이 서버의 IP를 가리키는 DNS 레코드가 반드시 있어야 합니다.
http_port 및 https_port는 매우 명확합니다. http와 https가 수신할 포트를 선택하세요.
계속하기 전에 구성에서 mod_rewrite 규칙을 정의하는 여러 방법이 있음을 주목하세요. 이는 주로 실험과 이 플레이북을 Python API와 통합할 계획 때문입니다.
c2filters: [...]
c2filter 딕셔너리의 리스트입니다.
URI가 rewritefilter와 일치하는 모든 요청은 host로 프록시됩니다.
configs[...]
구성 문자열의 리스트입니다.
각 문자열이 파일에 추가됩니다.
config_files[...] 파일명 또는 경로
파일명 또는 경로의 리스트입니다. 각 파일의 내용이 Apache에 추가됩니다.
@Inspired-Sec의 멋진 도구(https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html)와 같은 mod_rewrite 자동화 도구 출력을 활용하는 데 유용합니다.
이 구성을 대부분 JSON으로 형식화했지만(YAML은 JSON의 상위 집합), 일치하는 한 원하는 대로 형식화할 수 있습니다.
구성에서 여러 vhost가 있고 각 vhost가 구성 템플릿에 삽입하는 방식을 지정하는 하나 이상의 방법을 사용할 수 있음을 확인하세요.
vhost당 하나의 구성 파일을 만드는 이유는 Letsencrypt, 특히 certbot-apache 구성 요소가 구성 파일당 하나의 vhost만 지원하기 때문입니다. 이로 인해 여러 구성 파일을 서버에 프로비저닝하게 됩니다.
플레이북 실행
역할을 실행하려면, 위에서 다루었던 예제 형태의 플레이북을 생성하고 ansible-playbook -i <your_hosts_file> <your_playbook>을 실행하세요. 이 역할이 플레이북과 동일한 경로의 roles 디렉토리에 있고, hop 및/또는 구성 파일이 올바르게 배치되었는지 확인하세요. 디렉토리 레이아웃은 다음과 같아야 합니다:
├── 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