このシリーズの 入門記事 では、Active Directory(AD)サービスアカウントが何であるかを振り返り、これらの特権アカウントがなぜ重大なセキュリティリスクなのかを説明し、今後の記事でサービスアカウントに対する 4 種類の攻撃を詳しく取り上げることを約束しました。この記事では、そのうち最初の攻撃である LDAP reconnaissance を扱います。LDAP reconnaissance は、攻撃者が検知を回避しながら IT 環境内のサービスアカウントを見つけるために利用できる手口です。
厳選された関連コンテンツ:
具体的には、この投稿で、Domain Admin やローカル Administrator 権限のような特別な権限を持たない攻撃者が、Bloodhound のような専用ツールをインストールしたり学習したりすることなく、単純な PowerShell クエリを使ってサービス アカウントを見つける方法を紹介します。
特権アカウントの発見
Active Directory は多くのセキュリティと管理上のメリットを提供しますが、好奇心の強い攻撃者にとっては、物事が少し簡単すぎる面もあります。AD のアーキテクチャのため、攻撃者がドメイン参加済みの任意のコンピューターに侵入すると、ディレクトリとそのオブジェクトをクエリできます。そして、デフォルトの Active Directory では疑わしいアクティビティを監査してアラートする仕組みが提供されないため、検知を回避できることがよくあります。
おすすめの関連コンテンツ:
LDAP をクエリすることで、攻撃者がサービス アカウントを発見する方法の例をいくつか紹介します。
サービス プリンシパル名(Service Principal Name、SPN)の発見
サービス アカウントは、Kerberos 認証をサポートするために SPN を活用します。これはセキュリティを向上させますが、同時に、これらのアカウントがどこで使われており、何に使われているのかが明確に分かる痕跡も残します。この情報は攻撃者により容易に悪用され得ます。SPN は、Microsoft SQL Server や SharePoint のようなアプリケーションをサポートするためにサービスを実行する用途で一般的に使用されます。
別の blog post では、高度な AD 偵察の実行方法を紹介していますが、ここで必要とする情報を得るには、もっと簡単な方法もあります。次のシンプルな LDAP クエリを使用すると、攻撃者は登録済みの SPN を持つ AD アカウントの一覧だけでなく、それらがアクセスを提供するコンピューター、アプリケーション、データも取得できます。
#Build LDAP filters to look for users with SPN values registered for current domain
$ldapFilter = "(&(objectclass=user)(objectcategory=user)(servicePrincipalName=*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
#Execute Search
$results = $search.FindAll()
#Display SPN values from the returned objects
foreach ($result in $results)
{
$userEntry = $result.GetDirectoryEntry()
Write-Host "User Name = " $userEntry.name
foreach ($SPN in $userEntry.servicePrincipalName)
{
Write-Host "SPN = " $SPN
}
Write-Host ""
}
結果に含まれる SPN の値により、各アカウントがどこに登録されているか、またそのシステム上でどのサービスとして登録されているかが分かります。たとえば、SQL サービス アカウントの SPN 値は次のとおりです:
汎用オブジェクト属性を使用したサービス アカウントの発見
SPNは非常に信頼性が高く有益な情報を提供しますが、多くのアカウントはSPNを介してKerberosと統合されていないため、SPN値が設定されておらず、サービスアカウントの包括的なリストは生成できません。とはいえ、ドメイン権限がない攻撃者でも、他の手段によってサービスアカウントを見つけられることがよくあります。特に、ほとんどの組織では命名規則を使っており、たとえばすべてのサービスアカウント名を「SVC」またはそれに類する文字列で始めるようにし、サービスアカウントは通常、それぞれ専用の組織単位(OU)やグループに配置されます。
アカウントの命名規則に基づいてサービスアカウントを探す
次のPowerShellスクリプトは、名前に「svc」を含むすべてのアカウントを見つけます:
#Build LDAP filter to find service accounts based on naming conventions
$ldapFilter = "(&(objectclass=Person)(cn=*svc*))"
$domain = New-Object System.DirectoryServices.DirectoryEntry
$search = New-Object System.DirectoryServices.DirectorySearcher
$search.SearchRoot = $domain
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
#Add list of properties to search for
$objProperties = "name"
Foreach ($i in $objProperties){$search.PropertiesToLoad.Add($i)}
#Execute Search
$results = $search.FindAll()
#Display values from the returned objects
foreach ($result in $results)
{
$userEntry = $result.GetDirectoryEntry()
Write-Host "User Name = " $userEntry.name
Write-Host ""
}
OUに基づいてサービスアカウントを探す
また、前のスクリプトに置き換えて、名前に「Service」または「svc」を含むOUをすべて見つけるために使えるLDAPフィルターも以下に示します:
$ldapFilter = "(&(objectClass=organizationalUnit)(|name=*Service*)(name=*svc*)))"
The attacker can then search those OUs for all user objects to find your service accounts. This script focuses on one OU with “Service” in its name:
$search = New-Object System,DirecoryServices.DirectorySearcher
$search.SearchRoot = "LDAP://OU=Service Accounts,OU=JEFFLAB,DC=local"
$search.PageSize = 1000
$search.Filter = $ldapFilter
$search.SearchScope = "Subtree"
ユーザー アカウント制御によるサービス アカウントの検出
サービス アカウントを Active Directory で探す、もう 1 つの巧妙な方法は、アカウント制御の設定を調べることです。サービス アカウントは通常のユーザー アカウントとは異なる設定になっていることが多いためです。最もわかりやすい例が “password never expires” の設定です。サービス アカウントでは、パスワードを期限切れにしない設定がされている場合があります。パスワードのリセット作業が手間になり、アプリケーションやサービスの停止につながる可能性があるためです。
PowerShell を使うことで、やや複雑な LDAP フィルターを使用して、この値が有効になっているすべてのアカウントを見つけることができます。:
$ldapFilter = "(&(objectclass=user)(objectcategory=user)(useraccountcontrol:1.2.840.113556.1.4.803:=65536))"
特権を使った検出
この投稿では、いかなる権限も活用せずにサービス アカウントを見つける方法だけに焦点を当てています。しかし、攻撃者がネットワーク内の 1 台以上のシステムで権限を持つアカウントを見つけた場合は、サービス アカウントを発見するための他にも多くの効果的な方法があります。たとえば:
- エンドポイント上のサービスを列挙し、startname アカウントを抽出する
- web.config、スクリプト、およびサービス アカウントがハードコードされている可能性のあるその他の場所で接続文字列を検索する
- 「Log on as a Service」権限が付与されたユーザーのローカル ポリシーを調べる
- 非インタラクティブ ログオン タイプのイベント ログを抽出する
- アプリケーション プールおよびその他の Web アプリケーションのサービス アカウントを見つける
発見されたアカウントの悪用
攻撃者がサービスアカウントの一覧を入手したら、次のステップはそれらを悪用することです。以下の投稿で、攻撃者が取り得る選択肢の一部をご覧ください:
- Kerberoastingでサービスアカウントのパスワードを抽出する
- Silver Ticketsで特定のサービスアカウントを悪用する
- Golden Ticketsのために KRBTGT サービスアカウントを悪用する
LDAP の偵察やその他の攻撃手法について詳しくは、Netwrix attack catalogをご覧ください。
共有する
もっと詳しく
著者について
Jeff Warren
チーフ・プロダクト・オフィサー
Jeff Warren は Netwrix のプロダクトポートフォリオを統括しており、安全に重点を置いたプロダクトマネジメントおよび開発の分野で10年以上の経験を持ちます。Netwrix に入社する前、Jeff は Stealthbits Technologies にてプロダクト組織を率いていました。そこで彼はソフトウェアエンジニアとしての経験を活かし、革新的でエンタープライズ規模のセキュリティソリューションの開発に取り組みました。手を動かす実践的なアプローチと、難しいセキュリティ課題を解決するのが得意な点を強みに、Jeff は「実際に機能する」実用的なソリューションの構築に注力しています。彼はデラウェア大学(University of Delaware)で情報システム(Information Systems)の学士号を取得しています。