Active Directoryに新しいコンピューターアカウントを追加する方法
Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションです。SecureAuthによって開発されたオープンソースのライブラリであり、SMB、MSRPC、Kerberosなど、多くのプロトコルに対応しています。特にWindowsネットワーク環境におけるセキュリティテストや管理タスクで広く利用されています。低レベルのパケットアクセスを提供し、一部のプロトコル(SMB1-3やMSRPCなど)についてはプロトコル実装自体を提供します。これにより、開発者はネットワークパケットを簡単に作成、デコードできます。
Impacketには、リモートサービスの実行、Kerberos認証の操作、資格情報のダンプ、パケットキャプチャなど、様々な機能を持つ多数のサンプルスクリプトが含まれています。これらのツールは、脆弱性スキャナーや攻撃シミュレーションツールの一部として、またペネトレーションテストやネットワーク管理の実務で活用されています。しかし、その強力さ故に、ランサムウェアなどのサイバー攻撃にも悪用されることがあるため、検出された際の取り扱いには注意が必要です。
このブログ記事では、Impacketに含まれる多くのツールの中から、addcomputer.py
に焦点を当てます。このスクリプトは、Active Directory (AD) ドメインに新しいコンピューターアカウントを追加するために使用されます。その基本的な使い方から、応用的なテクニック、そしてセキュリティ上の注意点まで、詳しく解説していきます。💻
addcomputer.pyとは? 🤔
addcomputer.py
は、指定されたドメインユーザーの資格情報を使用して、Active Directoryに新しいコンピューターアカウントを追加するためのImpacketスクリプトです。この操作は主に、ドメインレベルの属性であるms-DS-MachineAccountQuota
が0より大きい場合に可能です(デフォルトでは10に設定されています)。この設定により、標準的なドメインユーザーでもマシンアカウントを作成し、ドメインに参加させることが許可されます。
もしms-DS-MachineAccountQuota
が0に設定されている場合でも、使用する資格情報が十分な権限(例:ドメイン管理者)を持っていれば、このスクリプトは利用可能です。さらに、適切な権限が検証されれば、既存のコンピューターアカウントのパスワードを変更したり、アカウントを削除したりするためにも使用できます。
このスクリプトは、SAMR (Security Account Manager Remote Protocol) over SMB、またはLDAPS (LDAP over SSL/TLS) のいずれかのメソッドを使用してコンピューターアカウントを追加できます。デフォルトではSAMRメソッドが使用されますが、LDAPSメソッドも選択可能です。平文のLDAPは、新しいコンピューターのパスワード設定を許可しないため、サポートされていません。
注意: 2021年12月10日時点の情報として、SAMRメソッドでアカウントを作成した場合、SPN (Service Principal Name) なしでアカウントが作成されます。SPNが必要な場合はLDAPSメソッドの使用を検討してください。
利用シナリオと前提条件 ✅
addcomputer.py
が役立つ主なシナリオは、Active Directory環境のペネトレーションテストやセキュリティ評価において、権限昇格や横展開(Lateral Movement)の足がかりを得ることです。
主な利用シナリオ:
ms-DS-MachineAccountQuota
の悪用: ドメインのms-DS-MachineAccountQuota
属性がデフォルトの10、あるいは0より大きい値に設定されている場合、一般ユーザー権限でもドメインにコンピューターアカウントを追加できます。作成したコンピューターアカウントの資格情報(ユーザー名$ とパスワード)を使用して、他のシステムへのアクセスを試みたり、特定の攻撃(例:Resource-Based Constrained Delegation (RBCD))に利用したりできます。- 特権アカウントの利用: ドメイン管理者など、コンピューターアカウントを追加する権限を持つアカウントの資格情報を取得した場合、
addcomputer.py
を使用して新しいコンピューターアカウントを作成できます。 - RBCD攻撃の準備: Resource-Based Constrained Delegation (RBCD) 攻撃を行う際には、攻撃者が制御するコンピューターアカウントが必要になる場合があります。
addcomputer.py
は、このためのコンピューターアカウントを作成する手段として利用されます。
前提条件:
- Impacketのインストール:
addcomputer.py
を実行するには、Impacketがインストールされている必要があります。通常、Kali Linuxなどのペネトレーションテスト用ディストリビューションにはプリインストールされていますが、そうでない場合は公式リポジトリからインストールできます。Python 3.6以上が必要です。 - ドメイン資格情報: コンピューターアカウントを追加する権限を持つドメインユーザーの資格情報(ユーザー名とパスワード、またはハッシュ)が必要です。前述の通り、
ms-DS-MachineAccountQuota
> 0 であれば一般ユーザーでも可能です。 - ネットワークアクセス: ドメインコントローラーへのネットワークアクセスが必要です(通常、SMB用のポート445、またはLDAPS用のポート636)。
ms-DS-MachineAccountQuota
の値を確認するには、ldapsearch
やImpacketのGetADUsers.py
、ldapdomaindump
などのツールを使用できます。
# ldapsearch を使用した確認例 (OpenLDAP)
ldapsearch -x -H ldap://<DC_IP> -b 'DC=<domain>,DC=<tld>' -D "<user>@<domain>.<tld>" -W -s sub "(objectclass=domain)" ms-DS-MachineAccountQuota
基本的な使い方 🚀
addcomputer.py
の基本的な構文は以下の通りです。
addcomputer.py [オプション] <ドメイン>/<ユーザー名>[:<パスワード>]
最もシンプルな使い方は、コンピューター名とパスワードを指定せずに実行することです。この場合、ランダムなコンピューター名(例: `DESKTOP-XXXXXXXX`)とランダムな32文字のパスワードが自動的に生成され、デフォルトのメソッド (SAMR) で追加されます。
# ドメインコントローラーのIPアドレスを指定して実行
addcomputer.py -dc-ip 192.168.1.100mydomain.local/testuser:Password123
# ドメインコントローラーのIPアドレスをFQDNから解決させる場合
addcomputer.py mydomain.local/testuser:Password123
成功すると、作成されたコンピューターアカウント名とパスワードが出力されます。
[*] Successfully added machine account DESKTOP-A1B2C3D4$ with password RandomPasswordGeneratedHere...
特定のコンピューター名とパスワードを指定して追加することも可能です。
addcomputer.py -dc-ip 192.168.1.100 -computer-name MyNewPC$ -computer-pass MySecureP@ssw0rd mydomain.local/testuser:Password123
コンピューターアカウント名は通常、末尾に $
を付けます。-computer-name
オプションで $
を省略しても、スクリプトが自動的に付与してくれる場合がありますが、明示的に指定することが推奨されます。
主要なオプション解説 ⚙️
addcomputer.py
には多くのオプションがあり、動作を細かく制御できます。以下に主要なオプションを解説します。
オプション | 説明 |
---|---|
-h, --help |
ヘルプメッセージを表示して終了します。 |
-dc-ip <ip address> |
ドメインコントローラーのIPアドレスを指定します。指定しない場合、ターゲットパラメータのドメイン部分(FQDN)から解決を試みます。 |
-dc-host <hostname> |
ドメインコントローラーのホスト名を指定します。-dc-ip と同様ですが、ホスト名で指定する場合に使用します。 |
-computer-name <COMPUTER-NAME$> |
追加する新しいコンピューターアカウントの名前を指定します。省略した場合、DESKTOP-[A-Z0-9]{8} 形式のランダムな名前が使用されます。 |
-computer-pass <password> |
新しいコンピューターアカウントのパスワードを指定します。省略した場合、[A-Za-z0-9]{32} 形式のランダムなパスワードが生成され、成功時に出力されます。 |
-method {SAMR,LDAPS} |
コンピューターアカウントを追加するメソッドを指定します。SAMR (SMB経由) または LDAPS (LDAP over SSL/TLS) を選択できます。デフォルトは SAMR です。 |
-port {139,445,636} |
接続先のポート番号を指定します。SAMRの場合は445がデフォルト、LDAPSの場合は636がデフォルトです。 |
-domain-netbios <NETBIOSNAME> |
対象ドメインのNetBIOS名を指定します。 |
-computer-group <LDAP path> |
新しいアカウントが追加されるグループをLDAPパス形式で指定します。省略した場合、デフォルトのCN=Computers コンテナに追加されます。 |
-baseDN <DC=domain,DC=com> |
LDAPのベースDNを指定します。省略した場合、引数で指定されたドメイン名(FQDNである必要あり)から自動的に生成されます。 |
-no-add |
このフラグを指定すると、新しいアカウントを追加せずに、指定されたコンピューターアカウントのパスワードのみを変更します。 |
-delete |
このフラグを指定すると、既存のコンピューターアカウントを削除します。 |
-debug |
デバッグモードを有効にします。より詳細な情報が出力され、問題解決に役立ちます。 |
認証関連のオプション
オプション | 説明 |
---|---|
-hashes <LMHASH:NTHASH> |
Pass-the-Hash認証に使用するLMハッシュおよびNTハッシュを指定します。LMハッシュは省略可能です(例: :NTHASH )。 |
-no-pass |
パスワードなし、または空のパスワードで認証する場合に指定します。 |
-k |
Kerberos認証を使用する場合に指定します。-aesKey と併用するか、有効なKerberosチケットキャッシュ(ccache)が必要です。 |
-aesKey <hex key> |
Pass-the-Key認証(Kerberos)に使用するAES128またはAES256の16進数キーを指定します。-k フラグも同時に指定する必要があります。 |
応用的な使い方と例 💡
基本的な使い方以外にも、オプションを組み合わせることで様々な操作が可能です。
Pass-the-Hash (PtH) を使用したアカウント追加
ユーザーのパスワードが不明でも、NTLMハッシュが分かっていれば、-hashes
オプションを使って認証し、コンピューターアカウントを追加できます。
addcomputer.py -dc-ip 192.168.1.100 -computer-name TargetPC$ -computer-pass ComplexP@ssw0rd! \
-hashes :<NTHASH_HERE> mydomain.local/compromiseduser
LDAPSメソッドを使用したアカウント追加
SAMRがブロックされている環境や、SPN付きでコンピューターアカウントを作成したい場合(例えばRBCD攻撃の準備など)は、LDAPSメソッドを使用します。通常、ポート636を使用します。
# LDAPSを使用し、自動生成名とパスワードで追加
addcomputer.py -dc-ip 192.168.1.100 -method LDAPS mydomain.local/testuser:Password123
# LDAPSを使用し、コンピューター名とパスワードを指定して追加
addcomputer.py -dc-ip 192.168.1.100 -method LDAPS \
-computer-name RBCDTarget$ -computer-pass P@sswordForRBCD \
mydomain.local/testuser:Password123
LDAPSを使用するには、ドメインコントローラーがLDAPS接続を受け入れるように構成されている必要があります。
特定のOU (Organizational Unit) への追加
-computer-group
オプションを使用すると、デフォルトのCN=Computers
ではなく、指定したOUにコンピューターアカウントを追加できます。OUはLDAPパス形式で指定します。
addcomputer.py -dc-ip 192.168.1.100 -method LDAPS \
-computer-name Server01$ -computer-pass ServPass123 \
-computer-group "OU=Servers,DC=mydomain,DC=local" \
mydomain.local/adminuser:AdminPass!
既存のコンピューターアカウントのパスワード変更
-no-add
オプションを使用すると、新しいアカウントを作成せずに、既存のコンピューターアカウントのパスワードを変更できます。変更対象のアカウント名と新しいパスワードを指定します。
addcomputer.py -dc-ip 192.168.1.100 -method LDAPS \
-computer-name ExistingPC$ -computer-pass NewStrongP@ssw0rd \
-no-add \
mydomain.local/adminuser:AdminPass!
コンピューターアカウントの削除
-delete
オプションを使用すると、指定したコンピューターアカウントを削除できます。
addcomputer.py -dc-ip 192.168.1.100 -method LDAPS \
-computer-name OldPC$ \
-delete \
mydomain.local/adminuser:AdminPass!
Kerberos認証を使用したアカウント追加
パスワードやハッシュの代わりに、有効なKerberosチケット(ccacheファイル)やAESキーを使用して認証することも可能です。
# AESキーを使用 (Pass-the-Key)
export KRB5CCNAME=/tmp/ticket.ccache # 必要に応じてccacheを指定
addcomputer.py -dc-ip 192.168.1.100 -k -aesKey <AES_KEY_HERE> \
-computer-name KerberosPC$ -computer-pass KerbPass1 \
mydomain.local/kerbuser
# ccacheファイルを使用 (事前にgetTGT.pyなどで取得)
export KRB5CCNAME=/path/to/user.ccache
addcomputer.py -dc-ip 192.168.1.100 -k \
-computer-name TicketPC$ -computer-pass TicketPass1 \
mydomain.local/ticketuser
unset KRB5CCNAME # 環境変数を元に戻す
セキュリティ上の考慮事項 ⚠️
addcomputer.py
は強力なツールですが、その利用にはセキュリティ上のリスクが伴います。
- 悪用の可能性: このツールは、攻撃者がネットワーク内で権限を昇格させたり、永続性を確保したりするために悪用される可能性があります。特に
ms-DS-MachineAccountQuota
がデフォルト値のままだと、一般ユーザーが作成したコンピューターアカウントが攻撃の足がかりとなる可能性があります。 - ログ記録: Active Directoryのイベントログには、コンピューターアカウントの作成、変更、削除に関するログが記録されます(イベントID 4741, 4742, 4743など)。これらのログを監視することで、不正なアクティビティを検出できる可能性があります。
- 権限管理:
ms-DS-MachineAccountQuota
の値を0に設定することで、一般ユーザーによるコンピューターアカウントの追加を禁止できます。これは、不要なアカウント作成を防ぐための重要な緩和策です。コンピューターアカウントの追加は、信頼された管理者のみが行えるように制限するべきです。 - 認証情報の保護:
addcomputer.py
を使用するには、ドメインユーザーの資格情報が必要です。これらの資格情報が漏洩しないように、強力なパスワードポリシーの適用、多要素認証の導入、特権アクセス管理(PAM)ソリューションの利用などを検討してください。 - ネットワークセグメンテーション: ドメインコントローラーへのアクセスを必要最小限に制限するネットワークセグメンテーションも、悪用リスクを低減するのに役立ちます。
ペネトレーションテストやセキュリティ評価で使用する場合でも、必ず事前に許可を得て、影響範囲を理解した上で実行してください。本番環境での無許可の使用は絶対に避けてください。
まとめ 🎉
impacket-addcomputer
(addcomputer.py) は、Active Directory環境においてコンピューターアカウントを管理するための強力なツールです。特に、ms-DS-MachineAccountQuota
の設定を利用した権限昇格のシナリオや、RBCDのような高度な攻撃手法の準備段階で重要な役割を果たします。
基本的な使い方から、Pass-the-Hash、LDAPSメソッド、Kerberos認証といった応用的なテクニックまで、様々なオプションを駆使することで柔軟な操作が可能です。しかし、その強力さ故に悪用されるリスクも高く、セキュリティ担当者はこのツールの機能と潜在的な脅威を理解し、適切な監視と防御策(ms-DS-MachineAccountQuota
の見直し、ログ監視、アクセス制御など)を講じることが不可欠です。
Impacketスイートの一部として提供されるこのツールは、ネットワークプロトコルの理解を深め、Active Directoryのセキュリティを評価する上で非常に有用です。責任ある使い方を心掛け、セキュアなネットワーク環境の維持に役立てましょう。🛡️
コメント