0x00 简介
之前在使用WSL的时候就发现,其可以创建一些Windows无法接受的文件名或者目录名,这种差异造成了很多有意思的结果,比如当你是用WSL创建一个名为"..."的目录时,这个目录以及其祖上所有目录都无法在Windows explorer中删除掉,尝试删除时还会引起Explorer崩溃。当然这些并不算是安全危害,所以我也一直没上心(当你创建了这个目录后,部分杀软无法指定该目录进行扫描)。
直到看到三好学生的文章:通过模拟可信目录绕过UAC的利用分析。
不得不佩服此姿势的原作者脑洞,该方法已经被加入UACME豪华套餐。
这里我们用WSL可以实现一模一样的效果(0day)。算是对这种姿势的横向扩展,根据UACME上的信息显示(第52个),该方法还没有fix。
0x01 步骤
首先我们需要创建一个Windows无法识别的目录。
常见的限制为不允许创建含有/\:*?"<>|
的文件名,经过测试当文件名前后含有空格时,会将空格去掉。
lz1y@DESKTOP-SGME5M7:/mnt/c$ mkdir '\"\\:*?<>|Windows'
lz1y@DESKTOP-SGME5M7:/mnt/c$ cd '\"\\:*?<>|Windows/'
lz1y@DESKTOP-SGME5M7:/mnt/c/\"\\:*?<>|Windows$ ls
lz1y@DESKTOP-SGME5M7:/mnt/c/\"\\:*?<>|Windows$ mkdir system32
lz1y@DESKTOP-SGME5M7:/mnt/c/\"\\:*?<>|Windows$ cp ../Windows/System32/WinSAT.exe system32/
lz1y@DESKTOP-SGME5M7:/mnt/c/\"\\:*?<>|Windows$ cp /mnt/c/Users/11632//Desktop/Dll1.dll system32/
这里我们先测试一下使用了非法字符的目录路径能否被系统判断为可信目录。
会发现弹出来了UAC
尝试使用...
:
权限也不够。
所以这里我没有办法使用这些字符欺骗,所以还是使用老办法,在文件名末尾添加空格。
这里为了便于区分我使用的小写的windows
,可以通过属性看到,我们成功创建了不被允许的目录名,然后点击进去试试。
可以看到Windows已经成功的被我们创建的目录欺骗了,打开了Windows
目录,这样我们就可以伪造包括System32
在内的可信目录,可以在其中任意写文件。至于使用的主程序,在这里我直接使用三好师傅之前用过的WinSAT.exe
,这种可执行文件选择非常多,只要有Auto-Elevate
属性就行。
lz1y@DESKTOP-SGME5M7:/mnt/c$ mkdir "windows "
lz1y@DESKTOP-SGME5M7:/mnt/c$ cd windows\ /
lz1y@DESKTOP-SGME5M7:/mnt/c/windows $ mkdir system32
lz1y@DESKTOP-SGME5M7:/mnt/c/windows $ cd system32/
lz1y@DESKTOP-SGME5M7:/mnt/c/windows /system32$ cp /mnt/c/windows/System32/WinSAT.exe .
lz1y@DESKTOP-SGME5M7:/mnt/c/windows /system32$ ls
WinSAT.exe
首先把要利用的程序复制到我们的路径下,运行Procmon,打开程序,看其有哪些DLL是未使用绝对路径,可以被我们控制的。在这里由于系统已经把我们创建的目录当做成了Windows
目录,无法通过Explorer进入目录,所以我们需要使用cmd来指定程序路径。
经过过滤,我们可以找到存在以下dll是可以被我们劫持的。
然后我们就需要实现DLL劫持代码了,一般的DLL劫持,较为简单暴力的做法就是直接在DLLMAIN中插入恶意代码,然后当DLL被加载时,就会自动执行此方法。但是此处不行,使用MSF以及我自己写的DLL在加载时都会报错甚至直接被无视。后来才认识到,应该是WinSAT.exe
并不是直接使用LoadLibrary
加载动态链接库的,而是先检查了导出表函数符号,由于我们写的DLL并没有主程序所需求的导出函数,此时就会导致异常,从而无法直接走到DLLMAIN方法中。
这里如果是使用LoadLibrary
的话,可以使用SuperDllHijack这个项目。从而不需要手动的添加导出表,也能不使源程序异常,达到类似于捆绑的效果。
但是这里我们无法使用这种办法,直接上手动添加导出表吧,这里我使用的也是三好师傅推荐的工具ExportsToC++
,具体使用还是看师傅的博客吧。
Study-Notes-Weekly-No.1(Monitor-WMI_ExportsToC++_Use-DiskCleanup-bypass-UAC)
这里我直接生成好了执行cmd的DLL。
至此我们就Bypass UAC了,虽然WSL在实战中遇到的并不多,并且给目标安装WSL不大现实,但是当WSL2到来的时候,有没有可能内置就有WSL呢?或者能否直接利用WSL的驱动?
本文只算是为了复现漏洞顺便加上一点自己的理解所记录的笔记吧。