0x00 前言

细节决定成败,一失足成千古恨。

在渗透测试过程中,我们一般通过 VPN 代理来进行渗透,但是如果 VPN 突然断线了,那么就很可能使用我们的真实 IP 来对目标进行渗透,哪天可能就会被请去喝茶了。

要解决这种麻烦情况,最好是设置所有流量只能通过VPN出去,一旦VPN断线流量无法通过本地网络出去。经过测试,利用系统自带的防火墙就可以达到这个目的,Windows用自带的防火墙即可,Linux可使用iptables进行设置。

0x01 Linux 设置

允许通向VPN服务器的流量

1
2
iptables -A OUTPUT -d 14.14.14.14 -j ACCEPT
iptables -A OUTPUT -d 14.14.14.15 -j ACCEPT

14.14.14.14和14.14.14.15即为VPN服务器的地址

允许流量通过vpn链接出去

1
iptables -A OUTPUT -o ppp0 -j ACCEPT

其中ppp0为VPN拨号成功后,新建的本地虚拟网卡,我测试用的l2tp协议,如果是其他协议,名字可能不同,可能是tun0

阻止所有出口流量

1
iptables -A OUTPUT -j DROP

禁止所有出口流量

综合起来iptables命令即为:

1
2
3
4
5
6
iptables -F
iptables -X
iptables -A OUTPUT -d 14.14.14.14 -j ACCEPT
iptables -A OUTPUT -d 14.14.14.15 -j ACCEPT
iptables -A OUTPUT -o ppp0 -j ACCEPT
iptables -A OUTPUT -j DROP
1
2
3
4
5
6
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

取消防火墙规则

1
2
iptables -F
iptables -X

0x02 Windows防火墙设置

需要分三步对防火墙进行设置:

  1. 默认阻止所有出口流量
  2. 在本地连接上设置允许通向VPN服务器的出口流量
  3. 允许所有流量通过vpn链接出去

阻止所有出口流量

win10

win+r ,输入 wf.msc ,右键 出站规则 –> 新建规则

选择 自定义,一般默认自定义为禁止所有出站流量,设置名称保存即可。

image-20220411112342782

允许通向VPN服务器的流量

和上一步一样,选择自定义,在作用域那么设置应用于哪些远程 ip 地址

image-20220411113558878

在操作那里选择 允许连接

image-20220411113712867

设置名称保存即可。

允许流量通过vpn链接出去

与上一步类似,新建出站规则,在作用域页面,IP地址设置保持默认不变。然后选择自定义:

image-20220411114124238

设置名称,保存即可。

bat 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@echo off
TITLE Set forced through the VPN to the Internet, plz run as administrator! by t00ls.net
:menu
echo.
echo ========================================================================
echo.
echo 1. Set forced through the VPN to Internet , plz run as administrator
echo 2. Delete your settings in 1 , plz run administrator
echo 3. Query your settings IP
echo 4. exit
echo.
echo by t00ls.net
echo.
set /p select=plz select:
if /i "%select%"=="1" goto 1
if /i "%select%"=="2" goto 2
if /i "%select%"=="3" goto 3
if /i "%select%"=="4" goto 4
echo error select&pause&%0
:1
echo.
echo Examples:
echo 10.0.0.1 or 10.0.0.1-10.0.0.254 or 10.0.0.1/24
echo 10.0.0.1,192.168.1.1,10.10.10.0/24
echo use , to separate multiple IPs
echo.
set /p ip=Set Your IP Address:
echo netsh advfirewall set allprofiles firewallpolicy allowinbound,blockout bound
netsh advfirewall set allprofiles firewallpolicy allowinbound,blockoutbound
echo netsh advfirewall firewall add rule name="allowvpn1" dir out action=allow enable=yes remoteip="%ip%"
netsh advfirewall firewall add rule name="allowvpn1" dir=out action=allow enable=yes remoteip="%ip%"
echo netsh advfirewall firewall add rule name="allowvpnremote1" dir=out action=allow enable=yes interfacetype=ras
netsh advfirewall firewall add rule name="allowvpnremote1" dir=out action=allow enable=yes interfacetype=ras
goto menu

:2
echo.
echo netsh advfirewall set allprofiles firewallpolicy allowinbound,allowoutbound
netsh advfirewall set allprofiles firewallpolicy allowinbound,allowoutbound
echo netsh advfirewall firewall delete rule name="allowvpn1"
netsh advfirewall firewall delete rule name="allowvpn1"
echo netsh advfirewall firewall delete rule name="allowvpnremote1"
netsh advfirewall firewall delete rule name="allowvpnremote1"
goto menu

:3
echo.
echo You have set the IP
netsh advfirewall firewall show rule name="allowvpn1"|findstr IP
if %errorlevel% NEQ 0 (echo.
echo ----Not Found IP----
echo.
echo.) else echo.
goto menu

:4
exit

0x03 总结

Windows 不同操作系统可能配置步骤不一样,但思路总体是这样。

经过设置之后,就不用害怕 VPN 突然断开了。

0x04参考链接:

https://www.t00ls.net/thread-38739-1-1.html

http://cn-sec.com/archives/349773.html

https://xz.aliyun.com/t/1117