تکنولوژی

تحلیل فنی آسیب‌پذیری جدید Active Directory و روش شناسایی آن در Splunk

ستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعال
 

Active Directory  از دیرباز هسته ی احراز هویت و مدیریت هویت در سازمان‌ها بوده است. اما گاهی «ابزارهای مدیریتی درونی»  مانند Active Directory Sites & SiteLinksمی‌توانند به‌نحوی مورد سوءاستفاده قرار گیرند که مهاجم با تغییرات پیکربندی، مسیرهای replication یا لینک‌های GPO را بازنویسی کند و عملاً امتیازات دامنه را کسب کند. در این مقاله از سلام دیجی هم حمله را تشریح نموده و هم مجموعه عملیاتی کوئری‌های Splunk  را برای شناسایی و پاسخ سریع ارائه می دهیم.

مسئله کجاست؟ (Technical root cause)

Site  در Active Directory برای بهینه‌سازی ترافیک بین کنترل‌کننده‌های دامنه (DC) و تنظیم رفتار replication  طراحی شده است. اگر مهاجم بتواند به پارتیشن configuration دسترسی پیدا کند یا GPOها را به سایت‌ها لینک کند، می‌تواند رفتار replication را تغییر دهد، مسیرهای احراز هویت را جهت‌دهی کند و حتی ترافیک Kerberos/LDAP  را به سمت نودهای تحت کنترل خود بفرستد. در نتیجه امکان Man-in-the-Middle  روی تبادل‌های حساس و استخراج TGT/TGS یا انتشار تنظیمات مخرب به وجود می‌آید.

سناریوی حمله (خلاصه فنی)

  1. نفوذ اولیه به یک host داخل دامنه (مثلاً از طریق فیشینگ یا exploit سطح کاربر).
  2. کشف ساختار AD و شناسایی Sites/SiteLinks با ابزارهایی مثل PowerView/ADExplorer.
  3. تغییر SiteLink یا لینک‌کردن GPO مخرب به یک Site که شامل DCهاست.
  4. تغییر مسیر replication یا policy application و در نتیجه اجرای تنظیمات/دستورات با دامنه وسیع.
  5. ارتقای امتیاز به Domain Admin و حرکت جانبی.

نکات شناسایی (Indicators / Telemetry)

✔️ تغییرات در DNهای مربوط به پارتیشن پیکربندی:  CN=Sites,CN=Configuration,DC=…

✔️ رخدادهای Windows Security :  EventIDهای مرتبط با Directory Service Changes (مثلاً 5136, 5137) و Object Access (4662, 4663) که اشاره به DNهای پیکربندی دارند.

✔️ ترافیک LDAP/Kerberos غیرمعمول بین DCها یا به IPهای جدید.

✔️ ایجاد GPO لینک‌شده به Site در زمان‌های غیرمعمول یا توسط اکانت‌های غیرمنتظره.

راهکارهای کاهش خطر (Mitigations)

✔️ محدودسازی دسترسی write به پارتیشن Configuration و اعمال least-privilege در ACEها.

✔️ پیاده‌سازی Tiered Administration (PAW، break-glass، separation of duties).

✔️ فعال‌سازی و ذخیره‌سازی کامل auditing برای Directory Service Changes .

✔️ اعمال Change Management (ticketing) و Require Authorization برای هر تغییر روی پارتیشن پیکربندی.

Segment ✔️  بندی شبکه برای محدودسازی مسیرهای مدیریتی و محافظت از کانال‌های replication.

کوئری‌های عملی Splunk برای Detection و Hunting

در ادامه مجموعه‌ای از کوئری‌های Splunk ارائه شده که می‌توانند به‌عنوان Alerts یا Hunt Jobs در محیط شما پیاده‌سازی شوند. قبل از اجرا، جایگزین‌های لازم (index، نام دامنه) را انجام دهید و خروجی‌ها را بر اساس asset tagging و لیست ادمین‌های مجاز enrich کنید.

 پیدا کردن تغییرات AD که به CN = Sites یا CN = Configuration اشاره دارند

هدف: شناسایی EventIDهای 5136/5137/4662 که حاوی تغییر در DNهای پیکربندی هستند.

index=wineventlog (EventCode=5136 OR EventCode=5137 OR EventCode=4662)

| eval EventDataStr = mvjoin(mvfilter(match(tostring(EventData),".")), " ")

| where like(EventDataStr, "%CN=Sites%") OR like(EventDataStr, "%CN=Configuration%") OR like(EventDataStr, "%SiteLink%") OR like(EventDataStr, "%GPO%")

| rex field=EventDataStr "ObjectDN=(?<ObjectDN>[^;]+)"

| table _time, host, ComputerName, User, EventCode, ObjectDN, Message

| sort - _time

توضیح:  rex برای استخراج ObjectDN استفاده شده. اگر EventData در قالب XML ذخیره است از spath استفاده کنید.

 هشدار برای ایجاد یا لینک شدن GPO به یک Site (با چک اکانت غیرمجاز)

هدف:  detection سریع هنگام ایجاد GPO link جدید یا لینک‌شدن GPO به Site.

index=wineventlog EventCode=5136

| eval EventDataStr = mvjoin(mvfilter(match(tostring(EventData),".")), " ")

