0x00背景
windows平台下,浏览器安全是绕不过的话题,其涉及的安全问题涵盖二进制和web,攻击场景也非常多样化:
- 用户点击攻击者的恶意URL链接被感染恶意代码
- 访问恶意站点被绕过同源策略窃取cookies
等等。
本文关注的是第一类攻击场景:用户访问恶意URL被感染恶意代码。
传统的攻击场景是:攻击者伪造系统管理员身份发送一封邮件给用户,邮件内容中附带攻击者的URL链接,注明为系统安全补丁升级包。用户收到这封邮件后会去下载并运行该“系统安全补丁升级包”,被感染恶意代码。把整个过程分解一下:
-
攻击者诱导用户访问构造的恶意URL
-
浏览器弹出是否下载攻击者的恶意程序询问框,用户点击"是",浏览器开始下载攻击者的恶意程序
-
用户运行刚下载的恶意程序,被感染
可以看到这样一个完整的攻击流畅,每一步都需要用户主动参与。
攻击者能否成功的实施攻击,达到让用户感染恶意代码的目的,这在很大程度上取决于用户本身。对于有一定安全意识的用户,这类攻击是比较难成功的,因为他们知道从官网下载所需要的软件、不运行来历不明的软件。攻击者的社工能力,对恶意URL的包装能力,显得十分重要。
那么为了解决这一问题,攻击者的技巧也在进步,最近几年浏览器相关的各种漏洞频繁爆出,包括IE、chrome、adobe flash等,并且已经公开有相关远程代码执行漏洞的利用程序(exp)也不少。由于微软和谷歌都给自家的浏览器加上了沙箱,浏览器在访问URL时的进程完整级别都为low、Untrusted或者AppContainer,如下:
攻击者获得远程代码执行之后,还需要利用突破沙箱的漏洞(沙箱本身或者操作系统内核漏洞),提升权限才能执行下载的恶意代码。
攻击者如果结合这两类exp,就可以省去步骤2和步骤3,将攻击场景变为用户访问攻击者的URL就执行恶意代码。如果还能结合XSS漏洞,用户主动点击攻击者的URL这一步骤都可以省去了。这样攻击的成功率不仅会大大提高,也会增加了隐蔽性。
0x01 问题
作为安全工作者,有时需要重现这样的一套攻击场景。在具体实现的时候,可能会遇到一个问题:如果直接利用msf windows/download_exec 模块生成的shellcode作为flash漏洞payload,无法将第二阶段内核提权exp下载成功。
这个问题其实就是因为沙箱的存在所导致的,本文就是为了解决这一问题,下面会给出两种思路。
0x02 解决方法
在给出具体的解决方法之前,我们再具体的看一下这个问题。这次可以将Flash的shellcode改为反弹shell,比如使用msf的 windows/meterpreter/reverse_http 模块,将LHOST设置为监听计算机的IP。在获取到meterpreter shell之后,查看一下当前程序所在的目录:
可以看到,当前文件目录为当前用户的桌面。
这时试着在这个目录下面创建一个文件,随便输入一些内容,看是否能够成功:
失败了,显示错误为权限不足。看到这里,或许你已经明白了为何使用msf模块windows/download_exec会失败的原因了:我们一般在使用的时候都只会更改URL参数,很少去更改EXE参数,即使去更改EXE的值也只是换个名字罢了,不会去设置下载文件的全路径,所以默认下载的位置就会是:当前桌面/EXE的值。因为沙箱所导致的权限问题,这样就会失败。
2.1 思路一
所以解决的思路之一就是设置EXE的全路径,让其下载到当前权限下可以写入的路径。那么当前程序可写入的路径有哪些呢?这可以通过一个简单的操作就可以得到了。
首先利用windbg附加到IE浏览器,然后设置下面断点:
因为IE在正常运行的时候,自身也是要进行文件写入操作的嘛。在windbg中输入g命令,继续让IE运行,断下来的时候查看Createfile第一个参数的值:
“C:UsersWin7SP1AppDataLocalMicrosoftWindowsTemporary Internet FilesLowContent.IE5O24JWRDTfdd05fdad54c04a2b94bfc425cf303de[1].js” 就是IE当前写入文件fdd05fdad54c04a2b94bfc425cf303de[1].js的全路径,那么C:UsersWin7SP1AppDataLocalMicrosoftWindowsTemporary Internet FilesLowContent.IE5就是当前IE可以写入的目录了。我们在文件管理器中查看一下该文件:
再仔细看一下这个目录,这似乎正是IE的缓存目录?!我们来查看一下:
所以,此时的IE为什么对该目录具有写入的权限也是很容易理解了。那么将windows/download_exec的EXE参数设置为IE缓存目录下的一个全路径,似乎就可以解决了?在实验环境中,这样是可以的,但是在真实的攻击场景中,你还需要面对另一个问题---- 仔细看一下这个缓存路径,里面包含着当前用户的用户名:Win7SP1。
这就意味这我们需要知道当前的用户名,或者是能够获取当前的用户名动态的拼接全路径。msf中是不具有这样的模块的,这需要我们自己编写shellcode来达到目的,这部分内容的具体实现就不在这里详细介绍了,有兴趣的可以去查阅相关shellcode的编写技巧。
2.2 思路二
如果你使用过msf中内核提权漏洞的利用模块,在使用的时候,你只需要设置一个SESSION参数就可以了。
这个SESSION可以是之前,你利用像flash这种远程代码执行漏洞所获取到的一个session。将这个session值赋值给SESSION参数,如果目标符合内核提取漏洞的利用条件,就能够获取到一个目标系统权限的shell。
前面已经提到了,此时IE可以写入的目录只有IE的缓存目录,而这个目录是和当前用户名相关的,需要获取到用户名才能够正确设置。但是我们在使用的时候并没有显示的设置这个参数,那么msf是怎么来操作的呢?我们可以来查看一下msf内核利用模块的源代码:
msf的源代码还是非常具有可读性的,函数命名都是按照要实现的功能来的,不懂msf那套API也是可以看懂大概。
注意红框中的代码,可以看出msf的操作:
-
在目标计算机上以隐藏的方式,启动一个notepad进程。
-
打开启动的notepad进程,获取到进程句柄。
-
判断目标操作系统位数,将dll形式的提权exp注入到notepad进程中。
-
启动注入的dll,完成提权。
所以,解决思路之二也就明显了,我们可以让IE创建一个新的进程,然后直接将提权exp注入到新进程空间中,再执行就可以了。这需要我们理解内核提权exp,编写shellcode启动新进程并将提权代码注入到其中,并让其启动。
0x03 总结
微软加入的浏览器沙箱技术,给攻击者制造了两个障碍:
-
攻击者需要权限提升的漏洞exp(沙箱本身或者操作系统内核漏洞)。
-
攻击者需要自己编写shellcode。
这两座大山,对攻击者能力提出了很高的要求,无疑大大增加了攻击者利用成功的难度。近几年,微软和adobe都对自家的产品加入了众多的漏洞利用缓解机制,诸如CFG和隔离堆等,这些防护机制直接让一部分0day作废,变为无法利用的bug。并且,微软最近还在测试对IE的函数调用进行过滤,阻止调用一切无关的API调用,这让想要突破沙箱又变得十分困难!
综上,全补丁的win10+edge浏览器,可谓是当前非常安全组合。虽然每年的黑客比赛中还是有被攻破的消息,但是价值几百万美刀的漏洞利用会随便用在你我普通百姓身上?更多的是技术上和国家安全层面上的形态了。
最后,希望这篇文章提出的解决思路可以帮助到有这需求的安全工作者。
by:会飞的猫