بررسی آسیب‌پذیری portmapper و نحوه امن‌سازی آن

برای بررسی آسیب­ پذیری portmapper باید ابتدا مفهوم RPC (Remote Procedure Call) بیان شود.

RPC پروتکلی است که توسط آن یک برنامه می­تواند از یک برنامه موجود در یک سیستم دیگر که در شبکه قرار دارد، درخواست سرویس نماید بدون آن‌که نیاز به دانستن جزئیات شبکه داشته باشد. RPC از مدل کلاینت-سرور استفاده می­کند. برنامه­ای که درخواست سرویس می­دهد، کلاینت و برنامه­ای که در طرف دیگر به این درخواست پاسخ می­دهد و سرویس مورد نظر را فراهم می­کند، سرور می­باشد. RPC همانند یک روند فراخوانی معمولی، عملیاتی سنکرون می­باشد بدین معنی که برنامه­ای که درخواست سرویس می­دهد باید تا بازگشت نتیجه از سرور راه دور، به صورت معطل باقی بماند. البته استفاده از پردازنده­هایی که یک فضای آدرس مشابه از حافظه را به اشتراک می­گذارند، موجب می­شود که چندین RPC بتوانند به طور همزمان اجرا شوند.

بر اساس مدل OSI، RPC یک پروتکل لایه کاربرد (و نه پروتکل لایه انتقال) می­باشد. البته RPC از ویژگی­های ارتباطی موجود در لایه انتقال نیز استفاده می­کند. با استفاده از RPC می­توان برنامه­های کاربردی که شامل چندین برنامه توزیع­شده در سطح شبکه می­باشند را به آسانی تولید کرد. در سرورهایی که دارای سیستم­عامل­های مبتنی بر Unix می­باشند، برنامه­هایی مانند lock manager، NFS daemons و license manager ها از RPC استفاده می­کنند. همچنین اکسپلویت­های بسیاری برای آن وجود دارد و هر روز هم به تعداد آن­ها افزوده می­شود. اولین گام برای بهره‌برداری و سوء استفاده از یک سرویس آن است که ابتدا تشخیص داده شود که سرویس بر روی سیستم هدف در حال اجرا می­باشد. در این مرحله portmapper و rpcbind و پورت شناخته شده 111 نیز وارد ماجرا می­شوند.

Portmapper و rpcbind

portmapper یک برنامه RPC و شماره نسخه آن را به یک شماره پورت خاص در لایه انتقال نگاشت می­کند. portmapper برای ثبت یک RPC از شناسه­هایی مانند شماره سرویس RPC، شماره نسخه، پروتکل مورد استفاده و پورت TCP یا UDP استفاده می­کند. portmapper امکان نگاشت برنامه­های راه دور را به صورت پویا فراهم می­کند. همچنین portmapper همیشه بر روی پورت 111 پروتکل TCP یا UDP اجرا می­شود. برنامه‌هایی که در مکانیزم RPC به عنوان سرور عمل می­کنند، از پورت­های ناشناخته و موقتی استفاده می­کنند و بنابراین کلاینت­ها برای برقراری ارتباط با این برنامه­ها نیاز به دانستن یک شماره پورت شناخته شده از طرف آن­ها دارند تا بتوانند ارتباط برقرار کنند. بنابراین زمانی که یک کلاینت بخواهد به سرویسی دسترسی داشته باشد، باید ابتدا با portmapper ارتباط برقرار کند و پس از آن portmapper شماره پورت مورد نظر برای دسترسی کلاینت به سرویس مورد درخواست را در اختیارش قرار می­دهد. بنابراین دسترسی به پورت 111 به برنامه­هایی که به عنوان کلاینت عمل می­کنند اجازه می­دهد تا بتوانند پورت­های ناشناخته­ای که توسط سرور تعریف شده است را تشخیص دهند. اگر portmapper وجود نداشته باشد یا در دسترس نباشد، درخواست کلاینت رد می­شود.

متاسفانه RPC امنیت بسیار پائینی دارد. ضمناً به این دلیل که سرویس­های مبتنی بر RPC برای برقراری ارتباط نیاز به rpcbind دارند، باید قبل از شروع سرویس­های مورد نظر، ابتدا rpcbind در دسترس باشد.

