【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

渗透技巧 2年前 (2022) admin
1,362 0 0

一台服务器是如何支持多个域名和站点的?从查询到的资料来看,主要以下几点:

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 实现 IIS 服务器端口复用

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

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

此时使用 netsh http show servicestate 查看已注册的服务(URL):


【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

可以查看到 http.sys 新注册了一条 url

由于系统原本没有开启 5985 端口,为了增加后门的隐蔽性,故通过以下命令将 WinRM 服务端口修改至 80 端口,达到端口复用的效果。

winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}


【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

重新查看,发现已经改成 80 端口。


【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

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处理)

在此之前,我有分享过一个模版文件:

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

但看样子并没有人去下载来看。那么我就不介绍具体怎么编写了,直接给成品吧。想看代码就自己反编译吧,.NET 贼简单。

3.2.成品介绍

主界面

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

生成器

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用


功能界面

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用


命令行

【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

文件管理


【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用

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 服务器端口复用

版权声明:admin 发表于 2022年4月11日 下午4:28。
转载请注明:【权限维持】使用 HTTP Server API 实现 IIS 服务器端口复用 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...