Web端口复用正向后门研究实现与防御

0×01背景

现在的很多远控/后门因为目前主流防火墙规则的限制,基本上都采用TCP/UDP反弹回连的通讯形式;但是在较高安全环境下,尤其负责web相关业务的环境,因为安防设备(防火墙,IDS,IPS等)规则的严格限制,TCP/UDP(HTTP/HTTPS/DNS)甚至ICMP等隧道都不能很轻易从内网访问Internet,只接受外部的请求。在这种场景下,攻击者在拿到了webshell的前提下,考虑植入除webshell以外的后门就需要考虑如何来绕过防火墙等安防设备的限制了。

实际上关于端口复用这一古老的后门技术,一直研究者众多,也提出了一些卓有成效的方法和工具,其中很多的解决方案都是通过劫持web服务器相关进程/服务的内存空间、系统API甚至劫持网络驱动去达到目的,手法相当精妙,不过因为动作较大在不经意间就会触发主动防御。本文将从IIS 6.0以后的微软提供的原生机制出发,讨论一种较自然的端口复用的技术:Net.tcp Port Sharing,直译是为“端口共享”。

本文将通过分析Net.TCP Port Sharing这个机制,最后实现一个基于端口复用的正向后门,目的是分享一些攻防技术的研究成果,请勿作为非法用途。

0×02 Net.TCP Port Sharing 机制

在以前的Web应用中,一个Web应用绑定一个端口,若有其他应用则需要绑定其他的端口才能是西安监听。如下图所示,Web Application 1绑定了80端口后,Web Application 2再去绑定80端口会出错。

现在使用微软提供的NET.TCP Port Sharing服务,只要遵循相关的开发接口规则,就可以实现不同的应用共享相同的web服务器端口。如下图中Web Application1 和Web Application2同时绑定在80端口。

Net.TCP Port Sharing服务是WCF(Windows Communication Foundation)中的一个新的系统组件,这个服务会开启net.tcp 端口共享功能以达到在用户的不同进程之间实现端口共享。这个机制的最终是在HTTP.sys中实现的,目前将许多不同HTTP应用程序的流量复用到单个TCP端口上的HTTP.SYS模型已经成为Windows平台上的标准配置。这为防火墙管理员提供了一个共同的控制点,同时允许应用程序开发人员最小化构建可利用网络新应用程序的部署成本。跨多个 HTTP应用程序共享端口的功能一直是Internet信息服务(IIS)的一项功能。实际上,HTTP.SYS允许任意用户进程共享专用于HTTP流量的TCP端口。

HTTP.sys是在Windows Server 2003最开始引进的,这个驱动监听HTTP流量,然后根据URL注册的情况去分发,这样多个进程可以在同一个端口监听HTTP流量了。微软公开了HTTP Server API库,像httpcfg,netsh.exe等都是基于它的。如下图。

整个过程描述如下:

(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对应的应用,这是路由的过程。

0×03 后门实现方式研究

微软提供了HTTP Server API库用于构建在Windows上的Web服务器,原生支持基于Net.tcp Port Sharing的Web Application 开发。目前HTTP Server API有两个版本,推荐使用HTTP Server API 2.0。微软提供了HTTP Server API 1.0的一个demo,地址在: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v=vs.85).aspx

这是一个简单的基于HTTP Server API 1.0的web server 例子,通过修改可以实现远程命令执行的功能。

开发的应用只需要注册与当前系统不冲突的URL(绑定的地址是一致的,只是URL路径有差别),就可以实现URL注册,浏览器(或者自定义开发的客户端网络程序)访问对应的URL,服务端网络程序会根据自身注册的URL去解析执行客户端的命令。基于此,完全可以通过服务器注册一些特殊URL与客户端访问这些URL来达到一个HTTP一问一答的访问模式的正向后门。

0×04 功能演示

环境:Windows 2008 R2 x64

IIS 7.0(默认设置)

防火墙状态默认开启

权限要求:功能需要Adminstrator用户的完整性级别,即使没有启用Administrator,通过UAC提高程序完整性级别即可运行程序。

达到的目的:与Web服务器绑定同一端口,自身程序不监听端口,通过注册回调函数等待系统服务分发流量。服务器通过解析客户端发送的请求(GET/POST或者其它方法)载荷,解析执行命令,然后以HTTP Response 的形式返回给客户端。

(1)在部署IIS的服务器上,后门程序注册一个URL

  当前编写的只是一个demo,若是要做用户态Rootkit,就需要做自身隐藏的功能,请读者朋友们自由发挥,在这个过程中需要注意权限的控制。

(2)使用控制器连接目标机器的URL

当前控制器作为一个demo实现了一个交互式的CMD SHELL,代码优化后会开源出来。

