MS10-046_LNK文件快捷方式漏洞的原理分析(多图杀猫)

来源:互联网 发布:淘宝网穿越火线枪 编辑:程序博客网 时间:2024/04/29 11:39

    文件快捷方式漏洞MS10-046是除了n年前的动画光标(.ani)漏洞之外另一个让我觉得比较有趣的漏洞,毕竟是本机执行任意代码的权限,当然,n年前我还只是一个菜鸟,神马都不懂.

 

    入正题吧,欢迎拍砖,大家一起进步.(后面我会把一些参考文章贴出来的)

 

    由于MS10-046的漏洞是在shell32.dll当中,windows出于美化的目的,会现实快捷方式的图标,这个图标可能是程序本身自带的ico,也可能是系统默认的那些图标,对于一个快捷方式,系统会对它进行解析从而获取他要显示的那个图标,但是在解析的时候没有做好参数验证工作,我觉得在设计上也是有一定缺陷的,后面会详细说.

 

    首先必须解决的问题是调试,怎么去调系统的解析操作,当然是用windbg啦,ring0还是比较劲的,但是默认的情况下,windbg是不会加载ring3的符号的,怎么解决这个问题,让windbg能够调试应用层的程序,步骤如下:

1.!process 0 0 explorer.exe     //主要是获取explorer.exe的_EPROCESS地址,上下文切过去

2..process /p _EPROCESS地址  //这是点命令,切到指定的进程上下文去

