DCSync Attacks Introduction and Detection
مقاله
  • ۲۹ بهمن ۱۴۰۲
  • Learning Road Map
  • ۷ دقیقه خواندن

DCSync Attacks Introduction and Detection

احسان مقدمیان
همان‌طور که می‌دانید سرویس active directory یکی از حیاتی‌ترین سرویس‌های مبتنی بر پلتفرم ویندوزی است که به مدیران تیم فناوری اطلاعات کمک می‌کند تا سیستم‌ها، کاربران و سیاست‌ها را به صورت متمرکز در سراسر شبکه مدیریت کنند. می‌توان گفت Active Directory کامل‌ترین سرویسی است که برای (AAA) authentication accounting authorization استفاده می‌شود. از آن‌جایی‌که این سامانه‌ی یک‌پارچه، بخشی جدایی‌ناپذیر از زیرساخت سازمان است، فرصت‌هایی را برای مهاجمان ایجاد می‌کند تا از ویژگی‌های موجود در Active Directory در راستای اهداف مخرب خود سواستفاده کنند. در این مقاله به یکی از این ویژگی‌ها که به نام Active Directory Replication معروف است و همچنین به بررسی چند رویکرد جهت به دست آوردن درک عمیقی از حمله‌ی DCSync و روش شناسایی آن پرداخته شده است.

Active Directory Replication چیست؟

Domain Controller‌ها یا به اختصار DC‌ها ستون‌های محیط Active Directory هستند و سازمان‌ها اغلب چندین DC برای یک Active Directory در نظر می‌گیرند تا دسترس‌پذیر بودن این سرویس را تا حد ممکن تضمین کنند. برخی از سازمان‌های بزرگ نیز از چندین DC در سایت‌های مختلف زیرساخت خود بهره می‌برند تا احراز هویت کاربران و سایر سیاست‌ها در هر سایت به صورت محلی انجام شود. بنابراین با توجه به این‌که چندین DC در سازمان وجود دارد مهم است که هر DC از آخرین تغییرات ایجاد شده در محیط Active Directory آگاه باشد. به همین منظور با استفاده از Microsoft Directory Replication Service Remote Protocol (MS-DRSR) تمام DC‌های شبکه با Active Directory همگام می‌شوند. به این فرایند Active Directory Replication گفته می‌شود.

معرفی و بررسی حمله‌ی DCSync

DCSync نام تکنیکی است که برای استخراج اطلاعات احراز هویت (شامل نام کاربری و NTLM متناظر با آن) از DC‌ها کاربرد دارد. ساختار کلی این حمله به این صورت است که یک DC جعلی را به AD اضافه کرده و سپس با بهره‌گیری از فرآیند Active Directory Replication برای همگام‌سازی DC جعلی خود با Active Directory بهره می‌بریم. به عبارت دیگر در این حمله از پروتکل MS-DRSR و تابع GetNCChanges درخواست Replication به Active Directory ارسال می‌کنیم و در پاسخ به این درخواست، DC اصلی داده‌هایی که شامل NTLM کاربران نیز می‌شود را به ما بر می‌گرداند. این تکنیک در ابزار  Mimikatz  در آگوست 2015 توسط بنجامین دلپی و وینسنت لتوکس اضافه شده است. برای اجرای حمله‌ی DCSync ما به دسترسی‌های زیر بر روی Domain Object نیاز داریم:
  1. Replicating Directory Changes (DS-Replication-Get-Changes)
  2. Replicating Directory Changes All (DS-Replication-Get-Changes-All)
  3. Replicating Directory Changes In Filtered Set (DS-Replication-Get-Changes-In-Filtered-Set) (this one isn’t always needed but we can add it just in case)
به صورت کلی اعضای گروه‌های Administrators، Domain Admins، Enterprise Admins و همین‌طور DC Computer Accounts در Active Directory، به صورت پیش‌فرض دارای دسترسی‌های فوق هستند. اگر می‌خواهید به سرعت هر کاربر دیگری را پیدا کنید که بتواند حمله DCSync را خارج از این مجوزهای پیش‌فرض ذکر شده انجام دهد، اسکریپت PowerShell زیر به شما کمک می‌کند. این اسکریپت همان‌طور که در تصویر زیر مشاهده می‌کنید همه مجوزهای سطح Domain را استخراج کرده و دسترسی‌های پیش‌فرض را Exclude می‌کند.

