Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2020-1349 — 针对Outlook 2019零点击漏洞CVE-2020-1349的利用,利用MIME头解析缺陷实现堆溢出,并通过vftable覆盖实现EIP控制。 | Kitploit
工具/GitHubGitHub/0neb1n/cve-2020-1349
漏洞分析漏洞利用Shellcode电子邮件安全二进制利用
GitHub0neb1n/cve-2020-1349

CVE-2020-1349

针对Outlook 2019零点击漏洞CVE-2020-1349的利用,利用MIME头解析缺陷实现堆溢出,并通过vftable覆盖实现EIP控制。

查看仓库
114516年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2020-1349

该漏洞存在于安装于韩文 Windows 10 1909 x64(代码页 949)上的 Outlook 2019(16.0.12624.20424)中。

概览

ex_screen

我尚未能利用此漏洞绕过 ASLR,但我编写了一个 Outlook 2019 32 位漏洞利用程序,通过使用启动时固定的系统库地址弹出一个计算器。
此外,该漏洞为零点击漏洞。如果除“outlook.com”账户以外的邮件服务账户通过 IMAP 与 Outlook 2019 关联,则仅通过接收邮件即可触发。

第一个漏洞

root@kitploit:~
                v26 = IsDBCSLeadByte(*v13);
                v12 = 0;
                if ( v26 )
                {
                  LODWORD(v5) = v5 - 1;
                  *v11++ = *v13++;
                  --v8;
                }
                LODWORD(v5) = v5 - 1;
                *v11++ = *v13++;
                --v8;
                goto LABEL_51;

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

崩溃发生,存在漏洞的部分如上所示。当解析的 To 头或 From 头字符串为多字节时,用于计数剩余待解析字符串的变量会减少 2,而当该变量为 1 时减少 2 会导致整数下溢。

第二个漏洞

root@kitploit:~
          if ( v23 != '=' )
          {
            if ( v23 == 34 )
              v15 = 6;
            goto LABEL_48;
          }
          v15 = 1;
        }
        if ( v15 )
          goto LABEL_40;

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
LABEL_40:
                v24 = v13[v14];
                if ( v24 )
                {
                  if ( v5 == v14 )
                    goto LABEL_52;
                  if ( v8 != v14 )
                  {
                    v25 = IsDBCSLeadByte(v24);
                    v12 = 0;
                    if ( v25 )
                      ++v14;
                    ++v14;
                  }
                }
                goto LABEL_51;
              }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
LABEL_51:
        if ( v5 <= v14 )
          goto EXIT_0;
      }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
if ( v15 )
        {
          if ( v15 == 1 )
          {
            v15 = 2;
            v21 = v13[v14];
            v22 = v14 + 1;
            if ( v21 != '?' )
              v22 = v14;
            if ( v21 != '?' )
              v15 = v12;
            v14 = v22;
          }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
else if ( v15 > 1 )
          {
            if ( v15 <= 3 )
            {
              v18 = v13[v14];
              v19 = v14 + 1;
              if ( v18 != '?' )
                v19 = v14;
              v14 = v19;
              v20 = v15 + 1;
              if ( v18 != '?' )
                v20 = v15;
              v15 = v20;
            }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
if ( v15 == 4 )
              {
                if ( v13[v14] == '?' )
                  v15 = 5;
LABEL_40:
                v24 = v13[v14];
                if ( v24 )
                {
                  if ( v5 == v14 )
                    goto LABEL_52;
                  if ( v8 != v14 )
                  {
                    v25 = IsDBCSLeadByte(v24);
                    v12 = 0;
                    if ( v25 )
                      ++v14;
                    ++v14;
                  }
                }
                goto LABEL_51;
              }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
if ( v15 == 5 )
              {
                v16 = v14;
                v17 = v14 + 1;
                v30 = v13[v16];
                if ( v30 == '=' )
                {
                  *v11++ = 34;
                  --v8;
                }
                memcpy(v11, v13, v17);
                v13 += v17;
                v11 += v17;
                LODWORD(v5) = v5 - v17;
                v8 -= v17;
                if ( v30 == '=' )
                {
                  *v11++ = 34;
                  --v8;
                }
                v12 = 0;
                v14 = 0;
                v15 = 0;
                goto LABEL_51;
              }

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
else
        {
          v23 = v13[v14];
          if ( v23 != '=' )
          {
            if ( v23 == '"' )
              v15 = 6;
            goto LABEL_48;
          }
          v15 = 1;
        }
        if ( v15 )
          goto LABEL_40;

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

root@kitploit:~
LABEL_48:
                v26 = IsDBCSLeadByte(*v13);
                v12 = 0;
                if ( v26 )
                {
                  LODWORD(v5) = v5 - 1;
                  *v11++ = *v13++;
                  --v8;
                }
                LODWORD(v5) = v5 - 1;
                *v11++ = *v13++;
                --v8;
                goto LABEL_51;

[OUTLMIME!CloseAllSockets+0x50804 伪代码]

然而,利用上述漏洞触发堆溢出时,我无法满足再次跳出循环的条件,因此无法按需进行部分覆盖。因此,我不得不寻找满足特定条件而能跳出循环的输入。出于同样的原因,我严格审查了周围的代码部分,虽然没有找到能跳出循环的输入值,但发现了一个在处理特殊字符串时因索引未增加或未写入而导致陷入无限循环的漏洞。

EIP控制

ex_screen

在执行堆喷洒和堆 Feng Shui 后,通过利用上述漏洞覆盖了另一个线程中未被无限循环捕获的运行对象的虚函数表,成功实现了 EIP 劫持。

下载工具