CVE-2021-1647

前言

这个漏洞是微软在一月份修复的一个Windows Defender RCE, 根据描述来看是Windows Defender在扫描文件的时候导致的漏洞利用, 配合各种自动下载 ( 比如微信 ) 伤害应该很大, 据说已经出现在野利用, 网上有人发了漏洞的poc, 不其实已经算exp了, 只不过执行的是cmd, 简单看了一波poc, 没找到什么平时玩别人exp看到的shellcode之类的, 所以借着这个漏洞研究一波, 顺带学习一下windbg, 做个踩坑记录.

patch

根据腾讯的分析文章来看, 漏洞出现在mpengine.dllCAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects函数

即这里malloc的堆内存不够大导致后续的循环中出现了越界写

而新版本的mpengine.dll中对参数进行了检查, 咱也看不懂就贴一张腾讯的图吧

windbg笔记

按照知乎的一篇文章配置了一下串口调试Windows内核

windbg连接上被调试的虚拟机后, 按如下过程操作:

  1. !process 0 0 MsMpEng.exe 获取目标进程EPROCESS信息, 至于这个exe是我在放入exp导致Windows defender服务崩溃的时候, 发现会导致这个进程崩溃, 所以猜测应该是这个进程
  2. .process /p EPROCESS 切换到目标进程空间
  3. .reload /f /user 重新加载用户态符号, 从微软的服务器下载, 这一步需要在环境变量中设置_NT_SYMBOL_PROXY = 127.0.0.1:8080 后面懂的都懂
  4. .process /i /p EPROCESS 侵入式调试
  5. bp mpengine!CAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects 下断点

断下来以后, 可以看到函数入口地址00007ffd cebd0778

在ida中看到入口地址是0x75A290778, malloc的地址是0x75A290A57, 相对偏移0x2df

所以在windbg里的地址是00007ffd cebd0a57

shellcode修改

根据dalao的分析文来看, poc里的0x40a210函数中, 把shellcode复制进了目标内存后执行的, 所以我们的目标是如何把cmd的shellcode改成我们自己的

qmemcpy(v7, (const void *)a1, sizeof(v7));
v11 = v8;
qmemcpy(v9, (const void *)a4, sizeof(v9));
qmemcpy(v8, (const void *)a3, sizeof(v8));

可以看到是用memcpy复制的shellcode, shellcode是在栈里保存的参数(32位), 且大小分别为80, 716, 80

Reference