0×0 前言

HTTP隧道用于在受限网络连接的条件下在两台计算机之间创建网络链接,用于绕过IDS、Firewall一类的安全设备限制实现基于HTTP协议的通信,常常用于内网里面的端口转发与流量代理由于HTTP通信流量往往与正常流量差异较少一般不容易被检测出来。

由于工作需要就简单的做了一下研究与分析,个人愚见大佬勿喷。

0×1 部署

HTTP隧道的工具种类也比较多就找了一个经典的reGeory,之前也研究过php的Tunna-v1.1版本但是里面涉及到dll的导入函数在新版的php版本当中已经废弃了这里巨坑。

reGeory github连接如下:

https://github.com/sensepost/reGeorg

web服务器使用window2008+java+tomcat的环境:

reGeorg支持多种web环境的脚本,特别区分了一个tomcat5的版本。

Kali本地访问远程服务器上面的tunnel.jsp成功返回后,利用reGeorgSocksProxy.py脚本监听本地的9999端口,这里就建立了一个通信的链路。

同时查看本地端口可以发现9999端口已经开启。

kali本地配置一下proxychains:

0×2 暴力破解攻击

传统的web系统服务器往往通过NAT转换后不会讲本地的3389开放到公网,基于互联网的暴力破解很容易就被传统的安全设备捕获到异常很快就被锁定了,使用HTTP隧道进行端口转发可以直接访问到web服务器的3389端口,进行暴力破解的流量特征也不明显。

本地调用hydra对web服务器的3389进行暴力破解:

流量层面捕获到的都是http流量无rdp协议的流量,cap包里面的字段基本无可读性。

暴力破解成功后可以直接映射端口使用rdesktop实现远程登录:

依稀还能看到hydra暴力破解成功后的登录痕迹:

在系统的安全事件当中可以分析到相关的日志,源IP为真实发起攻击的IP地址。

0×3 流量分析

本地查看一个tunnel.jsp的connect方法实现代码,主要调用了socket.channel定义了一个连接到TCP网络套接字的通道。

IP与Port都是从HTTP Header当中的变量获取,cmd的执行命令也是从header当中获取,并用x-status来标记当前的状态值,同时本地设置了一个sessions保存当前的socketchannel回话。

在wireshark获取到的流量中就可以轻易发现,IP与端口在最开始连接的时候都是通过URL进行传递。

Connect连接到IP与端口,3389为rdp暴力破解的端口:

统计一下关于tunnel.jsp的请求参数与变量请求数量如下:

cmd的主要参数包括forward,read,disconnect,connect几个参数,数据包的主要请求几种在read与forward的参数传递过程,每次请求的相隔时间也是非常的短。

关于forward的代码实现如下:

先从session当中获取到socketchannel之后定义了一个buf确认要发送的内容。

SocketChannel.write()方法的调用是在一个while循环中的,由于Write()方法无法保证能写多少字节到SocketChannel,重复调用write()直到buf没有要写的字节为止。

流量层面的表现如下:

客户端在设置header参数的关键代码如下,cookies、content-type、connection选项都有,感觉还是差了一个User-Agent、referred这些常见的头参数完全可以伪造一个这些参数做的更真一些。

有二个情况会触发break操作,传递的data内容为空时或者status状态码不为OK时。

0×4 总结

1.HTTP隧道的流量与正常的网站访问流量差异较少能够较好的避开安全设备的检测,再配合一些web命令执行或上传漏洞能够较好的进入内网开启内网漫游之旅。

2. 日常在运维与日志是审计的时候可以结合行为特征与异常参数识别异常的HTTP请求。

3. reGeorg的脚本特征太过于明显了部分杀软已经可以查杀,但是思路好的稍做二次开发后加入免杀又是一条好汉。

*本文作者:si1ence