Impacket goldenPac.py
MS14-068 の検証用に改変した PAC を含むチケットを作ります。得た権限で SMB 経由の実行やチケット保存を行えます。
| 項目 | 内容 |
|---|---|
| 実装 | examples/goldenPac.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 1136 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/goldenPac.py -h で確認できます。
| 引数 | 説明 |
|---|---|
target | [[domain/]username[:password]@] |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
command | command (or arguments if -c is used) to execute at the target (w/o path). Defaults to cmd.exe. ‘None’ will not execute PSEXEC (handy if you just want to save the ticket) |
-c | uploads the filename for later execution, arguments are passed in the command option |
-w | writes the golden ticket in CCache format into the |
-dc-ip | IP Address of the domain controller (needed to get the users SID). If omitted it will use the domain part (FQDN) specified in the target parameter |
-target-ip | IP Address of the target host you want to attack. If omitted it will use the targetName parameter |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
詳細な処理フロー
Section titled “詳細な処理フロー”domain/DC/user SID を RPC と LDAP/Kerberos 情報から集め、TGT/PAC を構築・署名して KDC exchange を行います。得られた service ticket を使い、選択により ccache 保存または PSEXEC 系の service install、named pipe I/O、対話 shell へ進みます。終了時は service と pipe を片付けます。
仕組みの詳細
Section titled “仕組みの詳細”このコマンドは MS14-068 の脆弱な PAC 検証経路を再現するため、通常の Kerberos client より低い層で ticket と PAC を組み立てます。最初に SAMR/LSA 等から user SID、domain SID、DC/forest 情報を取得し、正規 account の credential で KDC との初期 exchange を成立させます。
脆弱性検証の中心は、権限 group 情報を含む PAC を構築し、KDC が受け入れる request/署名配置へ組み込む部分です。取得した ticket と session key は ccache に保存するか、SMB service ticket の取得へ進みます。後者では同一 ファイルにある PSEXEC 実装へ credential を渡し、service installation と named-pipe shell を開始します。
ticket 生成と remote execution は異なる責務ですが、この例では一つの end-to-end flow として同居しています。修正時は PAC/NDR offset、Kerberos key usage、SMB service cleanup を別々に検証します。patch 済み KDC の拒否を network/authentication failure と混同せず、脆弱性が成立しないことも正常な 検証結果として扱います。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
RemComMessage | 69 | 構造体/定数定義 |
RemComResponse | 79 | 構造体/定数定義 |
PSEXEC | 91 | __init__()、run()、openPipe() |
Pipes | 220 | __init__()、connectPipe() |
RemoteStdOutPipe | 253 | __init__()、run() |
RemoteStdErrPipe | 280 | __init__()、run() |
RemoteShell | 298 | __init__()、connect_transferClient()、do_help()、do_shell()、do_get()、do_put()、do_lcd()、emptyline()、default()、send_data() |
RemoteStdInPipe | 407 | __init__()、run() |
MS14_068 | 417 | __init__()、getGoldenPAC()、getKerberosTGS()、getForestSid()、getDomainControllers()、getUserSID()、exploit() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket.dcerpc.v5 | epm, samr, transport |
impacket.dcerpc.v5.drsuapi | DRSBind, DRS_EXTENSIONS_INT, DRS_EXT_GETCHGREPLY_V6, DRS_EXT_GETCHGREQ_V6, DRS_EXT_GETCHGREQ_V8, DRS_EXT_STRONG_ENCRYPTION, MSRPC_UUID_DRSUAPI, NTDSAPI_CLIENT_GUID, NULLGUID, hDRSDomainControllerInfo |
impacket.dcerpc.v5.dtypes | MAXIMUM_ALLOWED, RPC_SID |
impacket.dcerpc.v5.lsad | POLICY_INFORMATION_CLASS, hLsarOpenPolicy2, hLsarQueryInformationPolicy2 |
impacket.dcerpc.v5.lsat | MSRPC_UUID_LSAT, POLICY_LOOKUP_NAMES |
impacket.dcerpc.v5.nrpc | MSRPC_UUID_NRPC, hDsrGetDcNameEx |
impacket.dcerpc.v5.rpcrt | RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, TypeSerialization1 |
impacket.krb5.pac | KERB_SID_AND_ATTRIBUTES, KERB_VALIDATION_INFO, PACTYPE, PAC_CLIENT_INFO, PAC_CLIENT_INFO_TYPE, PAC_INFO_BUFFER, PAC_LOGON_INFO, PAC_PRIVSVR_CHECKSUM, PAC_SERVER_CHECKSUM, PAC_SIGNATURE_DATA, PKERB_VALIDATION_INFO |
impacket.examples | logger, remcomsvc, serviceinstall |
impacket.examples.utils | parse_target |
impacket.smbconnection | SMBConnection, smb |
impacket.structure | Structure |
impacket | version |
impacket.krb5.types | KerberosTime, Principal, Ticket |
impacket.krb5 | constants |
impacket.krb5.kerberosv5 | KerberosError, getKerberosTGS, getKerberosTGT, sendReceive |
impacket.krb5.asn1 | AD_IF_RELEVANT, AP_REQ, AS_REP, Authenticator, AuthorizationData, ETYPE_INFO2_ENTRY, EncASRepPart, EncTGSRepPart, KERB_PA_PAC_REQUEST, TGS_REP, TGS_REQ, seq_set, seq_set_iter |
impacket.krb5.crypto | Key |
impacket.dcerpc.v5.ndr | NDRULONG |
impacket.dcerpc.v5.samr | GROUP_MEMBERSHIP, NULL, SE_GROUP_ENABLED, SE_GROUP_ENABLED_BY_DEFAULT, SE_GROUP_MANDATORY, USER_DONT_EXPIRE_PASSWORD, USER_NORMAL_ACCOUNT |
impacket.krb5.ccache | CCache |
impacket.ntlm | compute_lmhash, compute_nthash |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
Cryptodome | pycryptodomex | 直接 import、宣言済み |
pyasn1 | pyasn1 | 直接 import、宣言済み |
six | six | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- オプションによりローカルファイルを作成または更新します。既存ファイルの扱いと秘密情報を含む出力の権限を確認してください。
- remote service、task、file、share、WMI/RPC resource などの一時資源を利用する経路があります。異常終了時の回収も動作契約です。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
- 明示的な cleanup 名がなくても
finally相当の経路と protocol handle の close/delete を確認します。
実装を変更するとき
Section titled “実装を変更するとき”krb5.*、PAC/NDR、SAMR/LSA/RPC、SMB、examples.remcomsvc / serviceinstall に依存します。MS14_068 が ticket 処理、同ファイル内 PSEXEC 群が実行経路を所有します。
- 構文:
python -m py_compile examples/goldenPac.py - CLI:
python examples/goldenPac.py -h - 関連テスト:
tests/SMB_RPC/test_ndr.py - 関連テスト:
tests/SMB_RPC/test_ntlm.py - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/dcerpc/test_drsuapi.py - 関連テスト:
tests/dcerpc/test_lsad.py - 関連テスト:
tests/dcerpc/test_lsat.py

