why me
This commit is contained in:
+1
-1
@@ -77,7 +77,7 @@
|
|||||||
name: "c2"
|
name: "c2"
|
||||||
groups: "c2servers"
|
groups: "c2servers"
|
||||||
ansible_host: "{{ c2_ip }}"
|
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_private_key_file: "{{ ssh_key_path | replace('.pub', '') }}"
|
||||||
ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
ansible_ssh_common_args: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
|
||||||
|
|
||||||
|
|||||||
+39
-10
@@ -1,5 +1,5 @@
|
|||||||
# Linode/cleanup.yml
|
|
||||||
---
|
---
|
||||||
|
# Linode/cleanup.yml
|
||||||
- name: Clean up Linode infrastructure
|
- name: Clean up Linode infrastructure
|
||||||
hosts: localhost
|
hosts: localhost
|
||||||
connection: local
|
connection: local
|
||||||
@@ -22,23 +22,52 @@
|
|||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: |
|
||||||
===============================================
|
===============================================
|
||||||
CLEANUP CONFIRMATION REQUIRED
|
CLEANUP OPERATION
|
||||||
===============================================
|
===============================================
|
||||||
The following resources will be PERMANENTLY DELETED:
|
The following resources will be DELETED PERMANENTLY:
|
||||||
{% if cleanup_redirector %}
|
{% if cleanup_redirector and redirector_name is defined %}
|
||||||
- Redirector instance: {{ redirector_name }}
|
- Redirector instance: {{ redirector_name }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if cleanup_c2 %}
|
{% if cleanup_c2 and c2_name is defined %}
|
||||||
- C2 instance: {{ c2_name }}
|
- C2 instance: {{ c2_name }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
when: confirm_cleanup | bool
|
when: confirm_cleanup | bool
|
||||||
|
|
||||||
- name: Confirm cleanup
|
- name: Confirm cleanup operation
|
||||||
pause:
|
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
|
register: confirmation
|
||||||
when: confirm_cleanup | bool
|
when: confirm_cleanup | bool
|
||||||
|
|
||||||
- name: Exit if not confirmed
|
- name: Skip cleanup if not confirmed
|
||||||
meta: end_play
|
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 %}
|
||||||
@@ -565,63 +565,114 @@ def deploy_infrastructure(config):
|
|||||||
if not config.get('region'):
|
if not config.get('region'):
|
||||||
config['region'] = select_random_region(config)
|
config['region'] = select_random_region(config)
|
||||||
|
|
||||||
# Determine which components to deploy
|
# Set different instance sizes for redirector vs. C2
|
||||||
success = True
|
if provider == "linode":
|
||||||
|
# Store the original plan
|
||||||
# Use the correct case for provider directory
|
original_plan = config.get('plan', 'g6-standard-2')
|
||||||
provider_dir = provider.capitalize() if provider != "aws" else provider.upper()
|
|
||||||
|
|
||||||
# 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}")
|
# For redirector, use smaller instance size regardless of what was specified
|
||||||
redirector_success, stdout, stderr = run_ansible_playbook(
|
if not config.get('c2_only'):
|
||||||
playbook, inventory_path, config, config.get('debug', False)
|
redirector_config = config.copy()
|
||||||
)
|
redirector_config['plan'] = 'g6-nanode-1' # Smallest viable Linode plan
|
||||||
|
|
||||||
# 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'}")
|
|
||||||
|
|
||||||
if os.path.exists(inventory_path):
|
|
||||||
os.unlink(inventory_path)
|
|
||||||
|
|
||||||
if not redirector_success:
|
# Use the correct case for provider directory
|
||||||
logging.error("Redirector deployment failed")
|
provider_dir = "Linode"
|
||||||
return False
|
playbook = f"{provider_dir}/redirector.yml"
|
||||||
|
inventory_path = create_inventory_file(redirector_config, "local")
|
||||||
# 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}")
|
|
||||||
else:
|
|
||||||
# Always log at least a summary even without debug mode
|
|
||||||
logging.info(f"C2 server deployment {'succeeded' if c2_success else 'failed'}")
|
|
||||||
|
|
||||||
if os.path.exists(inventory_path):
|
|
||||||
os.unlink(inventory_path)
|
|
||||||
|
|
||||||
if not c2_success:
|
logging.info(f"Deploying redirector using {playbook} with plan: g6-nanode-1")
|
||||||
logging.error("C2 server deployment failed")
|
redirector_success, stdout, stderr = run_ansible_playbook(
|
||||||
return False
|
playbook, inventory_path, redirector_config, redirector_config.get('debug', False)
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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 not redirector_success:
|
||||||
|
logging.error("Redirector deployment failed")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# For C2, use the original plan
|
||||||
|
if not config.get('redirector_only'):
|
||||||
|
# Restore original plan for C2
|
||||||
|
config['plan'] = original_plan
|
||||||
|
|
||||||
|
provider_dir = "Linode"
|
||||||
|
playbook = f"{provider_dir}/c2.yml"
|
||||||
|
inventory_path = create_inventory_file(config, "local")
|
||||||
|
|
||||||
|
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)
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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
|
||||||
|
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
|
return True
|
||||||
|
|
||||||
@@ -815,15 +866,39 @@ def cleanup_resources(config):
|
|||||||
logging.info(f"Cleaning up {provider} resources...")
|
logging.info(f"Cleaning up {provider} resources...")
|
||||||
|
|
||||||
# Use the correct case for provider directory
|
# 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"
|
playbook = f"{provider_dir}/cleanup.yml"
|
||||||
if os.path.exists(playbook):
|
if os.path.exists(playbook):
|
||||||
logging.info(f"Running cleanup playbook: {playbook}")
|
logging.info(f"Running cleanup playbook: {playbook}")
|
||||||
inventory_path = create_inventory_file(config, "local")
|
inventory_path = create_inventory_file(config, "local")
|
||||||
|
|
||||||
|
# Add extra vars to config for cleanup
|
||||||
|
cleanup_config = config.copy()
|
||||||
|
cleanup_config.update(extra_vars)
|
||||||
|
|
||||||
try:
|
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:
|
except Exception as e:
|
||||||
logging.error(f"Cleanup playbook failed: {e}")
|
logging.error(f"Cleanup playbook failed: {e}")
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
Reference in New Issue
Block a user