TCP安全测试指南-魔兽3找联机0day

在安全测试的过程中,我们通常使用应用层工具直接测试待测目标,比如一个HTTP网站应用程序,我们可以直接发送HTTP请求来对其进行模糊测试,而对于HTTPS,也可以建立SSL连接后直接发送HTTP请求对其进行模糊测试然而在某些黑盒测试中,由于信息不对称,我们无法获悉应用层协议的具体格式,因此难以直接在应用层进行安全测试,这时我们需要对应用层协议本身进行FUZZ,这就需要使用更底层协议来进行安全测试本文以著名的RTS游戏魔兽争霸3为例,介绍在网络层对TCP连接进行安全测试的基本工具、方法、以及漏洞挖掘思路

0x00 概述

我想测试魔兽争霸3联机游戏的安全问题

然而魔兽争霸3并没有使用HTTP协议来进行通信,因此我既不能用burp来proxy拦截,也不能直接用curl等常用工具来进行FUZZ

魔兽争霸3联机对战使用了TCP连接,自己定义了一套数据包格式(已经有人分析过了,但在本文中我们假设数据包格式未知)

所以我要在传输层对魔兽争霸3的TCP连接进行安全测试,重点测试以下内容:

  1. 断线重连
  2. 网络的延迟与丢包
  3. TCP原始数据的嗅探/修改
  4. TCP连接的重放与交互式测试

0x01 断线测试

由于魔兽争霸3并没有断线重连机制,所以TCP连接断开后会直接导致游戏断开,而在许多第三方对战平台上,玩家的离线等同于战败,因此也诞生了许多游戏“踢人”外挂

下面使用WooyunWifi路由器上的dsniff工具包中的tcpkill工具为例进行测试:

a1

这里演示的是全局切断,在实际应用场景中也可以使用包过滤表达式切断特定IP的连接

0x02 网络的延迟与丢包

由于魔兽争霸3是一个实时对战的游戏,因此网络状态也会影响游戏的进行,魔兽争霸3本身对于实时操作的要求并不高,但是形如DOTA之类的自定义游戏模式对网络的延迟极为敏感,如果玩家在DOTA游戏中有很大延迟,可能会直接导致团灭并且游戏失败

下面使用WooyunWifi路由器上的tc工具中的netem内核模块为例进行测试:

a2

由于网络延迟,玩家控制的英雄在延时时间内无法响应玩家的操作

a3

当然,您也可以用包过滤表达式指定任意ip的延时规则,包括随机浮动的延时时间

0x03 TCP原始数据的嗅探/修改

如何嗅探TCP数据包已经是妇孺皆知的常识了,用wireshark或者tcpdump之类的都可以

至于如何修改TCP数据包,我推荐使用TCP透明代理模式来进行操作,原理其实和HTTP透明代理相似

至于工具我测试了3款,各有千秋:netsed简单实用少依赖,mitmproxy无比强大有扩展,bettercap则是替代ettercap的ruby工具

首先,我们在11对战平台上新建一个房间,然后打开wireshark,抓取war3的服务器端口(11对战平台使用的是服务器建主策略,并不是玩家建立主机,而是在服务器上有一个proxy专门用来与各个客户端通信)

a4

我们可以看到建主服务器ip为119.188.39.137,端口为2012,而聊天数据以及最开始交换用户名的数据都是明文的,而且后来测试发现也没有数据完整性验证

下面使用WooyunWifi路由器上的netsed工具为例进行测试:

于是整局游戏里lxj616都在其他用户眼里变成了wooyun,包括聊天和玩家列表

a5

a6

当然,netsed只有简单的替换功能,下面介绍一些更灵活的解决方案(不再以war3为例)

mitmproxy的官方示例介绍了如何修改TCP数据

下面使用Woobuntu系统上的mitmproxy工具为例进行测试:

a7

bettercap的官方示例介绍了如何修改TCP数据:

下面使用Woobuntu系统上的bettercap工具为例进行测试:

注:tcp-proxy刚开始时显示未启动,后面在输出信息中后续启动的tcp-proxy

a7

0x04 TCP连接的重放与交互式测试

如果只是想要重放TCP的数据包本身而非TCP连接,使用tcpreplay工具直接重放即可,这种方式确实可以把之前抓取的pcap数据包全部重放到指定的interface上,这在测试一些IDS设备或者有抓包业务逻辑的应用时能起到预期的效果

下面使用Woobuntu系统上的tcpreplay工具为例进行测试:

a9

然而仅仅重放抓取的数据包并不能建立有效的tcp连接,因此也不会被服务端正确的响应,这样就起不到FUZZ服务端应用的作用了,我们如果想要和服务端模拟一次真正的TCP会话,就必须在建立新连接后重新填写数据包对应的TCP序列号。形象的比喻一下就是你在重放HTTP请求时要修改你自己cookie里面的session-id

如果要重放tcp连接,可以使用tcpreplay系列工具中的tcpliveplay工具:

不过我必须说这工具兼容性太差了,必须要按照官方文档中的Fresh Install Guide来配置特殊依赖,而且内核不可以用新版本,因此在Woobuntu 16.04上根本无法正常运行该工具

不过使用tcpliveplay并不是最好的办法,因为它的原理是解析并修改tcp协议包,而实际上我们的目标并不是解析并修改传输层的tcp协议包,我们只是要FUZZ上层应用,因此我们直接新建一个tcp连接,然后重放tcp承载的数据就可以了

下面以基于Ubuntu的Woobuntu系统为例进行测试,首先安装所需的tcptrace,以及可能需要的tcpslice

之后我们抓取我们想要重放的tcp数据包,这里我们用wireshark进行抓取,抓取的是玩家lxj616加入房间然后在聊天栏里面说了两句话整个过程

a10

您也可以在WooyunWifi路由器上通过tcpdump工具进行抓包

抓完的包可能会很大,而路由器存储空间较小,所以设置了文件分段,分段的文件形如:

lxj616.pcap

lxj616.pcap1.gz

lxj616.pcap2.gz

(可选)我们可以把他们通过以下命令合在一起:

在抓到足够的数据包后,我们从中解析出各条tcp连接的数据:

这个警告是发现了不完整的TCP数据流,因为我测试时没点退出游戏就关闭抓包了

然后在当前目录下会生成形如a2b_contents.dat或者b2a_contents.dat的文件,找到哪一个是我们需要重放的流数据(同时注意数据方向)

最后我们来重放TCP连接请求测试:

a11

而对于游戏主机来说,确实看起来有玩家跑进来说了两句话

a12

0x05 总结

虽然在本文中对魔兽争霸3测试时发现了一些潜在问题,但都只是程序逻辑的小问题,而非安全性bug,因此在不会影响游戏平衡性的条件下,不需要把它们当做漏洞进行报送(虽然对于11对战平台而言,用户名是不可以修改的,但是你改了又能怎样,并没有用),写出本文来分享思路,供同道中人一起学习讨论。、

【via@drops】本文系授权转载,来源乌云知识库,未经授权请勿转载本文。