Files
CoM-c2itall/smoke_test_webrunner.py
T
Operator 0799bfbae8 Initial public portfolio release
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.
2026-06-23 16:12:14 -04:00

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)