Windows Media Center .MCL文件代码执行漏洞(MS16-059)
blast · 2016/06/21 13:18
0x00 簡(jiǎn)介
漏洞作者EduardoBraun Prado在今年早期發(fā)現(xiàn)了WMP的.MCL文件又存在一個(gè)可以導(dǎo)致遠(yuǎn)程代碼執(zhí)行的漏洞。為什么要說(shuō)又呢,因?yàn)檫@個(gè)東西實(shí)在是“不爭(zhēng)氣”,同一個(gè)地方出現(xiàn)了多次繞過導(dǎo)致遠(yuǎn)程代碼執(zhí)行的問題。
0x01 歷史A――MS15-100
2015年的MS15-100(CVE-2015-2509,Aaron Luo, Kenney Lu, and Ziv Chang of TrendMicro)漏洞便是MCL“噩夢(mèng)”的開始,研究者發(fā)現(xiàn)只要在MCL文件中指定:
<application run="c:\windows\system32\cmd.exe"></application> 復(fù)制代碼便可以讓W(xué)MP運(yùn)行cmd.exe,代碼層面看,由于MCL是一個(gè)XML文件,WMP加載時(shí)只是簡(jiǎn)單的解析了該XML,便直接運(yùn)行了“run”中指定的內(nèi)容。看起來(lái)相當(dāng)令人無(wú)語(yǔ)。
0x02 歷史B――MS15-134
緊隨著MS15-100中微軟將run的內(nèi)容做了過濾之后,MS15-134(CVE-2015-6127,Francisco Falcon of CoreSecurity)又誕生了。這回作者利用的倒不是run這個(gè)屬性,而是另一個(gè)url屬性。
通過application的url屬性指定一個(gè)文件后,WMP會(huì)在自己的WebBrowser中加載這個(gè)URL。但是研究者發(fā)現(xiàn),WMP的exe并不在Local Machine Lockdown的列表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\MAIN\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN)中,因此在WMP的WebBrowser中打開的本地頁(yè)面中的腳本將會(huì)自動(dòng)運(yùn)行。
但是總歸不能分發(fā)兩個(gè)文件到用戶電腦中吧,于是作者想到了更“優(yōu)雅”的方式:在application標(biāo)簽中加入腳本。因?yàn)閃MP的XMLParser把不認(rèn)識(shí)的APPLICATION的子元素全部忽略,如果攻擊者構(gòu)造攻擊文件a.mlc:
#!html <application url="a.mlc"><script>alert(1)</script> </application> 復(fù)制代碼注意url指向自身,這樣這個(gè)文件又會(huì)被當(dāng)作HTML文件加載,由于WebBrowser(IE)處理HTML的寬松的特性――不認(rèn)識(shí)的標(biāo)簽會(huì)被忽略,只去渲染認(rèn)識(shí)標(biāo)簽的含義。就導(dǎo)致WebBrowser中直接渲染并在file域下執(zhí)行了文件包含的腳本。接下來(lái)能干什么事情想必也不用細(xì)說(shuō)了。
0x03 主角――MS16-059
在微軟攔截的七七八八的時(shí)候,又有人發(fā)現(xiàn)了新玩法:
<application run="file:///\\127.0.0.1\c$\programdata\cpl.lnk"/> 復(fù)制代碼因?yàn)槲④泴?duì)UNC作出了攔截,攻擊者使用了file:///來(lái)繞過過濾。同時(shí),微軟也對(duì)傳遞的文件后綴進(jìn)行了攔截,因此作者又傳入了lnk(快捷方式)文件進(jìn)行了繞過。
作者在lnk中指定了調(diào)用一個(gè)CPL文件,CPL其實(shí)也是一個(gè)實(shí)現(xiàn)了特定接口的DLL文件,因此作者成功地繞過了MCL的攔截,執(zhí)行了任意代碼。
借助于UNC,作者仍然只需要傳入一個(gè)MCL文件給用戶即可,其他的所有惡意代碼完全依靠遠(yuǎn)程拉取。
0x04 MCL是如何被處理的?(原版?14年版本)
因?yàn)樘摂M機(jī)打補(bǔ)丁實(shí)在是太慢了,所以這里就直接用14年的DLL來(lái)演示了,看一個(gè)原始風(fēng)貌。
MCL文件如何處理?打開注冊(cè)表,查看MCL文件相關(guān)關(guān)聯(lián),可知是由ehshell.exe打開的:HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.mcl\OpenWithList\ehshell.exe。
觀察ehshell.exe的代碼可以發(fā)現(xiàn),ehshell.exe簡(jiǎn)單地加載了ehshell.dll,之后所有邏輯都是再ehshell.dll去做的。
從調(diào)用棧也可以得出這個(gè)結(jié)論(雙擊mcl文件之后的棧):
#!bash 0:025> bp kernel32!CreateFileW 0:025> g Breakpoint 0 hit kernel32!CreateFileW: 00000000`779b1b88 ff2522b90700 jmp qword ptr [kernel32!_imp_CreateFileW (00000000`77a2d4b0)] ds:00000000`77a2d4b0={KERNELBASE!CreateFileW (000007fe`fd944600)} 0:000> dqs esp 00000000`0021e108 00000000`779a0dad kernel32!CreateFileWImplementation+0x7d 00000000`0021e110 00000000`80000000 00000000`0021e118 00000000`00000000 00000000`0021e120 00000000`0000006c 00000000`0021e128 00000000`0039d2e0 00000000`0021e130 00000000`00000003 00000000`0021e138 00000000`00100000 00000000`0021e140 00000000`00000000 00000000`0021e148 00000000`00000000 00000000`0021e150 00000000`00440042 00000000`0021e158 00000000`03a7ed88 00000000`0021e160 00000000`00100000 00000000`0021e168 000007fe`f116bec7 mscorwks!DoNDirectCall__PatchGetThreadCall+0x7b 00000000`0021e170 00000000`00000000 00000000`0021e178 00000000`0021e1d0 00000000`0021e180 00000000`00000003 0:000> du 00000000`03a7ed88 00000000`03a7ed88 "C:\Users\BlastTS\Desktop\test.mc" 00000000`03a7edc8 "l" 復(fù)制代碼可以看到LaunchMediaCenter之后,ehshell基本就啥都不干了。
#!bash # Child-SP RetAddr : Args to Child : Call Site 00 00000000`0021e108 00000000`779a0dad : 00000000`80000000 00000000`00000000 00000000`0000006c 00000000`0039d2e0 : kernel32!CreateFileW 01 00000000`0021e110 000007fe`f116bec7 : 00000000`00000000 00000000`0021e1d0 00000000`00000003 000007fe`f0331830 : kernel32!CreateFileWImplementation+0x7d *** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v2.0.50727_64\mscorlib\c3beeeb6432f004b419859ea007087f1\mscorlib.ni.dll 02 00000000`0021e170 000007fe`f0207f71 : 000007fe`f0331830 000007fe`eff69210 00000000`03a7ee70 000007fe`f0287aea : mscorwks!DoNDirectCall__PatchGetThreadCall+0x7b 03 00000000`0021e230 000007fe`f0207e2e : 00000000`03a7edd8 00000000`03a7edd8 00000000`03a7ee00 000007fe`f0288e86 : mscorlib_ni+0x317f71 …………………………………………………… 17 00000000`0021f3b0 000007ff`00250222 : 00000000`02681eb0 00000000`02681f30 00000000`0021f4a0 00000000`0021f060 : 0x7ff`00252817 18 00000000`0021f5b0 000007fe`f116a21a : 40ca06f5`582e02ef bdb2bd08`2c45789a 00000000`00000000 00000000`00000000 : 0x7ff`00250222 19 00000000`0021f5e0 00000001`3f7e161b : 00000000`01e10020 00000000`003bcfa8 00000000`0021f6a0 00000000`00000000 : mscorwks!UMThunkStubAMD64+0x7a 1a 00000000`0021f670 00000001`3f7e153a : 00000000`00312462 00000000`00000000 00000000`003283c0 00000000`01e10020 : ehshell!LaunchMediaCenter+0x14e 1b 00000000`0021f6c0 00000001`3f7e148d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ehshell!wWinMain+0xc3 1c 00000000`0021f920 00000000`779a59ed : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ehshell!InitializeCOMSecurity+0x382 1d 00000000`0021f9e0 00000000`77adb371 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd 1e 00000000`0021fa10 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d 復(fù)制代碼由于MediaCenter以及ehshell.dll都是C# DLL,因此WinDbg看就顯得比較捉急了,我們將其反編譯,生成源代碼直接看:
工程十分龐大,在漫長(zhǎng)的生成過程后,搜索關(guān)鍵字可以看到這樣的邏輯:在加載MCL之后,首先程序解析.MCL文件(通過System.XML),并在InternalExtensibilityAppInfo中為包含有Run屬性的MCL創(chuàng)建一個(gè)特殊的“AppEntryPoint”。
#!csharp namespace MediaCenter.Extensibility { …… public ExtensibilityEntryPointInfo AddExternalAppEntryPoint(string strRun,string strTitle, string strDescription, string strCategory, object objContext,string strNowPlayingDirective) { IDictionarydictEntryPoint = CreateBaseEntryPointDict(Guid.NewGuid(), strTitle,strDescription, strCategory, objContext, strNowPlayingDirective); dictEntryPoint[Run] = strRun; return this.AddEntryPoint(dictEntryPoint); } 復(fù)制代碼在處理AppEntryPoint時(shí),程序啥校驗(yàn)都不做,直接Process.Start啟動(dòng)程序。當(dāng)然,這是最初的版本,因此沒有任何彈框或判斷。
#!csharp namespace MediaCenter.Extensibility { ………………internal classExtensibilityExternalAppEntryPointInfo : ExtensibilityEntryPointInfo{ ………………internal override LaunchResult Launch(ref object objState) { ……………… Process process = null; try { process = Process.Start(base._strRun); } catch (Exception exception) ……………… 復(fù)制代碼0x05 新版如何過濾?(16年6月補(bǔ)丁后版本)
簡(jiǎn)單粗暴,所有包含Run/Url的全部彈窗二次確認(rèn)。這也是微軟對(duì)前幾個(gè)嚴(yán)重問題所做的非常暴力的“折中”處理。
0x06 十年以上的漏洞
而有趣的是,這個(gè)漏洞看起來(lái)感覺有十年以上。MCL文件最初就是為了在WMP中執(zhí)行一個(gè)程序用的,這有點(diǎn)像HTA文件,在查找相關(guān)信息的時(shí)候,我發(fā)現(xiàn)了06年(肯定還有更早的)論壇帖子就有關(guān)于MCL如何啟動(dòng)程序的討論了。非常有意思的是,當(dāng)時(shí)的人們并不覺得這個(gè)功能是一個(gè)安全漏洞,而只是一個(gè)功能而已,但是到了2015年第一次被人報(bào)告開始,微軟就給了這個(gè)問題最高的安全評(píng)級(jí)――但是這個(gè)原本是正常的“功能設(shè)計(jì)”。可見安全的概念在十年間轉(zhuǎn)換了很多。
例如下面的代碼是曾經(jīng)一個(gè)帖子“如何在Xbox 360上運(yùn)行Zsnes”的解決代碼,和MS15-100的利用代碼一模一樣,發(fā)帖時(shí)間是2012年。
#!html <application name = "Zsnes" SharedViewport = "" NowPlayingDirective = "" run = "C:/Zsnes/Zsnes.exe"> <capabilitiesrequired directx="True" audio="False" video="False" intensiverendering="True" console="False" cdburning="False" /> </application> 復(fù)制代碼總結(jié)
以上是生活随笔為你收集整理的Windows Media Center .MCL文件代码执行漏洞(MS16-059)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞信2016 5.6.8820.0超级精
- 下一篇: python get post请求_使用