چگونه با استفاده از ZIP BOM ها از وبسایت مان دفاع کنیم
روشهای خوب قدیمی که هنوز جواب می دهند
اگر تا حالا یک وبسایت را میزبانی کرده باشید یا اینکه حتی یکبار یک سرور را مدیریت کرده باشید خوب می دانید آدم بدهایی هستن که میخوان بلا سر سایتتان بیاورند.
خود من اولین باری که تو 13 سالگی یه هاست لینوکس با دسترسی SSH رو بالا آوردم قشنگ یادمه. می نشستم و هر روز لاگ ها و IP های مهاجم رو چک می کردم! یادمه اغلب از چین و روسیه بودن. خیلی علاقه داشتن یه جوری به سرورم وصل بشن، خیلی!
در واقع وقتی یک سرور لینوکس با دسترسی SSH دارید، یعنی از بیرون دیده می شه. پس باید یه جوری آمار درخواست اتصال ها به سرورتان را چک کنید:
grep 'authentication failures' /var/log/auth.log
دستور بالا اولین کاریه که می تونید برای این موضوع انجام بدین. خروجیش رو ببینید:
همانطور که در تصویر می بینید، صدها لاگین ناموفق با اینکه این سرور احراز هویت با رمز عبور رو غیرفعال کرده اما روی یک پورت غیر استاندارد تنظیم شده اند.
وردپرس دوست داشتنی، همه ما رو بیچاره کرده!
باشه باشه…قبول داریم اسکنر نقاط ضعف قبل از وردپرس هم وجود داشته اما از اونجایی که وردپرس دیگه شورش رو درآورده و تو همه دنیا گسترده شده، اسکنرهای نقاط ضعف به یکسری اسکن مخصوص فولدرهای wp-admin یا پلاگین های patch نشده اش مجهز شده اند.
بنابراین اگه یه گروه هک جدید و کوچک بخواد واسه خودش اعتباری دست و پا کنه، یکی از این اسکنرها رو دانلود میکنه و شروع میکنه به تست، یه عالمه وبسایت به امید اینکه بتونه بهش دسترسی پیدا کنه و دیفیسش کنه.
نمونه ای از لاگ تولید شده توسط اسکنری بنام Nikto.
به خاطر همینه که همه ادمین های سایت یا سرور، مجبورن با لاگ هایی در حدود گیگابایت سر و کله بزنن که پر هستن از لاگین های ناموفق. پس این فکر به سرمون زد که:
آیا راهی برای مقابله هست؟
پس از راهکارهایی نظیر IDS و Fail2ban، ما به شما راه قدیمی ZIP BOM رو پیشنهاد می کنیم.
ZIP BOM چیست؟
داریم می رسیم به جاهای جالبش، به نظر می رسه که فشرده سازی به روش زیپ واسه داده های تکراری خیلی خوبه پس اگه یه فایل متنی بشدت حجیم داشته باشین که شامل داده های تکراری باشه، مثلا همش صفر باشه، این روش عالی فشردش می کنه. یعنی جدا خوب فشرده میکنه.
کما اینکه فایل 42.zip که نمونه ماست شون میده، روش زیپ میتونه 4.5 پتا بایت معادل 4،500،000 گیگابایت رو به 42 کیلو بایت فشرده کنه. اگه سعی کنین محتوای چنین فایلی رو ببینید (از حالت فشرده خارج کنید) به احتمال قوی فضا کم خواهید آورد.
چگونه می توانم یک اسکنر ناقص را بمب گذاری کنم؟
متاسفانه مرورگرهای وب روش ZIP رو نمیفهمن ولی GZIP رو میفهمن. گام اول باید یک فایل GZIP 10 گیگابایتی حاوی 0 بسازیم. میتونیم فشرده سازی چند لایه هم داشته باشیم اما الان راه ساده تر رو پیش میگیریم:
dd if=/dev/zero bs=1M count=10240 | gzip > 10G.gzip
ساخت بمب و بررسی حجم
همانطور که می بینید اندازش حدود 10 مگابایت شد. میتونستیم فشرده ترش کنیم ولی فعلا کافیه.
حالا که این فایلو ساختیم، بیایم یه فایل PHP بسازیم که بفرستیمش رو یک کلاینت.
<?php //prepare the client to recieve GZIP data. This will not be suspicious //since most web servers use GZIP by default header("Content-Encoding: gzip"); header("Content-Length: ".filesize('10G.gzip')); //Turn off output buffering if (ob_get_level()) ob_end_clean(); //send the gzipped file to the client readfile('10G.gzip');
همین! پس می تونیم بشکل زیر یک تاکتیک دفاعی جالب درست کنیم:
<?php $agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT'); //check for nikto, sql map or "bad" subfolders which only exist on wordpress if (strpos($agent, 'nikto') !== false || strpos($agent, 'sqlmap') !== false || startswith($url,'wp-') || startswith($url,'wordpress') || startswith($url,'wp/')) { sendBomb(); exit(); } function sendBomb(){ //prepare the client to recieve GZIP data. This will not be suspicious //since most web servers use GZIP by default header("Content-Encoding: gzip"); header("Content-Length: ".filesize('10G.gzip')); //Turn off output buffering if (ob_get_level()) ob_end_clean(); //send the gzipped file to the client readfile('10G.gzip'); } function startsWith($a, $b) { return strpos($a, $b) === 0; }
این اسکریپت قطعاً حلال همه مشکلات نیست اما می تونه با تغییر user agent از ما در مقابل مهاجمین حفاظت کند.
حالا بیاین ببینینم وقتی اسکریپت فراخوانی میشه چه اتفاقی میوفته؟
نتیجه | مرورگر |
IE 11 | مصرف حافظه بشدت بالا میره، IE هنگ میکنه |
Chrome | مصرف حافظه بالا میره و خطا میده |
Edge | مصرف حافظه بالا میره بعد قاطی میکنه و در حالت لود شدن گیر میکنه |
Nikto | بنظر میاد درست اسکن میکنه اما خروجی نشون نمیده |
SQLmap | مصرف حافظه اونقدر بالا میره که هنگ میکنه |
Safari | مصرف حافظه بشدت بالا میره بعد هنگ میکنه و بسته میشه سپس دوباره بالا میاد، حافظه میره بالا، کرش میکنه و … |
Chrome (Android) | حافظه میره بالا و خطا میده |