#Get all permissions in the domain, filtered to the two critical replication permissions represented by their GUIDs

Import-Module ActiveDirectory

cd 'AD:DC=ehsan,DC=local'

$AllReplACLs = (Get-AcL).Access | Where-Object {$_.ObjectType -eq '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2' -or $_.ObjectType -eq '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2'}

#Filter this list to RIDs above 1000 which will exclude well-known Administrator groups

foreach ($ACL in $AllReplACLs)

{

    $user = New-Object System.Security.Principal.NTAccount($ACL.IdentityReference)

    $SID = $user.Translate([System.Security.Principal.SecurityIdentifier])

    $RID = $SID.ToString().Split("-")[7]

    if([int]$RID -gt 1000)

    {

        Write-Host "Permission to Sync AD granted to:" $ACL.IdentityReference

    }

}

  در این مقاله 2 سناریو بررسی خواهد شد: برای انجام حمله‌ي DCSync سناریوهای متعددی وجود دارد که ما در این مقاله 2 سناریوی پرکاربرد را بررسی کرده‌ایم. سناریوی اول: فرض می‌کنیم که Hash  مربوط به یک حساب کاربری عضو گروه Domain Admins را داریم. سناریوی دوم: فرض می‌کنیم یک User Credential داریم که بر روی Domain Object دسترسی WriteDACL را دارد. سناریوی اول در این سناریو فرض می‌کنیم که از قبل به یک حساب کاربری عضو گروه Domain Admins دسترسی پیدا کرده‌ایم. در محیط آزمایشگاهی فرضی ما، مطابق تصویر زیر کاربری به نام Ali.Mohseni وجود دارد که عضو گروه Domain Admins است. بنابراین اکنون می‌توانیم حمله‌ی OverPass-The-Hash را با استفاده از اسکریپت پاورشل Invoke-Mimikatz انجام دهیم و یک کنسول پاورشل جدید با دسترسی کاربر Ali.Mohseni باز کنیم. در کنسول پاورشل جدیدی که باز شده است می‌توانیم با استفاده از اسکریپت Invoke-Mimikatz حمله‌ی DCSync را انجام دهیم. همان‌طور که در تصویر بالا مشاهده می‌کنید توانستیم با موفقیت حمله‌ی DCSync را انجام دهیم و Hash اکانت krbtgt را بدست آوریم. سناریوی دوم فرض می‌کنیم که از قبل پسورد کاربری را به صورت Clear text به دست آورده‌ایم که دسترسی لازم برای انجام WriteDACL را دارد. در محیط آزمایشگاهی ما کاربری به نام Reza.Moradi تعریف شده که همان‌طور که در تصویر زیر مشاهده می‌کنید دسترسی WriteDACL را روی Domain Object دارد. حالا از اسکریپت PowerView برای اعطای حق دسترسی DCSync به کاربر دیگری به نام user.test استفاده خواهیم کرد. در ادامه با استفاده از دستور زیر فرایند Enumerate کردن دسترسی‌های کاربر user.test را انجام داده و مشاهده می‌کنیم که کاربر user.test دسترسی‌های لازم برای DCSync را داراست. در انتها می‌توانیم اسکریپت Invoke-Mimikatz را مانند سناریوی قبل در یک کنسول پاورشل جدید که از طریق تکنیک OverPass-The-Hash با اعتبار کاربر user.test باز می‌کنیم را بارگذاری کرده و حمله‌ی DCSync را با موفقیت انجام دهیم. به این نکته توجه داشته باشید که ابزارهای مختلفی برای اجرای حمله‌ی DCSync وجود دارد. مانند:

Impacket

DSInternals

همچنین شما می‌توانید ابزار مخصوص به خود را برای اجرای این حمله پیاده‌سازی کنید.

شناسایی حمله‌ی DCSync

