ایجاد دسترسی با استفاده از Named Pipes
مقدمه
در بسیاری از موارد، زمانیکه تیم ارزیابی امنیتی و تست نفوذپذیری در سازمانهای مختلف برای گرفتن دسترسی از سیستم هدف تلاش می نمایند، با مکانیزمهای دفاعی و کنترل های امنیتی بکارگرفته شده توسط سازمان برای دفع حملات برخورد می کنند. در این مقاله ضمن معرفی مفهوم Named Pipe، یکی از روشهایی را معرفی خواهیم نمود که توسط تیم تست نفوذ آشنا ایمن به منظور دور زدن برخی از این قبیل محدودیت ها و مکانیزمهای دفاعی استفاده میشود.
در این سناریو سیستم هدف در معرض ریسک امنیتی بوده است. یکی از دلایلی که این روش توانایی دور زدن مکانیزمهای دفاعی را دارا میباشد، مخفیانه بودن این روش میباشد. دو دلیل مهم برای اثبات این موضوع وجود دارد:
- عدم ایجاد حساسیت برای فایروال ویندوز بمنظور ایجاد اتصال سوکت TCP جدید به این خاطر که این روش به هیچ وجه به سوکت TCP جدیدی وصل نمیشود!
- این روش از راهکار انتقال داده استفاده میکند، بنابراین ترافیک چندان مهمی از این طریق ایجاد نمیشود.
آنالیز رفتار فایروال
در ویندوز، زمانی که سعی در Bind کردن یک سوکت TCP دارید، فایروال از شما برای ادامه این روند درخواست دسترسی و مجاز دانستن این عمل را دارد. علاوه بر این برای اضافه کردن این rule امنیتی و ایجاد دسترسی نیازمند سطح دسترسی کاربر Administrator خواهید بود که در این حالت در یک سازمان فرضی میتوان گفت غیرممکن است، پس بنابراین حمله شما موفقیت آمیز نخواهد بود.
پس اینجا به این سوال میرسیم که چطور میتوانیم این محدودیت را دور بزنیم؟ جواب سوال بسیار آسان است. بیاید از چیزی استفاده کنیم که از قبل برایش مجوزهای لازم صادر شده، در اینجا موضوع SMB Inboud به میان می آید. همانطور که مشخص است بنابراین اگر عملکردی وجود داشته باشد که بتوانیم از آن برای ارتباطهای خارجی استفاده شود، میتوانیم از آن برای سوءاستفاده و ایجاد دسترسی برای خودمان استفاده کنیم. در این حالت باید از Named Pipeها استفاده کنیم.
Named Pipes چیست
اگر یک سری به وبسایت Microsoft Developer Network بزنیم، خواهیم دید که Named Pipeها به عنوان راه ارتباطی یک طرف یا دوطرفه با سرور و یا کلاینت مورد استفاده قرار میگیرند. این دقیقا همان چیزی است که ما رو به هدفمان میرساند.
به طور پیش فرض، امکان کنترل یک سیستم با استفاده از Named Pipeها وجود ندارد، اما APIهای مختلفی در ویندوز برای این منظور به ما کمک میکنند. API Callهایی مانند ConnectNamedPipe و CreatNamedPipe.
کدنویسی Named Pipe برای Bind Shell
برای این بخش ما نیازمند مقداری کدنویسی هستیم تا بتونیم برای ارتباط و اجرای دستورات مدنظرمان از Named Pipeها استفاده کنیم. برای این کار باید هر دو طرف Client و Server را در نظر بگیریم و اقدام به نوشتن چند خط کد برای هدفمان کنیم.
در دو عکس زیر قسمتی از کدهای سمت کلاینت و سرور را مشاهده میکنید که البته این کدها به صورت کامل در انتهای پست در دسترس میباشد.
نمونه کد سمت سرور
نمونه کد سمت کلاینت
سناریو به این صورت است که بعد از ریسک امنیتی که برای هدف ما به وجود آمده ولی راهکار مناسبی برای گرفتن شل از آن نداریم و نمیتوانیم به مجوزهای صادر شده در فایروال اتکا کنیم ( بخاطر کمبود سطح دسترسی ) میتوانیم با compile کردن هر دو پروژه ( که کد آن در انتهای پست به صورت کامل قرار داده شده است ) و اجرای فایل سمت سرور از هر روش persistence مثل User-Level مانند رجیستری HKCU برای spawn کردن خودش استفاده خواهد کرد و بعد از آن به وسیله اجرای کد سمت کلاینت به آن وصل شده و دسترسی حاصل شده است.


خب همانطور که انتظار میرود، اجرای فایل سمت سرور به هیچ وجه باعث حساسیت فایروال و مکانیزم دفاعی نمیشود، به این دلیل که ما در این روش از پورت SMB استفاده میکنیم که به طور پیش فرض مجاز است.
استفاده این مطلب برای بحث SOC هم میتواند حائز اهمیت و جالب باشد.
برای استفاده از این روش و کدهای مورد استفاده شده می توانید از github استفاده کنید.