Geek

روز نوشت هایی در مورد امنیت

Geek

روز نوشت هایی در مورد امنیت

پیوندهای روزانه

در این پست ، تولید پکت با مقادیر تصادفی در Scapy را بررسی می کنیم. این مقادیر تصادفی در نهایت میتواند منجر به ایجاد یک fuzzer خیلی ساده شوند. اصولا fuzzer در ساده ترین حالت خود ، تنها اقدام به ارسال مقادیر تصادفی میکند اما یک fuzzer خوب باید امکاناتی برای اتصال به debugger ها داشته باشد تا بعدا بتوان داده ارسالی که منجر به کرش یا خرابی شده است را شناسایی کرد .در Scapy چندین تابع برای تولید مقادیر تصادفی در رنج های مختلف وجود دارند که مهمترین این توابع عبارتند از :


RandNum()
RandShort()
RandInt()
RandLong()
RandString()
RandIP()
RandMAC()



برای پیدا کردن لیست کامل این توابع میتوانید به فایل volatile.py در سورس کد Scapy مراجعه کنید. اگر از تابع fuzz() در scapy استفاده کنید ، مقادیر فیلدها به صورت خودکار شناسایی شده و با تابع مناسب جایگزین میشوند اما مشکلی که راجع به این تابع وجود دارد که گاهی نمیتواند نوع مقادیر یک فیلد را درست شناسایی کند و در نتیجه خطا برگرداننده می شود. به مثال زیر دقت کنید.

>>> p1= IP(src='192.168.0.100',dst='192.168.0.101')/OSPF_Hdr(src='192.168.0.100')/
OSPF_LSUpd(lsacount=1)/fuzz(OSPF_Router_LSA(flags=0))


اگر دستور بالا را اجرا کنیم آنگاه یک بسته OSPF تولید خواهد شد که مقادیر LSA Router آن تصادفی خواهند بود. ( به جز فیلد Flags ) . حال اگر دستور بالا را به صورت زیر وارد کنیم و بخواهیم که تمامی فیلدهای آن تصادفی باشند آنگاه با خطا مواجه خواهیم شد چرا که Scapy قادر به مقدار دهی تصادفی مناسب به فیلد Flags نیست و در نتیجه خطا برگردانند می شود.

>>> p1= IP(src='192.168.0.100',dst='192.168.0.101')/OSPF_Hdr(src='192.168.0.100')/
OSPF_LSUpd(lsacount=1)/fuzz(OSPF_Router_LSA())


در نتیجه بهتر است به جای اینکه از تابع fuzz استفاده کنیم ، فیلدهایی که به نظر میرسند دچار مشکل شوند را با تابع تصادفی مناسب ، به صورت دستی مقدار دهی کنید تا fuzzer بهتری داشته باشید. حال به نحوه استفاده از توابع ذکر شده ، در مقداردهی به فیلدهای پکت می پردازیم . همان طور که در شکل قبل توضیح داده شد ، فیلد Length  مربوط LSA Router را برابر 0 قرار دادیم . حال میتوانیم مقادیر تصادفی دلخواه را جایگزین کنیم تا نتیجه را ببینم . به عنوان مثال در فیلد length از تابع RandNum به صورت زیر استفاده کنیم.




که مقادیر تصادفی بین 0 تا 5 تولید می شود. سپس با دستور sendp شروع به ارسال پکت ها میکنیم

sendp(p1,loop=10)

دستور بالا باعث می شود تا پکت های زیادی تولید و ارسال شوند با این خصوصیت که مقدار فیلد len  که در تصویر بالا مشخص شده است به صورت تصادفی مقادیری بین 0 تا 5 را در درون هر بسته قرار میگرد.میتوانیم این رنج را گسترش دهیم تا مقادیر زیادی آزمایش شوند. برای اینکه بتوانید وضعیت یک پکت را ببینید که فیلدهای آن چه مقداری دارند از دستور زیر استفاده کنید.

p1.show()
نکته دیگری که وجود دارد انواع تولید پکت OSPF است که در scapy می توانید به صورت زیر عمل کنید. دستور زیر را وارد کنید تا لیست پروتکل ها و بسته هایی که در آن ها میتوانند قرار بگیرند را مشاهده کنید.

ls()

تصویر زیر لیست تمام پکت هایی است که برای OSPF می تواند تولید شوند و خروجی دستور بالا است



با دستوری مانند زیر نیز میتوانید محتویات یک تابع خاص از یک پکت را ببینید . مثلا OSPF_LSUpd از پکت p1

P1[OSPF_LSUpd].command()
خروجی آن شبیه به شکل زیر خواهد بود



حال اگر بخواهیم بسته جدیدی LSA جدیدی مثلا OSPF Summary LSA را به این پکت اضافه کنیم کافی است از لیست ذکر شده در بالا ، OSPF_SummaryIP_LSA را به پکت اضافه کنیم و فیلدهای آن را نیز مقدار دهی کنیم . و هر فیلد را با توجه به نوع مقادیر آن تصادفی ایجاد کنید تا پروتکل کامل آزمایش شود.
مشاهده کردید که Scapy یک چارچوب بسیار قدرتمند برای ما ایجاد میکند تا با آن یک fuzzer ابتدایی ایجاد کنیم . حال میتوانید این فریم ورک را در برنامه های پایتون خود import کنید و شروع به نوشتن یک fuzzer پیشرفته تر کنید .
موافقین ۰ مخالفین ۰ ۹۳/۰۴/۲۷

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی