本文一切操作都在管理员权限之下

1. 什么是http.sys

http.sys是一个Windows系统的核心组件,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。微软在Win2003加入了Http.sys,用于侦听http流量并根据URL进行处理,允许任意用户进程共享专用于HTTP流量的TCP端口,也就是说,多个程序可以使用同一端口进行http的监听,而Http.sys充当了nginx的⻆色。通过netsh命令可以对http.sys的命名空间进行一系列操作。比如说IIS服务器,它的最底层就是HTTP.sys驱动,HTTP.sys有两个特点

  1. 允许端口服用,可以让多个程序使用同一个端口进行监听

  2. 对HOST敏感,可以通过HOST进行分发流量。

系统当中会有一些默认的http.sys的保留注册项,如下

image-20221104150635200

而目前业内的普遍用法是使用5985端口的WinRM注册项,将其迁移到80端口进行复用,由于winrm服务在系统自带的命名空间当中已经被注册,命名空间与winrm程序之间已经有对应了,所以将winrm开在80端口就可以了,由于存在IIS的服务器IIS的80端口占用也是在Http.sys之后,所以并不会有什么报错。

1
2
3
4
5
6
7
#将winRM迁移至80
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
#将winRM还原为5985
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="5985"}
#客户端连接命令
winrs -r:http://ip -u:user -p:pwd "whoami"
#pwd可为hash

2. 为什么研究它

由于针对Linux已经有比较成熟的端口复用手段,例如在某次项目当中使用的iptables转发复用,而Windows的http.sys一直只知道存在这个东西,并知道这东西能复用,但是不知道如何复用,并没有进行武器化。

3. HTTPS 隧道

在最一开始,最理想的状态就是通过起一个HTTPS proxy的服务,让客户端通过HTTP CONNECT method来使用HTTPS代理服务。然而事实却是残酷的。

看一下HTTPS Proxy 的包

image-20221104143500783

可以看出,PATH与HOST都是代理的目标与端口,继续测试

image-20221104143605889

不难看出,HTTP CONNECT方法是不允许使用/作为uri的,我们再来看下HTTP.sys的注册要求

image-20221021163757474

矛盾点出现了,HTTP CONNECT不能有/,HTTPSYS必须要/

改协议?改驱动?显然是不可能的,这条路放弃。

4. 后门

都研究了这么久了,放弃这个思路肯定是不甘心的,思来想去,做个WebRootKit吧,通过他得天独厚的优势,做个后门。开始找相关的项目

最后找到了一个HTTP.sys的Demo

1
https://docs.microsoft.com/en-us/windows/win32/http/http-server-sample-application

进行一系列修改,得到了Joker工具

1
https://github.com/ZhuriLab/Joker

4.1 基于路径复用

1
Joker.exe "http://*:{PORT}/{PATH}"

image-20220902160750422

可直接使用最新版蚁剑进行连接,配置如下:

image-20220902161010316
连接密码随便填写

image-20220902161210934

4.2 基于HOST进行复用

1
Joker.exe "http://{HOST}:{PORT}/"

image-20220902161434903

蚁剑配置如下

image-20220902161603406

image-20220902161619869

这样,在正常访问80端口的时候为正常业务,在带特殊的host访问80端口的时候则为后门程序。

5. 适配Regorg

正当整个研究要结束的时候,突然一个工具在脑海里浮现了出来,Regeorg,一款TunnelWebShell工具,他的使用情景,不也是在不出网的地方进行正向代理吗,它虽然不能采用CONNECT方法,但是使用GET、POST方法进行传输数据同样也得到了隐藏的目的。

于是写了一个适配regeorg的demo,也就是开源在Joker当中的JokerTunnel

使用:

  1. Server端执行 tunnel.exe <url1> <url2> <url3> ...
  2. 使用regeorg客户端连接

image-20221107111636996

image-20221107111724185

本地测试访问某购物网站速度还可以:

image-20221104161428864

6. RD网关(域环境)

就当研究即将结束的时候,突然想到这一个问题,是不是所有Windows自带的Web类型的系统服务都是通过HTTP.sys进行端口开放的,若是这样,岂不是可以通过端口复用的方式进行远程桌面连接,话不多说,开始搞。

在Win2019上进行测试,开启RD远程桌面网关,看下http.sys保留注册项的变化

未安装RD网关

image-20221107142940842

安装RD网关

image-20221107143455358

image-20221107143905756

当RD网关安装完成后,可以发现http.sys多了两个443端口的注册项,证明了之前的猜想,RD网关确实是通过http.sys启动的,那么下一步就配置一下它进行远程桌面与Web的复用。正当我配置RD过程中,服务器管理器冒出来这么句话。

image-20221107145452908

经过翻阅大量文献,发现RD Gateway 需要域环境,那我就在域环境去搞吧。

6.1 开启RD服务

image-20221108113218098

image-20221108113539428

6.2 配置RD Gateway

进入RD 网关资源策略

image-20221108113824955

image-20221108113850053

选择认证方式与可登录的组员

image-20221108161336865

配置网络资源,配置RDGW可以连接到所有域内机器

image-20221108114300664

6.3 安装SSL

image-20221108114459391

创建自签名证书

image-20221108114542294

将证书导出,并安装到远程客户端机器(攻击机),远程客户端机器需要将DNS解析到域DNS上或者绑定hosts文件。

6.4 创建服务器场

image-20221108163114623

将需要远程拨上去的机器域名或者ip添加到服务器场

6.5 远程登录

更改本地的mstsc的配置,配置如下

image-20221108142819834

远程计算机输入域内机器,进行登录,登录过程中会使用两次凭据,一次为RD网关的凭证,一个是登录目的机器的凭证。

image-20221108143021661

image-20221108144018623

image-20221108163351420

从流量上来看,通过RD网关远程登录的机器,客户机与远程机器是完全没有流量交互的,再看下RD网关的情况

image-20221108163618735

可以看出,客户机与RD网关完全是通过443进行流量交互的,

image-20221108163655736

而正常情况下,去访问RD网关机器的443端口是一个Web界面

6.6 总结

这种利用条件可谓是相当苛刻,我们盘点一下都需要哪些前置条件

  1. 机器在域内
  2. 需要明文的域票据
  3. 步骤繁琐,很难将这些操作转换为命令行命令
  4. 防火墙允许443端口入站

总体来讲,这个思路也只是思路而已,很难用于真实环境。很鸡肋,不如Joker利用实用。