3..reload /user [/f] [dll名称]      //也是点命令,用于加载应用层的符号,如.reload /user shell32.dll

    之后就可以使用bp下断了,如bp shell32!_LoadCPLModule

 

    解决了调试问题之后,我们来研究一下这个恶意构造的lnk文件是如何构造出来的.

    操作系统能够让我们自己对控制面板里面的程序进行扩展,如图

    快捷方式跟控制面板的这些程序还是有点关系的.这些程序被称为Control panel applets,他们的实质就是一个后缀名为.cpl的文件,如图,VMware Tools对应的.cpl

    虽然后缀名是.cpl,但是实质上他是一个dll,至于怎么判断出来的,我们都知道,dll和exe都是PE文件格式,具有相似性,并且,exe文件也是可以具有导出目录的,那么如何在PE格式的这个角度判断一个文件是exe还是dll,这个下午也花了点时间去找资料,在<An In-Depth Look into the Win32 Portable Executable File Format>这篇文章中提到:"The distinction between EXE and DLL files is entirely one of semantics. They both use the exact same PE format. The only difference is a single bit that indicates if the file should be treated as an EXE or as a DLL. Even the DLL file extension is artificial. You can have DLLs with entirely different extensions—for instance .OCX controls and Control Panel applets (.CPL files) are DLLs.",区分dll和exe就靠一个bit,然后很坑爹的至于哪个bit他又不说,没找到资料,自己对着FFI看,最后找到了,就在PE头部的characteristics成员当中,同时文章也说了cpl是一个dll.有图有真相:

 

     dll是可以包含自己的图标资源的,在控制面板里面现实出来的就是封装在dll里面的图标资源.好吧,回顾一下:1.我们现在知道了,系统他会解析快捷方式看看需要加载神马图标资源;2.作为一个cpl,实质上就是一个dll,他本身可以包含图标资源.我创建一个cpl文件的快捷方式,如上面的VMware Tools的快捷方式,我看到的图标是

    现在可以很自然的联系起来,MS10-046能够执行任意代码,同时跟lnk文件有关,可能性在哪里?一种合理的思路:在系统解析lnk加载图标的时候,如果是存在于程序当中如dll当中的图标,系统会把这个dll加载进入内存,之后再获取相关的图标资源,显示出来,并且,系统在加载这样的一个dll时候并没有做过多的安全性判断,从而导致了MS10-046的漏洞(这样描述只是为了方便理解).

    为了更好的理解这个漏洞,我找了跟快捷方式文件格式相关的一些文章,花了很久的时间.结果发现,这是一个很蛋疼的行为,微软对于lnk文件的内部细节并非公开的很彻底,这里我们针对cpl的快捷方式来说,如图:

    在[MS-SHLLINK]Shell Link(.LNK) Binary File Format当中,有爱的同学自己研究吧,paper我待会传上来,前面的格式都是对的上的,没有问题,但是从偏移0x4C开始,按照微软的说法,这个是Shell item ID list段,00 F4是表示这个段的长度,计算一下可以知道,段的结束是到0x140之前,也就是说,创建的cpl快捷方式只有一个段,而对于这个段里面的内容却没有详细的说明,稍微说一下,图中总共有3个ItemID的结构(不包括最后的空结构),前两个ItemID的结构是"我的电脑"和"控制面板"的CLSID值,但是第3个结构,完全没有头绪的,路径这个我们容易猜测,但是这个结构里面还有一个DWORD的值与lnk构造的成功与否是有比较大的关系的.微软还是比较坑爹的.过程中我也找到同样认为微软这样做很坑爹的两篇文章,对lnk的文件结构进行了比较深刻的分析,有爱的同学请猛击http://blog.0x01000000.org/ LNK Parsing的那两篇就是了.

    看看修改后的而已LNK文件是什么样的,如图:

    图上我们可以看到,我们的而已dll是C:/FuckLNK.dll,这些是Unicode字符,注意另外圈起来的94 FF FF FF这个DWORD,记得之前我们说过的一个有重大影响的DWORD就是这个同学了,需要将它改为00 00 00 00才能顺利触发漏洞,至于为什么是这个地方的这个值,难道特么是一个个试出来的?当然不是,通过调试加上一点点运气是能够发现的,当然也要足够的细心,后面会提到的.

    这样成功构造了一个LNK文件,测试一下,是成功的,我的环境是WindowsXP+SP2,没打补丁(废话..)

    现在看一看这个漏洞的一个数据流和控制流的流向图,感谢外国友人的友情提供T_Thttp://community.websense.com/blogs/securitylabs/archive/2010/07/20/microsoft-lnk-vulnerability-brief-technical-analysis-cve-2010-2568.aspx,

    图很清晰,_LoadCPLModule直接调用的LoadLibraryW的,我们先对它下断点,然后通过栈回溯进行观察,如果要观察到如刚才说的怎么知道那个关键的DWORD值还要再往上一层才能看到.

    成功在_LoadCPLModule()断下来之后,找LoadLibraryW(),LoadLibraryW()参数只有一个字符串,通过db查看.图上很清晰,我就不啰嗦了.执行到这里,利用kn进行栈回溯,如图

    可以看到,在_LoadCPLModule之前的函数调用过程,一个个的下断点回溯上去,利用能出发漏洞和没有修改94 FF FF FF DWORD值的LNK分别进行测试(没错,这是一个体力活),当然也有结合静态分析,最终找到判断DWORD值的地方,是CEtrlExtIconBase::_GetIconLocationW()这个函数里面,如图:

    可以看到这里的汇编语句是cmp ecx,edx,ecx的值是0xffffff94(注意高高低低原则,94 FF FF FF读为DWORD的值),然后edx的值是0(xor edx, edx),最终如果两者不想等的话是跳到0x775224e3的地址继续执行,而往下0x775224d0调用了CPL_FindCPLInfo(),就是说,如果那个DWORD不为0的话,系统就不会执行CPL_FindCPLInfo(),按照上面的控制流图,只有调用了CPL_FindCPLInfo才有机会调用LoadLibraryW(),最终执行代码.

    这个DWORD值应该是描述图标资源在cpl文件当中的一个状态,我测试了几个控制面板程序的快捷方式,发现防火墙的快捷方式的DWORD一开始就是00 00 00 00,查看cpl文件之后发现,防火墙的cpl文件自身是不带有图表资源的,需要从其他地方引入图表,这个也从一定侧面说明了这个DWORD的作用.

    这样回到我们一开始说的那个思路,应该要调整为:如果DWORD为0,那么我清楚需要引用外部图标,需要加载dll,而对于非零值则可以通过另外的方式来获取到图标资源,具体可以参考老外提供的流程图.

 

-----------------------------------------------------------------------------------------------------------------------------------

参考资料:

1.http://blog.csdn.net/flyingstarwb/archive/2009/05/16/4191762.aspx

2.http://www.exploit-db.com/exploits/16574/

3.http://www.docin.com/p-218001483.html

4.http://f4u5t.blog.163.com/blog/static/9339722120107944447390/

5.http://community.websense.com/blogs/securitylabs/archive/2010/07/20/microsoft-lnk-vulnerability-brief-technical-analysis-cve-2010-2568.aspx

6.http://xcf007.blog.51cto.com/471707/367275

7.http://www.exploit-db.com/exploits/14403/

8.http://blog.0x01000000.org/

9.http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

10.[MS-SHLLINK]Shell Link(.LNK) Binary File Format: 下载地址,一个资源分哈 http://download.csdn.net/source/3352709

 

原创粉丝点击