زمانی که یک کلاینت از طریق مکانیزم RPC یک شماره برنامه را فراخوانی می­کند، ابتدا به منظور تشخیص آدرسی که باید درخواست RPC را به آن ارسال کند، به rpcbind متصل می­شود. اگر پورت 111 فعال باشد، لیستی از تمام سرویس­های فعال مهیا بوده و به این ترتیب می­تواند آدرسی که کلاینت باید به آن متصل شود را در اختیارش قرار دهد. البته در بعضی از نسخه­های Unix و Solaris، rpcbind نه تنها به پورت 111 از نوع TCP و UDP گوش می­کند، بلکه به پورت­های UDP بزرگتر از 32770 نیز گوش می­دهد. شماره­های دقیق پورت­ها به ساختار سیستم­عامل و نسخه آن بستگی دارد. بنابراین تجهیزات فیلترینگ و ACL های استفاده شده در روترها و فایروال­ها که برای عدم دسترسی به rpcbind یا portmapper بر روی شماره پورت 111 تنظیم شده­اند، می‌توانند با ارسال یک درخواست UDP به rpcbind و به شماره پورت­های بالاتر از 32770 دور زده شوند. کاربران غیرمجاز با سوء استفاده از این آسیب­پذیری می‌توانند اطلاعات RPC یک سیستم راه دور را به‌دست آورند (حتی در صورتی که پورت 111 مسدود شده باشد).

با توجه به اطلاعات RPC که از طریق پورت 111 به‌دست می­آید، می­توان فهمید که چه سرویس­هایی در حال اجرا می­باشند. در این رابطه تعداد زیادی آسیب­پذیری وجود دارد که اکسپلویت­های مرتبط با آن­ها هم قابل دسترسی است. بر روی سیستم­هایی که به طور کامل از آن­ها محافظت نمی­شود و portmapper بر روی آن­ها درحال اجراست، با اجرای یک دستور ساده rpcinfo می­توان لیستی از تمام سرویس­هایی که در حال اجرا می‌باشند را به‌دست آورد.

نحوه امن­ سازی portmapper

نحوه احراز اصالت در portmapper ضعیف می­باشد و به دلیل اینکه portmapper می­تواند تعداد زیادی از شماره پورت­ها را به سرویس­های تحت کنترلش اختصاص دهد، امن­سازی آن مشکل می­باشد. به هر حال، اگر سرویس RPC در حال اجرا می­باشد می­توان مراحل زیر را انجام داد:

امن ­سازی portmapper با استفاده از TCP Wrappers

با استفاده از TCP Wrappers می­توان تعیین کرد که کدام شبکه­ها و یا سیستم­ها مجاز به دسترسی به سرویس portmap می­باشند. بنابراین هنگامی که قصد محدود کردن دسترسی به سرویس وجود داشته باشد، باید فقط از آدرس­های IP استفاده کرد و نباید از نام سیستم (hostname) در این حالت استفاده شود، چون نام­ها می­توانند با حملاتی مانند DNS poisoning و یا مشابه آن جعل شوند.

امن ­سازی portmapper با استفاده از IPTables

برای محدود کردن دسترسی به سرویس portmap به یک شبکه خاص، می‌توان rule های زیر را به iptables اضافه کرد. در این دو rule فقط به درخواست­­های اتصال TCP برای سرویس portmap از طرف شبکه­های 192.168.0.0/24 و localhost اجازه داده شده و بقیه بسته­ها drop می‌شوند:

iptables -A INPUT -p tcp -s! 192.168.0.0/24 –dport 111 -j DROP

iptables -A INPUT -p tcp -s 127.0.0.1 –dport 111 -j ACCEPT

برای محدود کردن ترافیک UDP نیز می‌توان از دستور زیر استفاده کرد:smile icon

iptables -A INPUT -p udp -s! 192.168.0.0/24 –dport 111 -j DROP

دیدگاه

آدرس ایمیل شما منتشر نخواهد شد.