98103466d8
Sanitized version of red team infrastructure automation platform. Operational content (implant pipelines, lures, credential capture) replaced with documented stubs. Architecture and infrastructure automation code intact.
85 lines
3.3 KiB
YAML
85 lines
3.3 KiB
YAML
---
|
|
# Linode/initial-infrastructure.yml
|
|
# This playbook only creates the Linode instances without trying to configure them
|
|
# This separation makes the deployment more reliable
|
|
|
|
- name: Create Linode infrastructure
|
|
hosts: localhost
|
|
gather_facts: false
|
|
connection: local
|
|
vars_files:
|
|
- vars.yaml
|
|
vars:
|
|
# Default values if not provided
|
|
ssh_user: "{{ ssh_user | default('root') }}"
|
|
linode_region: "{{ linode_region | default(region_choices | random) }}"
|
|
plan: "{{ plan | default('g6-standard-2') }}"
|
|
image: "{{ image | default('linode/kali') }}"
|
|
|
|
# Determine what to deploy based on configuration
|
|
deploy_redirector: "{{ not (c2_only | default(false)) }}"
|
|
deploy_c2: "{{ not (redirector_only | default(false)) }}"
|
|
|
|
# Generate random names if not provided
|
|
redirector_name: "{{ redirector_name | default('srv-' + 100000000 | random | to_uuid | hash('md5') | truncate(8, True, '')) }}"
|
|
c2_name: "{{ c2_name | default('node-' + 100000000 | random | to_uuid | hash('md5') | truncate(8, True, '')) }}"
|
|
|
|
tasks:
|
|
- name: Validate required Linode token
|
|
assert:
|
|
that:
|
|
- linode_token is defined and linode_token != ""
|
|
fail_msg: "Linode API token is required. Set linode_token in vars.yaml or via --linode-token."
|
|
|
|
- name: Create redirector Linode instance
|
|
community.general.linode_v4:
|
|
access_token: "{{ linode_token }}"
|
|
label: "{{ redirector_name }}"
|
|
type: "{{ plan }}"
|
|
region: "{{ linode_region }}"
|
|
image: "{{ image }}"
|
|
root_pass: "{{ lookup('password', '/dev/null length=24 chars=ascii_letters,digits') }}"
|
|
authorized_keys:
|
|
- "{{ lookup('file', ssh_key_path) }}"
|
|
state: present
|
|
register: redirector_instance
|
|
when: deploy_redirector
|
|
|
|
- name: Set redirector_ip for later use
|
|
set_fact:
|
|
redirector_instance_id: "{{ redirector_instance.instance.id }}"
|
|
redirector_ip: "{{ redirector_instance.instance.ipv4[0] }}"
|
|
when: deploy_redirector and redirector_instance is defined
|
|
|
|
- name: Create C2 Linode instance
|
|
community.general.linode_v4:
|
|
access_token: "{{ linode_token }}"
|
|
label: "{{ c2_name }}"
|
|
type: "{{ plan }}"
|
|
region: "{{ linode_region }}"
|
|
image: "{{ image }}"
|
|
root_pass: "{{ lookup('password', '/dev/null length=24 chars=ascii_letters,digits') }}"
|
|
authorized_keys:
|
|
- "{{ lookup('file', ssh_key_path) }}"
|
|
state: present
|
|
register: c2_instance
|
|
when: deploy_c2
|
|
|
|
- name: Set c2_ip for later use
|
|
set_fact:
|
|
c2_instance_id: "{{ c2_instance.instance.id }}"
|
|
c2_ip: "{{ c2_instance.instance.ipv4[0] }}"
|
|
when: deploy_c2 and c2_instance is defined
|
|
|
|
- name: Display instance information
|
|
debug:
|
|
msg:
|
|
- "Linode instances created successfully!"
|
|
- "Waiting for instances to initialize..."
|
|
- "{{ 'Redirector IP: ' + redirector_ip if redirector_ip is defined else 'No redirector deployed' }}"
|
|
- "{{ 'C2 Server IP: ' + c2_ip if c2_ip is defined else 'No C2 server deployed' }}"
|
|
|
|
- name: Wait for instances to initialize (30 seconds)
|
|
pause:
|
|
seconds: 30
|
|
when: (deploy_redirector and redirector_instance is defined) or (deploy_c2 and c2_instance is defined) |