※本記事は、https://www.secureworks.com/ で公開されている SNIFFING OUT SHARPHOUND ON ITS HUNT FOR DOMAIN ADMIN を翻訳したもので、 2023年8月1日執筆時点の見解となります。
Secureworks® Counter Threat Unit™ (CTU) では、Purple Team による「リサーチ スプリント」と呼ばれる演習を定期的に実施しています。これはまず最新の攻撃テクニックを把握し、次にそれを使用した攻撃を行って、Secureworks Taegis™ の保護性能を評価し、検知能力をさらに改善する余地を追求するものです。リサーチ スプリントでは、当社の脅威インテリジェンス調査から得た情報に加え、Secureworks Adversary Group (SwAG) による侵入テストや、Secureworks インシデント対応チームの活動から得た知見が活用されます。
サイバー攻撃では、攻撃者が高度な特権を持つアカウントを取得すると、システムやデータに自由にアクセスして、目的を達成することが容易になります。それを踏まえて、ある CTU™ リサーチ スプリントでは、攻撃者がドメイン管理者権限を取得する方法を重点的に調査しました。まず数百に及ぶ SwAG 侵入テスト レポートを調査し、お客様環境への侵入能力の高いドメイン管理者権限昇格ツールを特定しました。そして、このアクティビティを当社の制御環境でエミュレートして、これらのツールが使用されている場合にそれを検知する新しい方法を見つけ出しました。
最初に検討したのは、広く知られている BloodHound ツールセットと SharpHound データ コレクターです。これまで、Secureworks による SharpHound 対策プログラムは、Red Cloak™ などのエンドポイント エージェントが稼働しているシステム上で、ツール実行を検知することに重点を置いていました。しかし、この検知方法は、エンドポイント エージェントによる監視が行われていないシステム上で攻撃者がツールを実行した場合には効果がありません。このリサーチ スプリントの 1 つの目標は、実行されるシステムに依存せずに検知性能を改善できるように、SharpHound の監視データ全体をより深く理解することでした。
BloodHound
BloodHound ツールは、ターゲット環境内にある Active Directory (AD) オブジェクト間の関係を検出します。BloodHound は、グラフ理論に基づくツールであり、ターゲット AD 環境に関する情報をコレクターによって収集し、そのデータを取り込んで視覚的に表示します (図 1 を参照)。BloodHound を使用する攻撃者は、この視覚化されたターゲット AD 環境を検討して、管理者も気づいていないような経路で、特権アカウントを侵害したり、信頼関係を悪用したりする方法を素早く探し出します。攻撃者はその情報をもとに権限昇格攻撃を実行して、Kerberoasting に対して脆弱なユーザーを特定するなどの悪性アクティビティを行います。
図 1: BloodHound を使用した、ドメイン管理者権限を持つアカウントの検索(Source:Secureworks)
BloodHound は、複数種類のコレクター (別名、インジェスター) を使用して、目的の AD 環境から情報を収集できます。よく使われるコレクターに SharpHound があります。この名前は、開発者がコードベースに C# (C シャープ) を使用していることに由来しています。これとは別に、特定のタスクに対して Impacket フレームワークを使用する Python ベースのコレクター (BloodHound.py) もありますが、主に収集する情報は SharpHound と同じです。
SharpHound
このリサーチ スプリントでは、デフォルトの収集方法 (-c Default) を使用して Windows ワークステーションで SharpHound を実行し、ターゲット ドメイン (-d purplelabs.local) を指定しました (図 2 を参照)。コレクターの実行には、Windows ホスト上の侵害された管理者アカウント (pgustavo) を使用しました。
図 2: デフォルトの SharpHound 収集メソッドの実行(Source:Secureworks)
表 1 に、Windows ワークステーションで実行すると、このコレクターによって生成される監視データを示します。
タイムスタンプ (UTC) | 概要 | 種類 | TX_BYTE_COUNT (ネット) |
---|---|---|---|
2023-04-18T18:28:23 | 10.0.2.12 :51317 から 10.0.2.11 :445 TCP へのネットフロー | NET | 11613 |
2023-04-18T18:28:23 | 10.0.2.12 :51316 から 10.0.2.12 :445 TCP へのネットフロー | NET | |
2023-04-18T18:28:23 | 10.0.2.12 :51316 から 10.0.2.12 :445 TCP へのネットフロー | NET | |
2023-04-18T18:28:23 | 10.0.2.12 :51315 から 10.0.2.11 :445 TCP へのネットフロー | NET | |
2023-04-18T18:28:21 | 10.0.2.12 から 10.0.1.11 :53 UDP へのネットフロー | NET | 5412 |
2023-04-18T18:28:18 | 10.0.2.12 :51314 から 10.0.1.11 :445 TCP へのネットフロー | NET | 12924 |
2023-04-18T18:28:18 | 10.0.2.12 :51313 から 10.0.1.11 :445 TCP へのネットフロー | NET | |
2023-04-18T18:28:18 | 10.0.2.12 :51312 から 10.0.1.11 :389 TCP へのネットフロー | NET | 5230 |
2023-04-18T18:28:18 | 10.0.2.12 :51311 から 10.0.1.11 :389 TCP へのネットフロー | NET | 115995 |
2023-04-18T18:28:18 | 10.0.2.12 :51310 から 10.0.1.11 :389 TCP へのネットフロー | NET | 2329 |
2023-04-18T18:28:18 | 10.0.2.12 :51309 から 10.0.1.11 :389 TCP へのネットフロー | NET | 2347 |
2023-04-18T18:28:18 | 10.0.2.12 :51308 から 10.0.1.11 :389 TCP へのネットフロー | NET | 2321 |
2023-04-18T18:28:18 | 127.0.0.1 から 127.0.0.1 :64700 UDP へのネットフロー | NET | 11 |
2023-04-18T18:28:18 | 10.0.2.12 :51307 から 10.0.1.11 :389 TCP へのネットフロー | NET | 2320 |
2023-04-18T18:28:16 | 10.0.2.12 :51306 から 10.0.1.11 :389 TCP へのネットフロー | NET | 22134 |
2023-04-18T18:28:16 | 10.0.2.12 :51305 から 10.0.1.11 :389 TCP へのネットフロー | NET | 395216 |
2023-04-18T18:28:16 | 10.0.2.12 から 10.0.1.11 :389 UDP へのネットフロー | NET | 447 |
2023-04-18T18:28:15 | "D:\SharpHound.exe" -c Default -d purplelabs.local | PROC |
表 1: SharpHound をローカルで実行した後に Windows ワークステーション (WORKSTATION02 / 10.0.2.12) から収集された監視データ
表 2 に、ドメイン コントローラから収集した監視データを示します。SharpHound コレクターによる DNS ルックアップの結果、多数のネットフロー イベントが生成されたため、表にはアクティビティの一部のみを記載します。
タイムスタンプ (UTC) | 概要 | 種類 | TX_BYTE_COUNT (ネット) |
---|---|---|---|
2023-04-18T18:28:21 | 数百の DNS ルックアップにによるネットフロー イベント (一部) | NET | |
2023-04-18T18:28:21 | 10.0.2.12 :50397 から 10.0.1.11 :53 UDP へのネットフロー | NET | 118 |
2023-04-18T18:28:21 | 10.0.2.12 :57013 から 10.0.1.11 :53 UDP へのネットフロー | NET | 117 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51314 から 10.0.1.11 :445 TCP へのネットフロー | NET | 9997 |
2023-04-18T18:28:18 | 10.0.2.12 :51313 から 10.0.1.11 :445 TCP へのネットフロー | NET | |
2023-04-18T18:28:18 | 10.0.1.11 :56099 から 168.63.129.16 :80 TCP へのネットフロー | NET | 156 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51312 から 10.0.1.11 :389 TCP へのネットフロー | NET | 2729 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51311 から 10.0.1.11 :389 TCP へのネットフロー | NET | 932649 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51310 から 10.0.1.11 :389 TCP へのネットフロー | NET | 299 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51309 から 10.0.1.11 :389 TCP へのネットフロー | NET | 299 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51308 から 10.0.1.11 :389 TCP へのネットフロー | NET | 299 |
2023-04-18T18:28:18 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:18 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:18 | 10.0.2.12 :51307 から 10.0.1.11 :389 TCP へのネットフロー | NET | 299 |
2023-04-18T18:28:16 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:16 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:16 | 10.0.2.12 :51306 から 10.0.1.11 :389 TCP へのネットフロー | NET | 14911165 |
2023-04-18T18:28:16 | 4624:pgustavo による PURPLELABS.LOCAL へのログオン | AUTH | |
2023-04-18T18:28:16 | 4672:pgustavo による新規ログオンに割り当てられた特別な権限 | AUTH | |
2023-04-18T18:28:16 | 10.0.2.12 :51305 から 10.0.1.11 :389 TCP へのネットフロー | NET | 10442776 |
2023-04-18T18:28:16 | 10.0.2.12 :64701 から 10.0.1.11 :389 UDP へのネットフロー | NET | 176 |
2023-04-18T18:28:16 | 10.0.2.12 :64699 から 10.0.1.11 :389 UDP へのネットフロー | NET | 176 |
表 2: SharpHound の実行後にドメイン コントローラー (DC01 / 10.0.1.11) から収集された監視データ
SharpHound は、ドメイン コントローラーに対して一連の LDAP クエリを発行して、コンピューター名、グループ、ユーザー アカウントなどの AD オブジェクトを列挙します。この LDAP クエリは暗号化された LDAP セッションを介して発行される可能性があるため、必ずしもネットワーク検査で検知できるとは限りません。ただし、Windows ライブラリを利用して LDAP クエリを生成するツールは、Windows のイベント トレース (ETW) を介して監視できます。表 3 に、SharpHound ツールの実行中に作成された ETW トレース セッションが捕捉した SharpHound LDAP クエリを示します。
LDAP クエリ | 説明 |
---|---|
(|(samaccounttype=268435456)(samaccounttype=268435457)(samaccounttype=536870912)(samaccounttype=536870913)(primarygroupid=*)) | プライマリ グループ ID を持つセキュリティ グループ、非セキュリティ グループ、エイリアスと非エイリアス オブジェクトのグループ メンバーシップを検出します |
(&(sAMAccountType=805306369)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))) | 有効なコンピューター アカウントを検出します |
(|(samAccountType=805306368)(samAccountType=805306369)(samAccountType=268435456)(samAccountType=268435457)(samAccountType=536870912)(samAccountType=536870913)(objectClass=domain)(&(objectcategory=groupPolicyContainer)(flags=*))(objectcategory=organizationalUnit)) | 列挙されたオブジェクトのセキュリティ情報が格納されているアクセス制御リスト (ACL) を検出します |
(|(samaccounttype=268435456)(samaccounttype=268435457)(samaccounttype=536870912)(samaccounttype=536870913)(samaccounttype=805306368)(samaccounttype=805306369)(objectclass=domain)(objectclass=organizationalUnit)(&(objectcategory=groupPolicyContainer)(flags=*))) |
さまざまな AD グループ、ユーザー アカウント、コンピューター アカウント、グループ ポリシーを検出し、分析に役立つ多様なフィールド名を取得します。 |
(|(&(&(objectcategory=groupPolicyContainer)(flags=*))(name=*)(gpcfilesyspath=*))(objectcategory=organizationalUnit)(objectClass=domain)) | AD コンテナとリンクされたグループ ポリシー オブジェクト (GPO) を検出します |
(&(samaccounttype=805306368)(serviceprincipalname=*)) | サービス アカウントのすべてのサービス プリンシパル名 (SPN) を検出します |
(|(samAccountType=805306368)(samAccountType=805306369)(objectclass=organizationalUnit)) | 返されたオブジェクトについて、他のすべての子ユーザー、コンピューター、組織単位 (OU) オブジェクトを検出します |
(objectclass=container) | 返されたオブジェクトについて、すべての子コンテナ オブジェクトを検出します |
(|(samAccountType=805306368)(samAccountType=805306369)) | ユーザー オブジェクトとコンピューター オブジェクトをすべて検出します |
(objectclass=trusteddomain) | 信頼されたドメインをすべて検出します |
表 3: SharpHound が発行した LDAP クエリ
LDAP 接続の結果、生成されたリモート Windows 認証ログオン イベント (イベント ID 4624) のうち、複数がログオンに成功しました。LDAP クエリから返された結果により、さらに追加のアクティビティが生成されます。たとえば、特定された各コンピューター アカウントの DNS ルックアップや、TCP 445 テスト接続を実行するアクティビティ、さらにテスト接続に成功した場合に、リモート プロシージャ コール (RPC) を介して SMB 経由のセッション情報を列挙するアクティビティなどです。セッション情報を列挙するには管理者権限が必要であることに注意してください。このアクティビティにより、数百回に及ぶドメイン コントローラーへの DNS ルックアップ リクエストと、数百回に及ぶ複数ホスト間でのポート 445 接続が、短時間の間に発生します。
Taegis Tactic Graphs 検知機能による SharpHound への対応
CTU リサーチ チームは、環境内で生成されるあらゆる監視データを把握した上で、この調査スプリントの成果として、SharpHound を特定する脅威への対策プログラム「Taegis XDR Tactic Graphs™」を開発しました。この脅威への対策プログラムでは、認証とネットフロー イベントを使用して、SharpHound コレクターと一致する監視データ プロファイルのインスタンスを検出します。Taegis は、SharpHound の実行などの個々の悪性イベントだけでなく、攻撃に関するその他の情報を提供する一連のイベントを併せて検出します。Taegis XDR は、CTU が調査で得た脅威インテリジェンスを追加して継続的に更新されることで、ノイズ、正当な使用、実用的なアラートを区別するのに役立ちます。
Taegis XDR をプレビューして、攻撃者のツールとテクニックへの対応をご確認ください。