| where like(EventDataStr, "%GPO%") AND (like(EventDataStr, "%Site%") OR like(EventDataStr, "%CN=Sites%"))

| rex field=EventDataStr "SubjectUserName=(?<User>[^;]+)"

| lookup trusted_admins.csv User OUTPUT is_trusted

| where isnull(is_trusted) OR is_trusted!="true"

| table _time, host, User, ObjectDN, Message

توضیح:  از lookup لیست trusted_admins.csv برای کاهش false-positive استفاده کنید.

 الگوی anomalous changes : چند تغییر در CN=Sites در بازه کوتاه

هدف: شناسایی موج تغییرات که نمایانگر فعالیت خودکار یا اسکریپت‌محور مهاجم است.

index=wineventlog (EventCode=5136 OR EventCode=5137)

| eval EventDataStr = mvjoin(mvfilter(match(tostring(EventData),".")), " ")

| where like(EventDataStr, "%CN=Sites%") OR like(EventDataStr, "%SiteLink%")

| bin _time span=5m

| stats count by _time, User

| where count >= 3

| sort - _time

توضیح: آستانه count >= 3 را بر اساس محیط خود تنظیم کنید.

 افزایش ناگهانی ارتباط بین DCها (شبکه/Netflow) احتمال تغییر مسیر replication

هدف: آشکارسازی افزایش ترافیک LDAP/Kerberos بین دو host (DCها).

index=netflow OR index=stream dest_port IN (389,636,88,464)

| stats count by src_ip, dest_ip, dest_port

| lookup dc_inventory.csv src_ip OUTPUT src_role

| lookup dc_inventory.csv dest_ip OUTPUT dest_role

| where src_role="DomainController" OR dest_role="DomainController"

| where count > 100

| sort - count desc

توضیح: از لیست dc_inventory.csv برای علامت‌گذاری DCها استفاده کنید؛ آستانه‌ها را براساس معیارهای شبکه خود تغییر دهید.

 Playbook query : تعیین اینکه کاربر تغییردهنده در لیست مدیران مورد اعتماد است یا خیر (برای پاسخ اتوماتیک)

هدف: در مرحله اولیه پاسخ، تشخیص اینکه آیا تغییر مجاز است یا نیازمند escalation .

index=wineventlog (EventCode=5136 OR EventCode=5137)

| eval EventDataStr = mvjoin(mvfilter(match(tostring(EventData),".")), " ")

| where like(EventDataStr, "%CN=Sites%") OR like(EventDataStr, "%CN=Configuration%")

| rex field=EventDataStr "SubjectUserName=(?<User>[^;]+)"

| lookup trusted_admins.csv User OUTPUT is_trusted, owner, change_window

| eval is_authorized = if(is_trusted=="true" AND now() >= strptime(change_window, "%Y-%m-%dT%H:%M:%S"), "false", is_trusted)

| table _time, host, User, is_trusted, owner, ObjectDN, Message

توضیح :  change_window می‌تواند از CMDB یا ticketing استخراج شود. logic را برای محیط خود تکمیل کنید.

از detection تا پاسخ: پیشنهاد Playbook (گام‌به‌گام)

  1. Alert triage :  Alert از کوئری‌های بالا : بررسی User، Host و ObjectDN.
  2. Context enrichment :  lookup با trusted_admins.csv، dc_inventory.csv و change tickets.
  3. هم‌زمان:  snapshot از replication topology بگیرید:

Get-ADReplicationPartnerMetadata -Target * | Format-Table Partner, LastReplicationAttempt, LastReplicationSuccess

  1. اگر کاربری غیرمجاز بود:
    • محدودسازی دسترسی شبکه‌ای (ACL روی مدیریت DC).
    • قرنطینه کردن میزبان مهاجم،
    • استخراج تمام تغییرات AD که توسط آن کاربر انجام شده (EventID 5136/5137)،
    • Restore  از metadata backup یا rollback GPO،
    • Rotate  کردن credentialهای اکانت‌های Privileged و بررسی lateral movement .
  2. Post-incident :  audit کامل، اصلاح ACEها در CN=Configuration، و اجرای pentest داخلی برای بررسی باقی‌مانده اثرات.

نکات عملیاتی و کاهش False Positives

✔️ همیشه whitelist  اکانت‌های مدیریتی شناخته‌شده (اما لاگینگ را قطع نکنید).

✔️ کوئری‌ها را با enrichment (asset owners, change tickets, maintenance windows) ترکیب کنید.

Threshold ✔️ها را بر اساس الگوی کاری محیط خود تنظیم کنید (مثلاً تعداد تغییرات در 5 دقیقه).

✔️ کوئری‌ها را در حالت search job برای historical hunting و در حالت saved alert برای real-time اجرا کنید.

نتیجه‌گیری

Active Directory Sites  ممکن است به‌عنوان یک بردار پنهان برای ارتقای امتیاز به کار گرفته شود. ردیابی تغییرات در پارتیشن configuration و لینک‌های GPO و پیاده‌سازی detectionهای دقیق در Splunk  می‌تواند SOC را چند گام جلوتر از مهاجم قرار دهد. با ترکیب کوئری‌های بالا، playbook و سخت‌سازی دسترسی‌ها، می‌توانید این بردار را به‌شدت کاهش دهید.

 

تمام حقوق سایت برای سلام دیجی و نويسندگان آن محفوظ می باشد