Friday, January 8, 2016

CVE-2015-1769 分析

CVE-2015-1769分析


CVE-2015-1769是一个发生在Mount Manager里的一个Symbolic Link Attack逻辑漏洞。MountMgr.sys的版本号是6.3.9600.16384。问题发生在MountMgr.sys这个驱动程序里,它包含了Mount Manager的实现代码。Mount Manager负责给插入的USB设备分配的挂载点,并分配挂载点的符号链接(盘符路径)。在MountMgr.sys驱动程序初始化的阶段,它注册了一个回调函数MountMgr!MountMgrMountedDeviceNotification,在U盘插入时,系统会通过PnP Manager调用到这个函数。接下来会调用到MountMgr!MountMgrMountedDeviceArrival函数,如果不出意外的话,正常情况下可以走到MountMgr!RegisterForTargetDeviceNotification函数,这里面又重新注册了一个函数MountMgr!MountMgrTargetDeviceNotification。这个函数处理了三种情况: GUID_TARGET_DEVICE_REMOVE_COMPLETEGUID_IO_VOLUME_MOUNTGUID_IO_VOLUME_UNIQUE_ID_CHANGE。其中后两个事件都可以触发该漏洞,GUID_IO_VOLUME_MOUNT应该是比较直观的一个,直接处理挂载磁盘的任务,这里需要通过一个检验Context+0x38 != 0x00,之后会进入MountMgr!ReconcileThisDatabaseWithMaster函数,然后还要通过一个检验,Context+0x37 = 0x00,之后注册MountMgr!ReconcileThisDatabaseWithMasterWorker函数处理磁盘挂载任务。在这个函数里面,通过了一些无关紧要的检查之后就会调到最终的关键函数MountMgr!OpenRemoteDatabase。里面通过ZwCreateFile函数直接打开了” \\System Volume Information\\MountPointManagerRemoteDatabase”,当这个文件是一个指向文件的符号链接时,就会以System权限打开的目标文件,并暴露出指向该文件的一个Handle

在实际调试过程中发现,其实并不是所有的USB设备都可以触发漏洞的,可能和U盘的控制器有关系。用我手边的设备试下来就只有两个USB3.0的移动硬盘,还有ADATA S102 Pro 32GB,是成功的。关键的判断逻辑是在MountMgr!MountMgrTargetDeviceNotification函数里,有一个检查Context+0x38=0x00,通过了才能进一步触发有漏洞的逻辑。

既然是个Symbolic Link的漏洞,那一般像CreateFile或者OpenFile的这类的函数都有可能存在漏洞。不过,看了下MS-15-085补丁,MountMgr里面该补的确实是都补掉了。在MountMgr!OpenRemoteDatabase函数里,原本的ZwCreateFile被换成了更底层的IoCreateFile,通过设置IO_STOP_ON_SYMLINK参数检测是不是有Symbolic Link漏洞。

总体来说,CVE-2015-1769是个挺有意思的漏洞,验证方式也非常简单。在任何没有打MS-15-085补丁的机器上,只要把U盘里面System Volume Information目录下的MountPointManagerRemoteDatabase文件变成符号链接,插入电脑,就可以在System权限的目录下创建一个文件。创建符号链接需要有管理员权限,放符号链接的磁盘需要时NTFS格式。可以使用mklink命令或者CreateSymbolicLink函数创建符号链接。


P.S. MountMgr! OpenRemoteDatabase里,有这样一个jnz
若成功跳转,可以执行到一个叫MountMgr!MigrateRemoteDatabase的函数,然后会注册一个MountMgr!MigrateRemoteDatabaseWorker的函数。这个函数会把”\\:$MountMgrRemoteDatabase拷贝到” \\System Volume Information\\MountPointManagerRemoteDatabase”。前面那个是Reparse Point目录,利用方面还不是十分明朗,还要继续学习一下。

UPDATE : 后来发现那个”\\:$MountMgrRemoteDatabaseNTFS里的一个叫stream的东西,是保存在NTFS磁盘上的数据。这样的话就可以利用它和MountPointManagerRemoteDatabaseSymbolic Link组合实现任意目录写文件的攻击。对”\\:$MountMgrRemoteDatabase的设置就和正常文件的读写类似,先CreateFile然后再WriteFile
       MountMgr! OpenRemoteDatabase的逻辑最后,完成了文件内容的拷贝之后,函数会对”\\:$MountMgrRemoteDatabase调用ZwSetInformationFile函数,将stream清空。所以,恶意的U盘每次使用前都需要重新写一遍”\\:$MountMgrRemoteDatabase才能继续使用。

No comments:

Post a Comment