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
脆弱性分析エクスプロイトシェルコードメールセキュリティバイナリエクスプロイト
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)で発生します。

TLDR;

ex_screen

この脆弱性を使用してASLRを回避することはできませんでしたが、起動時に固定されるシステムライブラリのアドレスを使用して、Outlook 2019 32bit版で電卓を起動するエクスプロイトを作成しました。 また、この脆弱性はゼロクリック脆弱性です。"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減算することで整数のアンダーフローが発生します。

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

ヒープスプレーとヒープフェンシュイを実行した後、上記のバグを使用して無限ループに陥っていなかった別のスレッドで実行中のオブジェクトのvftableを上書きすることで、EIPハイジャックに成功しました。

ツールをダウンロード