前言
提由于想找个样本 研究一下,网上搜索了一番并没有现成的样本,于是打算自己尝试构造一个试试
环境
windows 10
构造过程
先用这个方法构造一个正常的样本
根据已知的漏洞函数我们对其进行分析触发流程
函数首先读取2字节类型,并检查是否已设置VT_ARRAY(0x2000)
然后
该函数检查类型是否为VT_UI4(0x0013),如果不是,则输入switch语句以处理所有其他类型。
漏洞本身在于如何处理类型为VT_VARIANT(0x000C)的PropertyVariant。VT_VARIANT类型通常与VT_VECTOR结合使用,这有效地导致了一系列PropertyVariant结构。换句话说,这就像具有一个数组,其中数组的成员可以是任何数据类型。
当PropertyVariant的类型设置为VT_VARIANT(0x000C)时,将检查完整类型字段以查看是否设置了VT_VECTOR
进入switch
然后
如果未设置VT_VECTOR,则会为24字节的缓冲区分配一个调用,CoTaskMemAlloc()并将该缓冲区传递给对的递归调用ReadPROPVARIANT(),以使该缓冲区将被紧随VT_VARIANT字段的属性填充。但是,缓冲区在传递给之前没有初始化(例如,用NULL字节填充)ReadPROPVARIANT()。
再次进入ReadPROPVARIANT()
然后重复之前ReadPROPVARIANT()的流程,再次进入switch
如果嵌套属性的类型为VT_CF(0x0047),则该属性旨在包含指向剪贴板数据的指针,ReadPROPVARIANT()对VT_VECTOR执行相同的检查,如果未设置,则尝试将流的后4个字节写入在先前分配的24字节缓冲区中由8字节值指向的位置
崩溃现场
这是POC的流程
如何将一个正常的search LNK做成poc
关键提到的两个关键位置
由于010Editord 的脚步对这种lnk的文件结构解析不正确,需要手动修正010Editord 的解析脚本
这里我用了另一个项目来解析
https://github.com/EricZimmerman/Lnk
之前我测试用了一种比较烦琐的方法,就是分析ReadPROPVARIANT()的实现
第一处关键跳转的流程使用__imp_IStream_Read读取出来的值是0x001f
可以搜索一下这个值
11处并不多,于是我逐个修改,下断点分析读取的值是否有变化
得出如下结果
第二处再次进入ReadPROPVARIANT()关键跳转的流程使用__imp_IStream_Read读取出来的值是0x0009
都是和下面switch要跳转到哪一步关键流程有关的,再结合之前文章的分析,所以大概能确定了结构的位置就在
我这里测试修改的是第四处的位置
后续
如果能构造处利用再过来补充吧
参考
CVE-2020-0729: REMOTE CODE EXECUTION THROUGH .LNK FILES
https://www.thezdi.com/blog/2020/3/25/cve-2020-0729-remote-code-execution-through-lnk-filesCVE-2020-0729:Windows LNK远程代码执行漏洞分析(一)
https://bbs.pediy.com/thread-262082.htmCVE-2020-0729:Windows LNK远程代码执行漏洞分析(二)
https://bbs.pediy.com/thread-262332.htm#msg_header_h3_0HAVOC Day1: The Legend of Shortcuts: A LNK to the Past (Searches)
https://www.youtube.com/watch?v=fmZNEVyyOx0