这是白帽子(twitter:@spoofyroot)在2019年发布的一篇文章,完整介绍了这位师傅在挖掘Edge浏览器漏洞的思路、利用、组合。其中第三个漏洞的利用链的构造过程很有借鉴意义
前言:
Edge 浏览器是微软以 Chromium 为基础开发而来的一款浏览器产品, Chromium 是Google公司开发的一个开源浏览器项目,著名的 Chrome(谷歌浏览器)便是基于 Chromium 发展而来。
2019 年 8 月 20 日,微软旗下的 Edge 浏览器启动了一项漏洞奖励计划,规定只有 Edge 浏览器内微软自有的代码发现安全问题才能获取奖励,这意味着可用攻击面将被大大减小,而作为补偿,微软将提供双倍奖励金(相对于 EdgeHTML ),也就是说 Edge 浏览器里的一个漏洞赏金将会达到 30000 美元。 【译者注:Chromium 可以说是 Chrome 的前身,也被称为谷歌浏览器内核。其实前者相当于是实验版,后者相当于是正式发行版。EdgeHTML 是微软在 IE 浏览器上完善发展而来的一个新的浏览器内核,本来准备用在 Edge 浏览器上,后来放弃了,改用 Chromium 】
在这篇文章里,我将介绍我是如何在 Edge 浏览器发现的 3 个不同的漏洞获取到 40000 美元奖励。这是我在微软的这项漏洞奖励计划第一次通过漏洞,感觉就是很爽。
新标签页的XSS
新标签页就是当打开浏览器时显示的默认页面,这个默认页面是浏览器默认设置里的默认页面,而不是其他情况下例如自己设置的默认页面。Edge浏览器的默认页面与其他浏览器是有所区别的,是一个网站,地址是
与此同时,Firefox 浏览器是一个内部的about:home和about:newtab页面,Chrome 浏览器是一个离线的chrome-search://local-ntp/local-ntp.html页面。这些区别是有必要探究的,因为在规定的漏洞奖励计划里只对微软自己写的代码出现安全问题才有效。
这个漏洞实在不经意间发现的,事实上,当我第一次打开 Edge 浏览器时根本没有想太多,直接就奔着 Edge 与 Chromium 的不同的地方去了,其中一个就是 Edge 新增的集锦功能。
集锦就像是一个功能更强大,丰富的书签。当添加一个网站进入集锦里,就会将该网页的标题,描述和一张图片进行精简展示,我做了一项尝试就是在保存的网页 title 里添加 HTML 标签,看这些 HTML 标签是否会在集锦里面进行渲染,测试后发现并没有。
找了一会没成果就去睡了,直到第二天早上当我打开Edge浏览器的时候进行新一轮尝试的时候,发现新标签页面的一些不同。
1.png看到那个小小的,加粗的字母 ’a‘ 了吗?
因为是一个新的浏览器,任何被浏览过的网站都会变成我的最近浏览记录然后保存在新标签页快速链接区域并且这里未对标题进行处理。这个地方甚至可以执行 JS 代码,于是一个 XSS 的测试语句成功执行,以下是视频:
NTP-TOPSITE-XSS.mp4
你可能想问这有什么值得惊喜的,或者说我在新标签页上拿到了一个 XSS 又怎样?事实上,新标签页是一个拥有高权限的页面,可以通过测试 Chromium 内核的浏览器内置的 Chrome 对象来验证。
下面这个验证图片将 Edge 中的普通网页和浏览器设置页中的 Chrome 对象所含有的方法进行对比:
2.png很明显设置页面的 Chrome 对象包含更多的方法并且这些额外的高权限函数,而通过这个 XSS ,我们可以将 Javascript 从普通 Web 网页注入到更高特权的网页中,从而进行提权。那么接下来要做的就是如何使用这些特权造成更大危害。权限提升到RCE
在知道通过 Chrome 对象可以调用高权限函数后,我尝试寻找其他 JavaScript 对象或者 Chrome 对象的其他方法来利用这个漏洞扩大危害。 最终发现了一个未被记录的对象chrome.qbox,因为没有找到任何介绍这个对象详细信息的网站,于是推测这应该是微软自己写的一个新对象,但是它到底是什么呢?看这个视频:
qbox.mp4
视频里可以看到我发现chrome.qbox.navigate是一个特别的函数,通过报错信息,发现这里需要填入qbox.NavigationItem类型的参数。
几次尝试后,发现可以将一个内含 url 和 id 的 JSON 对象传入函数,至少得包括这俩键值才不会产生报错信息。chrome.qbox.navigate({ id:0, url:””})本以为会产生什么弹窗或者出现新的窗口,但是什么都没有。在这之后,我开始在 url 和 id 的值上进行尝试,当测试到一下值时,终于出现了异常chrome.qbox.navigate({id:999999,url:null})运行这条语句后,Edge 浏览器窗口消失了,之后查看系统错误日志后发现一下信息:
(69a4.723c): Access violation - code c0000005 (first/second chance not available)
ntdll!NtDelayExecution+0x14:
00007ffd`9fddc754 c3 ret
可能是一个近指针NULL(near NULL),感觉没啥可以利用的。 【译者注:近指针NULL,与编译器和CPU相关。过去的编译器,针对指针有 far 和 near 的区别】
rax=000001ff5651ba80 rbx=000001ff5651ba80 rcx=000001ff5651ba80
rdx=3265727574786574 rsi=000001ff5651ba80 rdi=0000009eb9bfd4f0
rip=00007ffd17814b40 rsp=0000009eb9bfd300 rbp=000001ff4fec30a0
r8=000000000000008f r9=0000000000000040 r10=0000000000000080
r11=0000009eb9bfd290 r12=000000000000006f r13=0000009eb9bfda90
r14=0000009eb9bfd478 r15=00000094b5d14064
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
msedge!ChromeMain+0x9253e:
00007ffd`17814b40 488b02 mov rax,qword ptr [rdx] ds:32657275`74786574=????????????????
Resetting default scope
FAULTING_IP:
msedge!ChromeMain+9253e
00007ffd`17814b40 488b02 mov rax,qword ptr [rdx]
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007ffd17814b40 (msedge!ChromeMain+0x000000000009253e)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff
DEFAULT_BUCKET_ID: INVALID_POINTER_READ
PROCESS_NAME: msedge.exe
不过好像让程序崩溃时可以利用的,但是由于并不擅长内存方面的漏洞,于是不得不又去读了 MDN【译者注:MDN是MDN Web Docs( MDN 网络文档)这个网站的简称,是一个汇集众多 Mozilla 基金会产品和网络技术开发文档的免费网站,其实就是一个放了很多技术文档的一个网站。】文档关于可利用程序崩溃方面的信息,之后再次对qbox.navigate函数进行测试,尝试找出利用崩溃的方法,以下是相关 POC(和利用程序崩溃达到其他目的不同,这个 POC 只能让浏览器运行崩溃):
test<iframe/src=1/ onload=chrome.qbox.navigate(JSON.parse(unescape("%7B%22id%22%3A999999%2C%22url%22%3Anull%7D")))>
q
这两个漏洞最终被微软确认,XSS 漏洞给了 15000 美元,运行崩溃给了 10000 美元。所以准确来说我在 Edge 上已经发现了两个漏洞!
控制新标签页
在之前的漏洞中可以知道浏器网页内容的提供非常依赖于在 XSS 漏洞中发现的ntp.msn.com网站。那么,为什么不将ntp.msn.com当作测试的目标呢?从上一个 XSS 漏洞可以知道,我只需要发现一个 XSS 漏洞就可以将其当作浏览器漏洞进行上报。
当浏览网站时,他看起来是很正常的新标签页,只是加载异常,这很正常,也很很重要。你看,正常的新标签页:好像通过某种特殊的缓存机制进行加载,因为它的源代码也与之前那个不一样。
然后尝试通过 Burp 发现网站的漏洞,最终发现如果设置一个名为 domainId 的 cookie , cookie 将会伴随 script 标签显示在页面上,因为没有对引号进行处理,所以可以通过这个 cookie 变量将代码注入。
不仅如此,更厉害的是我设置的cookie在给定主机的所有子域里都是可见的。所以我只需要在任意的MSN的子域里找出一个 XSS ,然后我就可以通过 XSS 设置 cookie 并且让 js 代码在刚刚的异常页面执行。一番操作后,在成功找到一个 XSS 漏洞,这个网站现在已经转移。很快便发现,可以通过发送一个构造的 POST 请求来让该网站产生错误消息,并且在此错误中,它显示了导致错误的未被处理变量值。
限时特惠:本站每日持续更新海量各大内部网赚创业教程,会员可以下载全站资源点击查看详情
站长微信:11082411