فازینگ بازگشتی ساختارهای MS-RPC با مانیتورینگ ETW
خلاصهٔ کاملتر
ابزار MS-RPC-Fuzzer با دو بهبود اساسی بهروز شده: پشتیبانی از فازینگ بازگشتی ساختارهای تودرتو و لاگگیری از طریق ETW (Event Tracing for Windows) بدون نیاز به ProcMon. علاوه بر این، پشتیبانی از نوع Union (با فیلدهای Arm_N) هم اضافه شده. یکی از نتایج جالب این بهروزرسانی، کشف یک رویهی RPC بود که از طریق ورودی کاربر، یک DLL را روی دیسک بهعنوان System بارگذاری میکرد — یک یافتهی امنیتی قابلتوجه.
در MS-RPC، ساختارها (Structures) واحدهای دادهای مرکّبی هستن که چندین فیلد با نوعهای مختلف رو در قالب یه واحد واحد کنار هم قرار میدن. فازر قدیمی میتونست ساختارهای تخت (flat) رو با reflection پر کنه، اما مشکل اینجا بود که هر فیلد خودش میتونست یه ساختار دیگه باشه که همین کار رو میخواست — و این ممکن بود چندین سطح عمق داشته باشه.
کتابخانهی NtObjectManager دو نوع فیلد تودرتو داره: embedded fields که بهصورت مستقیم بهعنوان value type ظاهر میشن، و pointer fields که در قالب NdrEmbeddedPointer wrapping شدن. راهحل با سه تابع همکار در PowerShell پیادهسازی شده.
تابع اصلی New-FuzzedInstance هست که یه instance خالی از نوع داده میسازه، بعد روی تمام فیلدهای public تکرار میکنه و برای هر کدوم از Get-FuzzFieldValue میخواد که یه مقدار fuzz تولید کنه. برای جلوگیری از بازگشت بینهایت، دو مکانیزم وجود داره: یه عمقسنج (cap روی ۸) و یه مجموعهی بازدیدشدهها — اگه نوعی قبلاً در زنجیرهی فعلی دیده شده باشه، بهجای بازگشت مجدد، نمونهی خالی برمیگردونه:
function New-FuzzedInstance {
...
$typeName = $Type.FullName
if ($Depth -gt 8 -or $Visited -contains $typeName) {
try { return [System.Activator]::CreateInstance($Type) } catch { return $null }
}
$Visited = $Visited + $typeName
$instance = [System.Activator]::CreateInstance($Type)
$fields = @($Type.GetFields([System.Reflection.BindingFlags]'Public,Instance'))
for ($i = 0; $i -lt $fields.Count; $i++) {
$value = Get-FuzzFieldValue -Type $fields[$i].FieldType ...
$fields[$i].SetValue($instance, $value)
}
return $instance
}تابع Get-FuzzFieldValue نقش لایهی مسیریابی رو داره: اگه نوع فیلد یه NdrEmbeddedPointer باشه، از op_Implicit برای wrapping استفاده میکنه؛ اگه یه ساختار تودرتو باشه، بازگشتی New-FuzzedInstance رو صدا میزنه؛ و برای انواع ساده (عدد، رشته و...) مستقیم مقدار fuzz تولید میکنه. قابلیت پشتیبانی از Union هم اضافه شده: وقتی فیلدهایی با الگوی Arm_N دیده میشن، فازر بهصورت تصادفی یکی از armها رو انتخاب و پر میکنه.
بهبود دوم، جایگزین کردن ProcMon با ETW برای مانیتورینگ هست. ETW یه مکانیزم داخلی ویندوز برای ثبت رویدادهاست که بدون نیاز به ابزار خارجی کار میکنه و overhead کمتری داره. با این روش میشه رویدادهایی مثل بارگذاری فایل، دسترسی به رجیستری و اجرای پروسه رو مستقیم از kernel دریافت کرد.
نکات کلیدی:
- فازینگ بازگشتی ساختارهای تودرتو در MS-RPC با مکانیزم جلوگیری از حلقههای بینهایت پیادهسازی شد
- دو نوع فیلد تودرتو پشتیبانی میشه: embedded (value type) و pointer (NdrEmbeddedPointer)
- پشتیبانی از Union type با انتخاب تصادفی arm اضافه شد
- لاگگیری از طریق ETW جایگزین ProcMon شد و به ابزار خارجی نیاز نداره
- نتیجهی عملی: کشف یک رویهی RPC که DLL دلخواه کاربر رو بهعنوان System بارگذاری میکرد




