Impacket raiseChild.py
子ドメインからフォレストルートへの権限昇格経路を検証します。DRS で資格情報を取得し、SIDHistory を含むチケットを作ります。
| 項目 | 内容 |
|---|---|
| 実装 | examples/raiseChild.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 1306 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/raiseChild.py -h で確認できます。
| 引数 | 説明 |
|---|---|
target | domain/username[:password] |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
-w | writes the golden ticket in CCache format into the |
-target-exec | Target host you want to PSEXEC against once the main attack finished |
-targetRID | Target user RID you want to dump credentials. Administrator (500) by default. |
-hashes | NTLM hashes, format is LMHASH:NTHASH |
-no-pass | don’t ask for password (useful for -k) |
-k | Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command line |
-aesKey | AES key to use for Kerberos Authentication (128 or 256 bits) |
詳細な処理フロー
Section titled “詳細な処理フロー”child/parent domain、SID、DC を discovery し、NRPC/LSA/DRS で account と krbtgt key を取得します。PAC に parent enterprise admin RID 等を組み込んだ ticket を作成・署名し、root 側 service ticket を取得します。-target-exec 時は PSEXEC 経路へ渡します。
仕組みの詳細
Section titled “仕組みの詳細”forest 内の child domain と root domain は別の krbtgt key と domain SID を 持ちます。このコマンドは child 側の権限から root 側へ届く trust/replication 経路を調べ、必要な SID と key material を集めて、追加 SID を含む PAC/ticket を構築する end-to-end 実装です。
discovery 段階では NRPC で DC/domain 情報を得て、LSA で SID/name を解決します。
credential 取得段階では DRSUAPI の name crack と replication request を使い、
対象 account record から RC4/AES key を選びます。_get_preferred_aes_key()
などの fallback は KDC と account が使える enctype の差を吸収します。
ticket 段階では child identity の validation info に root domain の privileged SID を追加し、PAC checksum と ticket encrypted part を正しい key で署名します。 得た ticket は保存または root 側 host の service execution に渡されます。 domain discovery、DRS secret parsing、PAC 生成、PSEXEC cleanup は独立した 失敗境界なので、一つの generic exception でどこまで進んだかを失わないことが 重要です。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
RemComMessage | 113 | 構造体/定数定義 |
RemComResponse | 123 | 構造体/定数定義 |
RetryableGoldenTicketError | 135 | 構造体/定数定義 |
PSEXEC | 138 | __init__()、run()、openPipe() |
Pipes | 266 | __init__()、connectPipe() |
RemoteStdOutPipe | 298 | __init__()、run() |
RemoteStdErrPipe | 325 | __init__()、run() |
RemoteShell | 343 | __init__()、connect_transferClient()、do_help()、do_shell()、do_get()、do_put()、do_lcd()、emptyline()、default()、send_data() |
RemoteStdInPipe | 451 | __init__()、run() |
RAISECHILD | 460 | __init__()、getChildInfo()、getMachineName()、getDNSMachineName()、getParentSidAndTargetName()、DRSCrackNames()、DRSGetNCChanges()、getCredentials()、makeGolden()、raiseUp()、exploit() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.krb5.types | KerberosTime, Principal |
impacket.krb5 | constants |
impacket.krb5.kerberosv5 | KerberosError, getKerberosTGS, getKerberosTGT |
impacket.krb5.asn1 | AD_IF_RELEVANT, AS_REP, AuthorizationData, EncTicketPart |
impacket.krb5.crypto | _enctype_table, get_kerberos_key_for_enctype, get_matching_aes_key |
impacket.dcerpc.v5.ndr | NDRULONG |
impacket.dcerpc.v5.samr | GROUP_MEMBERSHIP, NULL, SE_GROUP_ENABLED, SE_GROUP_ENABLED_BY_DEFAULT, SE_GROUP_MANDATORY |
impacket.examples | logger, remcomsvc, serviceinstall |
impacket.examples.utils | parse_identity |
impacket.ntlm | LMOWFv1, NTOWFv1 |
impacket.dcerpc.v5.dtypes | MAXIMUM_ALLOWED, RPC_SID |
impacket.dcerpc.v5.rpcrt | RPC_C_AUTHN_GSS_NEGOTIATE, RPC_C_AUTHN_LEVEL_PKT_PRIVACY |
impacket.dcerpc.v5.nrpc | MSRPC_UUID_NRPC, hDsrGetDcNameEx |
impacket.dcerpc.v5.lsat | LSAP_LOOKUP_LEVEL, MSRPC_UUID_LSAT, POLICY_LOOKUP_NAMES, hLsarLookupSids |
impacket.dcerpc.v5.lsad | POLICY_INFORMATION_CLASS, hLsarOpenPolicy2, hLsarQueryInformationPolicy2 |
impacket.krb5.pac | KERB_SID_AND_ATTRIBUTES, PACTYPE, PAC_CLIENT_INFO_TYPE, PAC_INFO_BUFFER, PAC_LOGON_INFO, PKERB_SID_AND_ATTRIBUTES_ARRAY, VALIDATION_INFO, sign_pac |
impacket.dcerpc.v5 | drsuapi, epm, samr, transport |
impacket.smbconnection | SMBConnection, SessionError, smb |
impacket.nt_errors | STATUS_NO_LOGON_SERVERS |
impacket.structure | Structure |
impacket.krb5.ccache | CCache |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| 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 “実装を変更するとき”drsuapi / nrpc / lsad / samr、krb5.*、PAC/NDR、SMB/serviceinstall に依存します。RAISECHILD が discovery、credential、ticket を段階別 method に分けています。暗号 key の fallback と retry を変更する場合は RC4/AES の選択根拠を保持してください。
- 構文:
python -m py_compile examples/raiseChild.py - CLI:
python examples/raiseChild.py -h - 関連テスト:
tests/SMB_RPC/test_ndr.py - 関連テスト:
tests/SMB_RPC/test_ntlm.py - 関連テスト:
tests/SMB_RPC/test_rpcrt.py - 関連テスト:
tests/dcerpc/test_lsad.py - 関連テスト:
tests/dcerpc/test_lsat.py - 関連テスト:
tests/dcerpc/test_nrpc.py

