一台服务器是如何支持多个域名和站点的?从查询到的资料来看,主要以下几点:
•Nginx:通过 Nginx 区分主机头
,从而决定请求访问到哪个应用;•IIS:通过 http.sys 驱动监听流量
,从而决定请求访问到哪个应用;•Apache:httpd.conf 中的 ServerAlias
。
本文围绕如何构建一个适用于 IIS 6 及以上版本的端口复用后门进行叙述,演示程序使用 C# 及微软官方 HTTP Server API 1.0 进行开发,最终实现与 IIS 共享 80/443 端口,对特定的请求进行响应的后门程序。
本地测试环境:
OS | IP | 架构的应用 |
Windows Server 2012 Database | 192.10.22.233 | Exchange 2016 |
Windows 10 Pro | 192.10.22.112 | 无 |
0x00 前言
通常,在 WEB 应用中,一个应用只能绑定一个端口,若同时绑定一个端口,必然会抛出端口占用异常信息,微软在 IIS 5.0 以后版本提供了一种机制,Net. Port Sharing,即端口共享。它允许对应用同时使用一个端口,只需要各自注册的 URL 后缀不一样即可。这种机制被封装在 http.sys 驱动中,驱动监听 HTTP 流量,然后根据 URL 注册的情况去分发到当前 URL 对应的应用。微软对外开放了该接口,并文档介绍[1]如何调用这种机制的 API 接口,也就是 HTTP Server API,而非常让人高兴的是 IIS 也是基于此机制开发并运行的。
端口复用基础原理知识这里将不会赘述,不熟悉的读者可以自行网上查阅相关介绍。
0x01 IIS 与 HTTP Server API 的关系
如下图:
HTTP Server API 运行在用户模式中,也就是说任意用户都可以调用该 API 实现一个 HttpListener,与 IIS 共享端口,但是前提是你必须拥有管理员权限。
上图整个过程描述如下:
(1)第一步:IIS 或者是自己写的程序(HttpListener)调用 API ,向内核态的 Http.sys 注册一个 URL 后缀,这相当于向路由器添加一条路由规则,Http.sys 就是这个路由器。MSDN示例:点此[2]
(2)第二步:Http.sys 捕获到一个 HTTP/HTTPS 请求,它将会根据自身的“路由表”找到该 HTTP/HTTPS 请求的后缀所对应的应用,然后把请求分发给该应用。
(3)第三步:HttpListener 接收到 Http.sys 转发来的请求,对其进行回应。
整个过程很简单,而微软自带的 WinRM 就是应用了这个过程。
0x02 WinRM 服务端口复用
实际上,WinRM 服务就是基于 http.sys 驱动上注册了 /WSMAN/
后缀,Windows Server 2008 默认关闭 WinRM 服务,Windows Server 2012 默认开启。
####2.1.配置 WinRM
在命令行下开启服务,防火墙会自动添加例外规则,系统默认监听端口5985。
winrm quickconfig -q
此时使用 netsh http show servicestate
查看已注册的服务(URL):
可以查看到 http.sys 新注册了一条 url
由于系统原本没有开启 5985 端口,为了增加后门的隐蔽性,故通过以下命令将 WinRM 服务端口修改至 80 端口,达到端口复用的效果。
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
重新查看,发现已经改成 80 端口。
2.2.远程连接 WinRM
默认客户端连接则会提示 Winrs error:WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同,或者客户端计算机…,因为 WinRM 只允许当前域用户或者处于本机 TrustedHosts 列表中的远程主机进行访问,则需在客户端添加一个 TrustedHost 表,*代表信任远程任意主机:
winrm set winrm/config/Client@{Trustedhosts="*"}
然后使用winrs命令连接远程web服务端口获得交互式SHELL,
0x03 后门功能设计
微软官方有一个基于 HTTP Server API 1.0 版本的 Demo[3],本文基于该 demo 进行修改,设计一个功能较简单的后门,实现对 http 请求也就是80端口的共享,该 API 同时支持 HTTPS 协议。
功能设计:
1.与 IIS 共享 80/443 端口;2.对传来的 HTTP/HTTPS 请求进行身份验证,验证成功时进行回应3.命令执行4.流量加密(暂时只对命令进行base64处理)
在此之前,我有分享过一个模版文件:
但看样子并没有人去下载来看。那么我就不介绍具体怎么编写了,直接给成品吧。想看代码就自己反编译吧,.NET 贼简单。
3.2.成品介绍
•主界面
•生成器
•功能界面
•命令行
•文件管理
0x04 参考
https://c1y2m3.github.io/2019/11/21/httpsys/
https://reuodut.com/2019/07/%E7%AB%AF%E5%8F%A3%E5%A4%8D%E7%94%A8-%E4%BD%BF%E7%94%A8HTTP-Server-API-%E5%AE%9E%E7%8E%B0-IIS-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%AD%A3%E5%90%91%E5%90%8E%E9%97%A8-C++%E5%AE%9E%E7%8E%B0/
https://docs.microsoft.com/zh-cn/windows/win32/http/http-server-sample-application
https://3gstudent.github.io/%E5%88%A9%E7%94%A8IIS%E7%9A%84%E7%AB%AF%E5%8F%A3%E5%85%B1%E4%BA%AB%E5%8A%9F%E8%83%BD%E7%BB%95%E8%BF%87%E9%98%B2%E7%81%AB%E5%A2%99
原文始发于微信公众号(RowTeam):【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论