0×05 缓解措施与对抗策略研究

(1)防火墙/IDS/IPS与web服务器配合使用,在其规则中采用白名单机制去判断是否属于web服务器当前允许的ACL URL。

(2)请大家提出更多的建议。

0×06 参考文献

https://www.codeproject.com/Articles/437733/Demystify-http-sys-with-HttpSysManager

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364510(v=vs.85).aspx

时间: 2024-10-26 06:09:14

Web端口复用正向后门研究实现与防御的相关文章

安全之路 —— 利用端口复用技术隐藏后门端口

简介 前面我们介绍到我们可以用进程注入的方法,借用其他应用的端口收发信息,从而达到穿墙的效果,那么今天介绍一种新的方法,叫做端口复用技术,他能够与其他应用绑定同一个端口,但同时进行端口复用的程序会接管之前程序的信息接受权,所以我们在复用端口后,要对非后门信息通过127.0.0.1本机回环地址进行消息转发. C++代码样例 ///////////////////////////////////////// // // FileName : ReUseSocket.cpp // Creator :

企业边界网络设备的一般配置:ACL、端口复用(PAT)、端口映射

一.概述: 企业的边界网络设备一般是路由器或者多层交换机,主要实现的功能如下:(1)实现内网部分设备访问外网:(2)客户从公网访问企业内网的Web服务器等:(3)运维人员从外网访问企业内部的部分设备进行远程维护.其中第一项功能需求通过ACL和端口复用(PAT)技术实现,第二.三项功能需求通过端口映射技术实现. 本文结合拓扑图讲述上述几项功能的实现技术及具体配置. 二.拓扑图说明: 如上图所示,绿色背景部分为企业内部网络环境(COMPANY-Network),蓝色背景部分为运营商网络环境(ISP-

Linux网络编程——端口复用(多个套接字绑定同一个端口)

在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下: [objc] view plaincopy #include <stdio.h> #include <stdlib.h> #include <string.h> #inclu

TCP套接字端口复用SO_REUSEADDR

下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回“Address already in use”(即使使用了SO_REUSEADDR). 2.进程创建监听套接字,邦定一个指定端口,并接受了若干连接,为每个连接创建子进程为连接服务.杀死监听套接字所在进程,然后重新启动.重新启动的进程调用bind重新建立监听套接字.这次邦定只有在bind前指定了SO_REU

Netscaler的超高端口复用助力应对公网地址紧张

经常会有人问一个IP只有65535(姑且不考虑预留端口),从Big-ip迁移到Netscaler后需不需要增加Ip地址数量来应对大吞吐的场景,尤其是链路负载均衡的应用? 众所周知,Netscaler对比Big-ip具有明显的节约地址的特点,基本上Netscaler可以用最少2个公网地址(管理地址为私网地址)就可以提供外网服务(NAT在Netscaler上而非防火墙),而Big-ip至少需要4个公网地址. 在Big-ip的环境下大家会预留很多Ip地址来应对端口不够用的情况,但如果在Netscale

Linux下的socket编程实践(三)端口复用和 P2P多进程服务器

Socket端口复用 先说为什么要使用socket端口复用?如果你遇到过这样的问题:server程序重启之后,无法连接,需要过一段时间才能连接上? 1.一个监听(listen)server已经启动 2.当有client有连接请求的时候,server产生一个子进程去处理该client的事物. 3.server主进程终止了,但是子进程还在占用该连接处理client的事情.虽然子进程终止了,但是由于子进程没有终止,该socket的引用计数不会为0,所以该socket不会被关闭. 4.server程序重

【 socke】C# socket端口复用-多主机头绑定

什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用. 二.我们如何实现Socket端口复用: 其实我们要实现端口复用很简单,我们只要使用SetSocketOption函数设置Socket选项就可以了.MSDN是这样解释的: Socket 选项确定当前 Socket 的行为.对于具有 Boolean 数据类型的选项,指定非零值可启用该选项,指定零值可

木马控制技术(二) -- 端口复用

本文转自:http://www.cnblogs.com/handt/archive/2012/08/10/2631728.html 端口复用,字面意思就是,重复使用一个端口 记得有一次同学的 sina 微博总是自动发消息,当时让他查看本地端口,再通过端口找到对应程序 学了端口复用和线程注入之后,发现这种方法对“高级点”的木马完全没用…… 还是需要一些强大的 HIP 工具来检查 回到正题 端口复用,使用到了一个重要的函数: intsetsockopt( __in SOCKET s, __in in

Linux网络编程:端口复用

在<绑定( bind )端口需要注意的问题>提到:一个网络应用程序只能绑定一个端口( 一个套接字只能绑定一个端口 ). 实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #i