This commit is contained in:
n0mad1k
2025-04-11 10:12:48 -04:00
parent a7490bd655
commit 7962c574de
3 changed files with 172 additions and 68 deletions
+1 -1
View File
@@ -77,7 +77,7 @@
name: "c2"
groups: "c2servers"
ansible_host: "{{ c2_ip }}"
ansible_user: "{{ ssh_user }}"
ansible_user: "root" # Hard-coded instead of using ssh_user
ansible_ssh_private_key_file: "{{ ssh_key_path | replace('.pub', '') }}"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
+38 -9
View File
@@ -1,5 +1,5 @@
# Linode/cleanup.yml
---
# Linode/cleanup.yml
- name: Clean up Linode infrastructure
hosts: localhost
connection: local
@@ -22,23 +22,52 @@
debug:
msg: |
===============================================
CLEANUP CONFIRMATION REQUIRED
CLEANUP OPERATION
===============================================
The following resources will be PERMANENTLY DELETED:
{% if cleanup_redirector %}
The following resources will be DELETED PERMANENTLY:
{% if cleanup_redirector and redirector_name is defined %}
- Redirector instance: {{ redirector_name }}
{% endif %}
{% if cleanup_c2 %}
{% if cleanup_c2 and c2_name is defined %}
- C2 instance: {{ c2_name }}
{% endif %}
when: confirm_cleanup | bool
- name: Confirm cleanup
- name: Confirm cleanup operation
pause:
prompt: "Type 'yes' to confirm deletion or 'no' to abort"
prompt: "\n>>> Type 'yes' to confirm deletion or press Ctrl+C to abort <<<"
register: confirmation
when: confirm_cleanup | bool
- name: Exit if not confirmed
- name: Skip cleanup if not confirmed
meta: end_play
when: confirm_cleanup | bool and confirmation.user_input != 'yes'
when: confirm_cleanup | bool and (confirmation.user_input | default('')) != 'yes'
- name: Delete redirector instance
community.general.linode_v4:
access_token: "{{ linode_token }}"
label: "{{ redirector_name }}"
state: absent
when: cleanup_redirector and redirector_name is defined and redirector_name != ""
register: redirector_deletion
ignore_errors: yes
- name: Delete C2 instance
community.general.linode_v4:
access_token: "{{ linode_token }}"
label: "{{ c2_name }}"
state: absent
when: cleanup_c2 and c2_name is defined and c2_name != ""
register: c2_deletion
ignore_errors: yes
- name: Report cleanup status
debug:
msg: |
Cleanup results:
{% if redirector_deletion is defined %}
- Redirector {{ redirector_name }}: {{ redirector_deletion.changed | ternary('Deleted', 'Not found/Could not delete') }}
{% endif %}
{% if c2_deletion is defined %}
- C2 {{ c2_name }}: {{ c2_deletion.changed | ternary('Deleted', 'Not found/Could not delete') }}
{% endif %}
+124 -49
View File
@@ -565,63 +565,114 @@ def deploy_infrastructure(config):
if not config.get('region'):
config['region'] = select_random_region(config)
# Determine which components to deploy
success = True
# Set different instance sizes for redirector vs. C2
if provider == "linode":
# Store the original plan
original_plan = config.get('plan', 'g6-standard-2')
# Use the correct case for provider directory
provider_dir = provider.capitalize() if provider != "aws" else provider.upper()
# For redirector, use smaller instance size regardless of what was specified
if not config.get('c2_only'):
redirector_config = config.copy()
redirector_config['plan'] = 'g6-nanode-1' # Smallest viable Linode plan
# Redirector deployment
if not config.get('c2_only'):
playbook = f"{provider_dir}/redirector.yml"
inventory_path = create_inventory_file(config, "local")
# Use the correct case for provider directory
provider_dir = "Linode"
playbook = f"{provider_dir}/redirector.yml"
inventory_path = create_inventory_file(redirector_config, "local")
logging.info(f"Deploying redirector using {playbook}")
redirector_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, config, config.get('debug', False)
)
logging.info(f"Deploying redirector using {playbook} with plan: g6-nanode-1")
redirector_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, redirector_config, redirector_config.get('debug', False)
)
# Log Ansible output
if config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
else:
# Always log at least a summary even without debug mode
logging.info(f"Redirector deployment {'succeeded' if redirector_success else 'failed'}")
# Log Ansible output
if redirector_config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
if os.path.exists(inventory_path):
os.unlink(inventory_path)
if os.path.exists(inventory_path):
os.unlink(inventory_path)
if not redirector_success:
logging.error("Redirector deployment failed")
return False
if not redirector_success:
logging.error("Redirector deployment failed")
return False
# C2 deployment
if not config.get('redirector_only'):
playbook = f"{provider_dir}/c2.yml"
inventory_path = create_inventory_file(config, "local")
# For C2, use the original plan
if not config.get('redirector_only'):
# Restore original plan for C2
config['plan'] = original_plan
logging.info(f"Deploying C2 server using {playbook}")
c2_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, config, config.get('debug', False)
)
provider_dir = "Linode"
playbook = f"{provider_dir}/c2.yml"
inventory_path = create_inventory_file(config, "local")
# Log Ansible output
if config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
else:
# Always log at least a summary even without debug mode
logging.info(f"C2 server deployment {'succeeded' if c2_success else 'failed'}")
logging.info(f"Deploying C2 server using {playbook} with plan: {config['plan']}")
c2_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, config, config.get('debug', False)
)
if os.path.exists(inventory_path):
os.unlink(inventory_path)
# Log Ansible output
if config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
if not c2_success:
logging.error("C2 server deployment failed")
return False
if os.path.exists(inventory_path):
os.unlink(inventory_path)
if not c2_success:
logging.error("C2 server deployment failed")
return False
else:
# For AWS and other providers, follow the same pattern but with their directory names
provider_dir = "AWS" if provider == "aws" else provider.capitalize()
# Redirector deployment
if not config.get('c2_only'):
playbook = f"{provider_dir}/redirector.yml"
inventory_path = create_inventory_file(config, "local")
logging.info(f"Deploying redirector using {playbook}")
redirector_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, config, config.get('debug', False)
)
# Log Ansible output
if config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
if os.path.exists(inventory_path):
os.unlink(inventory_path)
if not redirector_success:
logging.error("Redirector deployment failed")
return False
# C2 deployment
if not config.get('redirector_only'):
playbook = f"{provider_dir}/c2.yml"
inventory_path = create_inventory_file(config, "local")
logging.info(f"Deploying C2 server using {playbook}")
c2_success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, config, config.get('debug', False)
)
# Log Ansible output
if config.get('debug', False):
logging.debug(f"Ansible stdout: {stdout}")
if stderr:
logging.debug(f"Ansible stderr: {stderr}")
if os.path.exists(inventory_path):
os.unlink(inventory_path)
if not c2_success:
logging.error("C2 server deployment failed")
return False
return True
@@ -815,15 +866,39 @@ def cleanup_resources(config):
logging.info(f"Cleaning up {provider} resources...")
# Use the correct case for provider directory
provider_dir = provider.capitalize() if provider != "aws" else provider.upper()
provider_dir = "AWS" if provider == "aws" else provider.capitalize()
# Use Ansible for cleanup with confirmation set to false
extra_vars = {
"confirm_cleanup": False, # Skip confirmation prompt
"redirector_name": config.get('redirector_name'),
"c2_name": config.get('c2_name'),
"cleanup_redirector": True,
"cleanup_c2": True
}
# Use Ansible for cleanup
playbook = f"{provider_dir}/cleanup.yml"
if os.path.exists(playbook):
logging.info(f"Running cleanup playbook: {playbook}")
inventory_path = create_inventory_file(config, "local")
# Add extra vars to config for cleanup
cleanup_config = config.copy()
cleanup_config.update(extra_vars)
try:
run_ansible_playbook(playbook, inventory_path, config)
success, stdout, stderr = run_ansible_playbook(
playbook, inventory_path, cleanup_config,
cleanup_config.get('debug', False)
)
if not success:
logging.error(f"Cleanup playbook failed: {stderr}")
# Log what we attempted to clean up
logging.error(f"Failed to clean up resources: redirector={config.get('redirector_name')}, c2={config.get('c2_name')}")
else:
logging.info("Cleanup completed successfully")
except Exception as e:
logging.error(f"Cleanup playbook failed: {e}")
finally: