Impacket addcomputer.py
ドメインの computer account を作成・削除・確認します。SAMR、LDAPS に加え、 SAMR で作成したアカウントや既存アカウントの LDAP 属性を設定できます。
| 項目 | 内容 |
|---|---|
| 実装 | examples/addcomputer.py |
| カテゴリ | Active Directory / LDAP / アカウント管理 |
| 規模 | 498 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/addcomputer.py -h で確認できます。
| 引数 | 説明 |
|---|---|
-domain-netbios | ドメインの NetBIOS 名。DC が複数のドメインを扱う場合に指定します。 |
-computer-name | 追加する computer account の名前。省略時はランダムに生成します。 |
-computer-pass | 設定するパスワード。省略時はランダムに生成します。 |
-no-add | 新規作成せず、既存の computer account のパスワードだけを設定します。 |
-delete | 既存の computer account を削除します。 |
-ts | ログに時刻を付けます。 |
-debug | デバッグログを有効にします。 |
-method | 操作方式。SAMR_LDAP は SAMR 作成後に LDAP 属性を設定し、LDAP_FINALIZE は既存アカウントの属性を設定します。選択肢は SAMR、SAMR_LDAP、LDAPS、LDAP_FINALIZE で、既定は SAMR です。 |
-port | 接続先ポート。139、445、636 を指定でき、SAMR は 445、LDAPS は 636 が既定です。 |
-baseDN | LDAP の base DN。省略時は指定したアカウントのドメインから決めます。 |
-computer-group | computer account の配置先。省略時は CN=Computers です。 |
-hashes | NTLM ハッシュを LMHASH:NTHASH 形式で渡します。 |
-no-pass | パスワードの対話入力を省きます。 |
-k | Kerberos 認証を使います。ccache に資格情報がなければ、コマンドラインで指定した値を使います。 |
-aesKey | Kerberos 認証に使う 128/256 ビットの AES 鍵。 |
-dc-host | 接続する Domain Controller のホスト名。省略時はアカウントのドメインから決めます。 |
-dc-ip | 接続する Domain Controller の IP アドレス。 |
account | 認証に使う [domain/]username[:password] 形式のアカウント。 |
詳細な処理フロー
Section titled “詳細な処理フロー”引数から account、DC、computer 名/パスワードを決定し、-method により
run_samr()、run_ldaps()、LDAPFinalizeComputerAccount() へ分岐します。
SAMR_LDAP は run_samr() で作成した後に LDAP 属性を設定します。名前未指定時はランダム名を生成します。
仕組みの詳細
Section titled “仕組みの詳細”computer account の作成は SAMR と LDAPS の二経路で実装されています。SAMR
経路は RPC で domain handle を開き、machine account 用の account type と
初期 password を設定します。LDAPS 経路は directory object を add し、
sAMAccountName、userAccountControl、DNS host 名などの属性を設定します。
同じ「追加」でも server 側で通る authorization check と必要 port が異なります。
SAMR_LDAP は作成後に LDAPFinalizeComputerAccount() で DNS host 名や SPN
などを設定し、LDAP_FINALIZE は既存の computer account にこの設定だけを行います。
run() は action(追加、削除、存在確認)と -method を先に確定し、
それぞれの backend へ渡します。computer 名を省略した場合は末尾 $ を含む
ランダムな名前を作り、password も未指定なら生成します。生成した値は後続処理
で必要になるため、ログへ不用意に露出させず、成功した object と対応する値だけを
利用者へ返す必要があります。
LDAP では object の配置先 DN と -computer-group、SAMR では domain NetBIOS
名と RID/domain handle が重要です。方式ごとに設定できる属性が異なるため、
作成後の属性、既存名の挙動、SAMR 作成後の LDAP 設定に失敗したときに残る
object を確認します。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
ADDCOMPUTER | 46 | __init__()、run_samr()、run_ldaps()、LDAPFinalizeComputerAccount()、LDAPComputerExists()、LDAPGetComputer()、generateComputerName()、doSAMRAdd()、run() |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket | version |
impacket.examples | logger |
impacket.examples.utils | init_ldap_session, ldap3_kerberos_login, parse_identity |
impacket.dcerpc.v5 | epm, samr, transport |
impacket.spnego | SPNEGO_NegTokenInit, TypesMech |
外部パッケージ(直接使用)
Section titled “外部パッケージ(直接使用)”| import 名 | 配布パッケージ | 経路・宣言状態 |
|---|---|---|
ldap3 | ldap3 | 直接 import、宣言済み |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 対象の状態を変更する操作があります。変更前に対象名や SID、パスを確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
実装を変更するとき
Section titled “実装を変更するとき”dcerpc.v5.samr / transport / epm、ldap3、examples.utils.init_ldap_session に依存します。操作分岐は ADDCOMPUTER に集約されています。既定 container、NetBIOS domain、LDAP base DN の扱いは二経路で同じ意味になるよう保ってください。
- 構文:
python -m py_compile examples/addcomputer.py - CLI:
python examples/addcomputer.py -h - 関連テスト:
tests/SMB_RPC/test_spnego.py - 関連テスト:
tests/misc/test_dcerpc_v5_ndr.py

