Impacket kintercept.py
Kerberos の TCP 通信を中継し、要求と応答を観察・変換する開発用プロキシです。
| 項目 | 内容 |
|---|---|
| 実装 | examples/kintercept.py |
| カテゴリ | Kerberos / チケット処理 |
| 規模 | 296 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/kintercept.py -h で確認できます。
| 引数 | 説明 |
|---|---|
server | Target server address |
--server-port | Target server port(既定値: 88) |
--listen-port | Port to listen on(既定値: 88) |
--listen-addr | Address to listen on |
--request-handler | Example: s4u2else:user |
--reply-handler | Example: tgs-rep-user:user |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
詳細な処理フロー
Section titled “詳細な処理フロー”listen socket で接続を受け、InterceptConn が client と upstream KDC 間を非同期に転送します。Kerberos TCP の length prefix 単位で buffering し、指定 handler が request/reply を処理してから反対側へ送ります。同梱 handler は S4U2self request/reply の一部を書き換えます。
仕組みの詳細
Section titled “仕組みの詳細”Kerberos over TCP は先頭4 byte の network-order length と、その長さの ASN.1 message で構成されます。この proxy は client connection と upstream KDC connection を対にし、双方の byte stream を buffer しながら完全な frame が 揃った時点で handler へ渡します。TCP の一回の read と Kerberos message は 一対一ではありません。
request/reply handler は decode した message を観察または変更し、再 encode した長さと payload を送信 queue へ戻します。同梱の S4U 関連 handler は 特定 request/reply field を対象にしますが、未知 message type は透過的に 転送される必要があります。変換後に ASN.1 length や outer TCP length を 更新し忘れると、次 frame まで壊れます。
各方向は非同期に partial write されるため、送信済み offset、EOF、相手側の
half-close を管理します。現在の asyncore 依存は Python 3.12 以降で動かない
ため、selector/asyncio へ移行する場合も buffering と backpressure の意味を
保つ必要があります。proxy 自身が KDC 応答を生成するわけではありません。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
InterceptConn | 108 | __init__()、recv()、forward_data()、buffer_empty()、max_read_size()、readable()、handle_read()、handle_eof()、need_to_send_eof()、writable()、handle_write()、handle_close() |
InterceptConnFactory | 220 | __init__()、produce() |
InterceptServer | 233 | __init__()、intercept_conns()、handle_accept() |
process_s4u2else_req() | 49 | モジュール関数 |
mod_tgs_rep_user() | 95 | モジュール関数 |
InterceptKRB5Tcp() | 189 | モジュール関数 |
parse_args() | 264 | モジュール関数 |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.krb5 | constants |
impacket.krb5.crypto | Cksumtype |
impacket.krb5.asn1 | PA_FOR_USER_ENC, TGS_REP, TGS_REQ, seq_set |
impacket.krb5.types | Principal |
impacket.examples | logger |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
pyasn1 | pyasn1 | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- 待受 socket または長時間 loop を開始します。bind address、port、停止方法、同時接続時の共有状態を確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
- 後始末に関係する実装として
handle_close()があります。新しい早期 return や例外経路でも到達するか確認します。 - Python 3.12 以降では
asyncoreimport が失敗します。互換性問題と network failure を分けて扱ってください。 - 停止要求、client 切断、partial read/write、worker 例外で listener 全体が不整合にならないことを確認します。
実装を変更するとき
Section titled “実装を変更するとき”標準ライブラリだった asyncore、krb5.asn1、pyasn1 に依存します。asyncore は Python 3.12 で削除されており、現在の実装は project の対応 Python 3.12/3.13 でそのまま import できません。置換時も InterceptConn の partial read/write と Kerberos TCP message 境界を維持し、一回の recv が一メッセージとは仮定しないでください。
- 構文:
python -m py_compile examples/kintercept.py - CLI:
python examples/kintercept.py -h - 関連テスト:
tests/misc/test_crypto.py - 関連テスト:
tests/misc/test_krb5_crypto.py - 関連テスト:
tests/misc/test_krb5_gssapi.py

