هنگام پاکسازی وب سایت ها، یکی از پیچیده ترین بخش های کار ما حصول اطمینان از پیدا کردن همه backdoor هاست. اغلب مواقع، مهاجمان به مکان های مختلف سایت کد تزریق می کنند تا احتمال نفوذ دوباره به سایت را بالا برده و تا حد ممکن دسترسی به سایت را حفظ کنند. تحقیقات نشان می دهد که در 67 درصد از وب سایت هایی که پاکسازی می کنیم، حداقل یک نوع backdoor وجود دارد.
اگرچه، ما صدها مطلب در مورد Backdoor ها و تاثیرات آنها داریم ، امروز قصد داریم در مورد چند تکنیک بحث کنیم و اطلاعاتی جامع و فنی در مورد چگونگی رمزگشایی نرم افزارهای مخرب پیشرفته ارائه دهیم.
این نوع خاص از آلودگی، جدید نیست، اما طی چند ماه گذشته، شاهد افزایش حملات از این نوع، برعلیه وب سایت های مبتنی بر وردپرس و جوملا هستیم!
تروجان
پس از به خطر افتادن یک وب سایت، مهاجمان ممکن است در این وب سایت Back Door ، Shell های وب ، کاربران مدیر جعلی و امثال این موارد را ایجاد کنند. یکی از ویژگی های رایج این دسته از حملات این است که در آن ها از یک یا چند تکنیک زیر برای مخفی سازی کد، رمزگذاری، رمزگشایی و ابهام زدایی استفاده می شود.
در بخش زیر، مهاجمان تقریبا هر سه تکنیک را استفاده کردند. بیایید قدم به قدم با این فرآیند پیش برویم و آن را رمزگشایی کنیم.
ساده سازی کد
این نکته بسیار اهمیت دارد که هنگام رمزگشایی، تصویری منطقی از کد داشته باشید. برای این منظور، از PHP Beautifier کمک گرفتیم و کد قبلی را به این کد تبدیل کردیم:
اگر چه کد هنوز قابل خواندن نیست، اما اکنون دارای یک ساختار برنامه ریزی منطقی است که به ما امکان ادامه کار را می دهد.
مهاجمان کار خود را با تعریف یک متغیر با نام $ hc7e1d20 شروع کردند که عمدتا این نام گذاری هیچ هدف خاصی ندارد. تجربه به ما ثابت کرده است، شماره اختصاص داده شده به این متغیر (406) ممکن است راهی برای مهاجمین برای شناسایی تغییرات مخرب از همان نوع باشد.
<?php $hc7e1d20 = 406; $GLOBALS['be10eb436'] = Array(); global $be10eb436; $be10eb436 = $GLOBALS
ما در طول کد، به چند متغیر عمومی بر میخوریم که برای درک کد ضروری نیستند. و در نهایت از آنها خلاص خواهیم شد.
اساسا بدافزار به تکنیک های دستکاری کاراکتر / رشته متکی است که در آن مهاجمان کاراکترهای هگزادسیمال را در یک متغیر قرار می دهند و سپس آن را با متغیرهای مختلف جمع می کنند.
اولین مورد چنین است:
${"\x47\x4c\x4fB\x41\x4c\x53"}['tbb6a'] ="\x2d\x3d\x3e\x35\x4e\x73\x7d\x4f\x65\x77\x59\x41\x5f\x70\x6a \x69\x23\x3b\x51\x21\x57\x74\x4b\x46\xd\x5b\x2b\x20\x38\x76\x68\x2e\x3f \x44\x4d\x34\x67\x6f\x6b\x7c\x64\x7a\x31\x24\x5c\x4c\x40\x3c\x28\x5a\x79 \x2a\x58\x78\x7e\x6c\x63\x43\x71\x49\x33\x47\x54\x36\x53\x75\x27\x5e\x29 \x56\x66\x26\x32\x2c\x62\x30\x2f\x6e\xa\x50\x22\x25\x52\x5d\x45\x60\x42 \x48\x39\x61\x37\x7b\x4a\x9\x55\x3a\x6d\x72";
این قطعه کد را می توان به راحتی با استفاده از یکی از فرمان های زیر ترجمه کرد:
$ echo -e "\x47\x4c\x4fB\x41\x4c\x53" GLOBALS $ php -r 'echo "\x47\x4c\x4fB\x41\x4c\x53";' GLOBALS
مقدار داخل متغیر $ {GLOBALS} [‘tbb6a’] دارای برخی از کاراکترهای خاص است که ممکن است روند ترجمه را مختل کند، اما این کاراکترها در نهایت توسط بدافزار مورد استفاده قرار نمی گیرند. در حال حاضر، ما می توانیم یک اسکریپت ساده PHP ایجاد کنیم که وارد هر رشته شده و ارزش متناظر آن را چاپ می کند.
جستجو و جایگزینی
با در دست داشتن این فهرست و اطلاعات ، می توانیم با ویژگی Find & Replace بازی کنیم.
اولین متغیر:
$be10eb436[$be10eb436['tbb6a'][55] . $be10eb436['tbb6a'][75] . $be10eb436['tbb6a'][8] . $be10eb436['tbb6a'][63]] = $be10eb436['tbb6a'][56] .$be10eb436['tbb6a'][30] . $be10eb436['tbb6a'][97]; $be10eb436['tbb6a'][55] = ‘l’ $be10eb436['tbb6a'][75] = ‘0’ $be10eb436['tbb6a'][8] = ‘e’ $be10eb436['tbb6a'][63]] = ‘6’ $be10eb436['tbb6a'][56] = ‘c’ $be10eb436['tbb6a'][30] = ‘h’ $be10eb436['tbb6a'][97] = ‘r’
همه اینها به چنین متنی ترجمه می شود:
$be10eb436[‘l . ‘0’ . ‘e’ . ‘6’] = ‘c’ . ‘h’ . ‘r’; ---- $be10eb436[‘l0e6’] = ‘chr’;
برای هرچه واضح تر کردن کد، می توانیم be10eb436 را به arr تغییر نام دهیم و به عنوان آرایه آن را تعریف کنیم؛ و به ترجمه بقیه کارکاتر ها ادامه دهیم.
پس از چند دقیقه، ما به یک کد با فرمت خاص دست خواهیم یافت:
حال همه چیز برای ما خیلی واضح تر می شود، بنابراین می توانیم تنظیمات بیشتری انجام دهیم.
چند متغیر اول زیر می تواند به راحتی جایگزین شود.
$arr['l0e6'] = ‘chr’; $arr['ac6c24d1'] = ‘ord’; $arr['s8bb921e'] = ‘strlen’;
وقتی هر کدام را در جای خود قرار دهید اولین تابع ظاهری شبیه زیر پیدا می کند:
function l3f5($nd0f2d, $yaf8a49ab) { global $arr; $wb1a = ""; for ($a5be536 = 0; $a5be536 < strlen($nd0f2d);) { for ($jd82720f = 0; $jd82720f < strlen($yaf8a49ab) && $a5be536 < $arr['s8bb921e']($nd0f2d); $jd82720f++,$a5be536++) { $wb1a.= chr(ord($nd0f2d[$a5be536]) ^ ord($yaf8a49ab[$jd82720f])); } } return $wb1a; }
اهداف مخرب
پس از جایگزینی تمام توابع و متغیرها، به کد زیر می رسیم که به آسانی قابل درک است.
نقاط مورد نظر در کد کامل مخرب عبارتند از:
- یک تابع به نام l3f5() مسئول انجام رمزگذاری و رمزگشایی از طریق عملیات بیتی (XOR) است؛
- تابع q057860() دو سطح از رمزنگاری / رمزگشایی XOR را اعمال می کند.
- کلید سطح اول یک متغیر از پیش تعریف شده ثابت است ($w158 = ‘2cef0f87-62fe-4bb9-a1de-4dc009e818ea’;)
- کلید سطح دوم از هر دو پارامتر POST یا کوکی های HTTP می آید.
- این تابع برای رمزگشایی داده های سریالی رمزگذاری شده است که مهاجمان از طریق کوکی یا پارامترهای POST به اسکریپت ارسال می کنند.
- داده های رمز گشایی شده می تواند شامل موارد زیر باشد:
- کد اجرایی PHP، یا
- دستوری برای ارائه اطلاعات در مورد نسخه های backdoor و PHP.
نتیجه گیری
انواع مختلفی از نرم افزارهای مخرب وجود دارد که همه آنها دستورات را مستقیما از طریق اسکریپت اجرا نمی کنند. همانطور که در این مثال مشهود است، قطعات دیگری از کد وجود دارد که دستورات دلخواه را از طریق درخواست های $_POST or $_COOKIE دریافت می کنند که به طور پیش فرض توسط وب سرور لاگ نمی شوند.
به منظور جلوگیری از آلوده شدن وبسایت، ما توصیه اکید داریم، اقدامات امنیتی مثل “نظارت بر یکپارچگی فایل” و “استفاده از فایروال نرم افزار وب سایت” را حتما در نظر داشته باشید. همچنین توصیه می شود به طور مداوم بر لاگ های خود جهت جلوگیری از رفتار غیرمنتظره نظارت کنید.
برگرفته از [sucuri.net]