0799bfbae8
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.
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
WEBRUNNER smoke test — 1 nanode, masscan-only, operator IP /32, port 22, auto-teardown.
|
|
Run from c2itall root: python3 smoke_test_webrunner.py
|
|
"""
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
from utils.common import generate_deployment_id, setup_logging
|
|
from utils.ssh_utils import generate_ssh_key
|
|
from utils.deployment_engine import execute_playbook, set_provider_environment
|
|
|
|
OPERATOR_IP = "129.222.0.125"
|
|
TARGET_CIDR = f"{OPERATOR_IP}/32"
|
|
|
|
config = {}
|
|
config['deployment_id'] = generate_deployment_id()
|
|
config['engagement'] = 'smoketest'
|
|
config['deployment_type'] = 'webrunner'
|
|
config['webrunner_deployment'] = True
|
|
config['webrunner_name'] = f"wr-smoke-{config['deployment_id']}"
|
|
|
|
# Provider — cheapest Linode nanode
|
|
config['providers'] = ['linode']
|
|
config['provider'] = 'linode'
|
|
config['linode_region'] = 'us-east'
|
|
config['linode_instance_type'] = 'g6-nanode-1'
|
|
config['linode_image'] = 'linode/debian12'
|
|
|
|
# Scan — masscan-only, single port, operator /32
|
|
config['scan_mode'] = 'masscan-only'
|
|
config['ports'] = [22]
|
|
config['ports_str'] = '22'
|
|
config['masscan_rate'] = 1000
|
|
config['use_tor'] = False
|
|
config['targets_file'] = ''
|
|
config['total_ips'] = 1
|
|
config['preset'] = 'sprint'
|
|
config['chunk_size'] = 500_000
|
|
|
|
# OPSEC
|
|
config['operator_ip'] = OPERATOR_IP
|
|
config['enhanced_opsec'] = False
|
|
config['teardown_after_scan'] = True
|
|
|
|
# SSH key
|
|
ssh_key_path = generate_ssh_key(config['webrunner_name'])
|
|
if not ssh_key_path:
|
|
sys.exit('Failed to generate SSH key')
|
|
config['ssh_key_path'] = f"{ssh_key_path}.pub"
|
|
config['ssh_key_name'] = os.path.basename(ssh_key_path)
|
|
|
|
# Single node chunk targeting operator IP
|
|
node_chunks = [{
|
|
'idx': 0,
|
|
'node_name': f"{config['webrunner_name']}-01",
|
|
'provider': 'linode',
|
|
'cidrs': [TARGET_CIDR],
|
|
'ip_count': 1,
|
|
}]
|
|
|
|
logs_dir = os.path.abspath('logs')
|
|
os.makedirs(logs_dir, exist_ok=True)
|
|
chunks_file = os.path.join(logs_dir, f"node_chunks_{config['deployment_id']}.json")
|
|
with open(chunks_file, 'w') as f:
|
|
json.dump(node_chunks, f)
|
|
|
|
config['node_chunks_file'] = chunks_file
|
|
config['scanner_ip_log'] = os.path.join(logs_dir, f"scanner_ips_{config['webrunner_name']}.txt")
|
|
config['results_dir'] = os.path.join(logs_dir, f"webrunner_{config['deployment_id']}")
|
|
|
|
log_file = setup_logging(config['deployment_id'], 'webrunner_smoketest')
|
|
|
|
print(f"\n[*] WEBRUNNER smoke test")
|
|
print(f" ID: {config['deployment_id']}")
|
|
print(f" Target: {TARGET_CIDR} (operator IP)")
|
|
print(f" Mode: masscan-only, port 22")
|
|
print(f" Node: g6-nanode-1 @ us-east (auto-teardown)\n")
|
|
|
|
set_provider_environment({**config, 'provider': 'linode'})
|
|
|
|
success = execute_playbook('providers/webrunner.yml', config)
|
|
sys.exit(0 if success else 1)
|