برای شناسایی حمله‌ی OverPass-The-Hash ، حملات مبتنی بر ACL و حمله‌ی DCSync، نیاز است تا ابتدا یک‌سری تنظیمات بر رویDomain Group Policy  در قسمت Advanced Audit Policy Configuration مطابق گام‌های زیر انجام دهیم.
  1. Login to Domain Controller
  2. Open Group Policy Management Console
  3. Expand the Domain Object
  4. Expand the Group Policy Objects
  5. Right click on the Default Domain Policy and click on Edit (The policy that is applied to all the domain computers. It may differ in your environment)
  6. Follow the below path to enable Audit Logon events. Computer Configuration --> Windows Settings --> Security Settings --> Advanced Audit Policy Configuration --> Audit Policies --> Logon/Logoff --> Audit LogonComputer Configuration --> Windows Settings --> Security Settings --> Advanced Audit Policy Configuration --> Audit Policies --> DS Access --> Audit Directory Service AccessComputer Configuration --> Windows Settings --> Security Settings --> Advanced Audit Policy Configuration --> Audit Policies --> DS Access --> Audit Directory Service Changes
  7. Select "Configure the following audit events:" Checkbox
  8. Select Success & Failure Checkbox
لازم به ذکر است جمع‌آوری لاگ در اینجا با استفاده از ابزار Sysmon انجام خواهد شد. همچنین از سامانه‌ی Splunk و چند درخواست ساده برای تشخیص این تکنیک‌ها استفاده کرده‌ایم که در ادامه شرح داده شده است.

شناسایی OverPass-The-Hash در Splunk

با استفاده از درخواست زیر می‌توان تکنیک OverPass-The-Hash را شناسایی کرد.

index=wineventlog sourcetype="WinEventLog:Security" AND Logon_Type=9 AND EventCode=4624 AND Logon_Process=seclogo | table _time ComputerName Account_Name EventCode Logon_Type Logon_Process

در دستور بالا ما به دنبال EventID 4624 هستیم که حاوی longon_Type 9 و logon_process seclogo است. این EventID  زمانی ایجاد می‌شود که یک Logon Session ایجاد شده باشد.   همین‌طور در زمان اجرای تکنیک OverPass-The-Hash، Mimikatz سعی می‌کند به پراسس Lsass دسترسی پیدا کند. دستور زیر را اجرا کنید تا تشخیص دهید آیا پراسس Lsass با دسترسی‌های خاصی توسط Mimikatz برای استخراج Credentialهای ماشین اجرا شده است؟

index=wineventlog sourcetype="WinEventLog:Microsoft-Windows-Sysmon/Operational" AND  EventCode=10 AND  GrantedAccess IN ("0x143A","0x1010","0x1038") AND TargetImage="C:Windowssystem32lsass.exe" | table _time ComputerName EventCode SourceImage TargetImage GrantedAccess

در ادامه با اسکریپت Get-SysmonAccessMask می‌توانیم متوجه شویم که Mimikatz با چه سطح دسترسی‌هایی بر روی فضای حافظه از پراسس lsass.exe دسترسی گرفته است.

شناسایی حمله‌ی Detect DCSync با Splunk

می‌توانیم با اجرای درخواست زیر حمله‌ی DcSync را شناسایی کنیم.

index=wineventlog sourcetype="wineventlog:security" EventCode=4662 AND Properties="Control Access" AND Message IN (*"1131f6aa-9c07-11d1-f79f-00c04fc2dcd2"*,*"1131f6ad-9c07-11d1-f79f-00c04fc2dcd2"*,*"89e95b76-444d-4c62-991a-0facbeda640c"*)

GUID‌هایی که در دستور بالا فیلتر کرده‌ایم درواقع GUIDهای مربوط به دسترسی‌های Replication هستند که برای اجرای حمله‌ی DCSync مورد نیاز هستند.

Detect ACL Modification:

همچنین می‌توانیم از درخواست زیر برای شناسایی تغییرات ACL که برای کاربر user.test توسط اکانت کاربری Reza.Moradi انجام شده است، استفاده کنیم. همچنین می‌توان مقدار NtSecurityDescriptor را با استفاده از دستور ConvertFrom-SddlString در پاورشل به اصطلاح ترجمه کرد تا جزییات بیشتری را بدست آوریم. یک نکته‌ی مهم این که دستور ذکر شده نمی‌تواند دسترسی‌های مورد نیاز Replication را به صورت مستقیم به ما نمایش دهد. در واقع مانند شکل زیر، در خروجی این دستور همواره مقدار WriteAttributes را مشاهده می‌کنیم.

منابع:

احسان مقدمیان

نویسنده و مترجم مقاله Linkedin