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

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

  1. [后渗透]Windows server 80端口复用后门

    0x01 简介 该后门的基本原理是使用Windows 的远程管理管理服务WinRM,组合HTTP.sys驱动自带的端口复用功能,一起实现正向的端口复用后门. 具体细节信息请参考:https://pap ...

  2. DELPHI黑客编程(一):正向后门原理实现

    前言 在渗透测试中经常用到远控.后门等辅助后渗透权限维持工具,有一款好用的自制后门可以在巩固渗透成果方面有很大的帮助.今天给大家简单讲解下后门的原理和实现的方法,主要针对技术研究和原理演示,请各位看官 ...

  3. 一文打尽 Linux/Windows端口复用实战

    出品|MS08067实验室(www.ms08067.com) 本文作者:Spark(Ms08067内网安全小组成员) 定义:端口复用是指不同的应用程序使用相同端口进行通讯. 场景:内网渗透中,搭建隧道 ...

  4. TCP状态机:当服务端主动发FIN进TIME_WAIT,客户端源端口复用会发生什么

    0X01 正常情况下TCP连接会通过4次挥手进行拆链(也有通过RST拆除连接的可能,见为什么服务器突然回复RST--小心网络中的安全设备),下图TCP状态机展示了TCP连接的状态变化过程: 我们重点看 ...

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

    什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...

  6. 在C#中实现Socket端口复用

    转载:http://www.csharpwin.com/csharpspace/68.shtml 一.什么是端口复用:        因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在 ...

  7. 关于启动调试时,总是启动多个web端口的问题

    在一个解决方案中,经常包含多个web项目,当设置某一个web项目为起始项目后,启动调试,会发现其他的web项目的端口也会一起打开,显示在电脑的右下方,其实开启其他端口有时是没必要的,只是多占用了系统内 ...

  8. 新手篇丨Python任意网段Web端口信息探测工具

    你学习Python的目的是什么?是想写爬虫爬取数据(数据.图片等内容),还是想自写自动化的小工具,又或是作为一个新手小白单纯的欣赏这门语言呢? 今天i春秋分享的是一篇关于多线程工具的文章,工具使用效率 ...

  9. 转载:C# socket端口复用-多主机头绑定

    什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分.这种多重绑定便称之为端口复用 ...

随机推荐

  1. Mac eclipse java6环境安装

    由于旧版adtbundle eclipse需要java se6版本支持,而较新版本mac系统默认安装较高的java版本,所以这里需要卸载高版本jdk(1.8),然后安装1.6 mac删除jdk jav ...

  2. 【转帖】迅为iTOP-iMX6开发板 Ubuntu系统下WiFi模块mt6620的移植

    本文转自迅为论坛 :http://www.topeetboard.com 文档提供的文件如下. wpa_supplicant 拷贝到开发板 Ubuntu 系统的 /sbin 目录下,如何移植 wpa_ ...

  3. 浮动qq客服备份代码

    <div class="main-im"> <div id="open_im" class="open-im"> & ...

  4. bash - GNU Bourne-Again SHell

    概述(SYNOPSIS) bash [options] [file] 版权所有(COPYRIGHT) Bash is Copyright (C) 1989-2002 by the Free Softw ...

  5. 引入msword

    找到解决方法了:不是直接引入mswork.tlh文件的,该文件是#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD. ...

  6. CAD参数绘制点(com接口)

    点在CAD中的作用除了可以分割对象外,还能测量对象,点不仅表示一个小的实体,而且通过点作为绘图的参考标记. pdmode是一个控制point的形式的系统变量,当pdmode=0时是可见的一个点,当pd ...

  7. HR教你面试时怎么谈出高工资

    不是任何时候谈钱都会伤感情,比如跟客户谈合同报价,跟房东谈房租,以及面试时和公司HR谈新工作的薪酬待遇. 这事儿一般不需要你先开口.在面试进入尾声的时候,如果HR对你还算满意,通常就会开始问你目前的薪 ...

  8. 获取当前时间(日期格式) && 获取当前加一年的时间(日期格式)

    获取当前时间,日期格式function currentDate() { var date = new Date(); var y = date.getFullYear(); var m = date. ...

  9. Spring核心技术(七)——Spring容器的扩展

    本文将讨论如何关于在Spring生命周期中扩展Spring中的Bean功能. 容器的扩展 通常来说,开发者不需要通过继承ApplicationContext来实现自己的子类扩展功能.但是Spring ...

  10. 【Codeforces 1117C】Magic Ship

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 我们可以把这个行船的过程分解成两个过程 1.船经过时间t被风吹到了某个地方 2.船用这t时间尝试到达终点(x2,y2) 会发现如果时间t能最终 ...