چه طور با سروری که زامبی شده مواجه بشیم؟

اول از همه یه تعریف مختصر از زامبی بگم. داستان اینجوریه که مهاجمایی که میخوان حمله DDoS رو روی یک سایتی اجرا بکنن، نیاز به تعداد زیادی کامپیوتر تو جاهای مختلف هستن، که حمله‌هاشونو با اون سیستم‌های از همه‌جا بی‌خبر انجام بدن و قابل ردیابی نباشن. این کار با استفاده از ریختن بدافزار روی اون کامپیوترها به هر نحوی انجام میشه. کامپیوتری که این بدافزار رو بگیره رو به اصطلاح میگن زامبی شده، یعنی منتظر دستوری از سمت سرور مرکزیه، تا به یه قربانی حمله بکنه.چه طور بفهمیم که سیستم/سرورمون زامبی شده؟اول از همه میتونید از دستور netstat استفاده کنید که توی ویندوز/لینوکس و مک قابل استفاده‌س.sudo netstat -anopخروجی دستور netstat این دستور لیست کانکشن‌های فعالی که دارید رو به همراه PID (آیدی پراسس) براتون لیست میکنه. اگه سیستم شما زامبی شده باشه باید تعداد زیادی کانکشن فعال به آیپی‌های متفاوت (احتمالا Foreign Address اکثرشون باید پورت ۸۰ و ۴۴۳ باشه) که PID همشون هم یکی هست داشته باشید.یه چیز مشکوک دیگه‌ای که وجود داره، تعداد زیادی درخواست UDP به آیپی‌های‌ DNS سرورهاست که باهاش DNS Reflection Attack رو انجام می‌دن.دستور زیر رو اجرا کنید (به جای ۱۲۳۴ باید PID رو بذارید)ps -auxwe | grep 1234توی خروجی این دستور می‌تونید فایل اجرایی که این کانکشن‌ها رو باز کرده رو ببینید.توی سرور ما به دلیل کانفیگ نشدن درست وردپرس، و احتمالا یک پلاگین آسیب‌پذیر، تونسته بودن توی بخش آپلود‌ها یه فایل php اپلود کنن و ادامه‌ی ماجرا.برای جلوگیری از تکرار این موضوع من ۲ تا کار رو کردم: ایجاد فایل htaccess و جلوگیری از اجرای فایل‌های php توی فولدر آپلود‌های وردپرس (وبسرور ما آپاچی بود، توی nginx یا IIS تغییرات دیگه‌ای باید بدید)<Files *.php> deny from all </Files>۲. فعال کردن disable_functions در phpیه قابلیت خوبی که php داره اینه که می‌شه استفاده از یه سری توابعش رو محدود کرد. توی php یک سری توابعی وجود داره که باهاش می‌شه دستورای سیستمی اجرا کرد و اکثرا توی برنامه‌های عادی کاربردی نداره و برای برنامه‌های مخرب زیاد ازشون استفاده می‌شه.کافیه فایل php.ini رو باز کنید و این رو توش بذاریدdisable_functions = &quotpassthru,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source,dl,pclose,proc_nice,proc_terminate,proc_get_status,proc_close,leak,apache_child_terminate,shell-exec,exec,crack_check,crack_closedict,crack_getlastmessage,crack_opendict,psockopen,php_u,symlink,ini_restore,posix_getpwuid,system,pfsockopen,readfile,escapeshellarg,escapeshellcmd,proc_close,ini_alter,parse_ini_file,pcntl_exec,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,copy,curl_exec,tempnam,shell_exec&quotمطمئن باشید که openbase_dir تون هم فعال باشه. این قابلیت دسترسی یک کد php به فایل‌های دیگه‌ی سرور که متعلق به این یوزر نیست رو به طور کلی میگیره ازش (البته معمولا این اسکریپت‌ها توی فولدر /tmp کار میکنن که همه بهشون دسترسی دارند)خب حالا که تهدید رو برطرف کردیم خوبه یه نگاهی به کدها بندازیم ببینیم چی بود و چیکار میکردکد اول، ارسال ایمیل اسپماولین فایل خیلی ساده بود، اگه یه نگاهی به تابع میل php بندازیم مشخصه که این کد هدفش ارسال ایمیل اسپم، با دریافت محتوا و گیرنده و سایر پارامترها از سمت سرور کنترل‌کننده‌ش هست.mail ( string $to , string $subject , string $message [, mixed $additional_headers [, string $additional_parameters ]] )ولی فایل دوم همچین حالتی داشت و ناخوانا بود. با یه نگاه ساده معلومه که کد base64 شده و بعدم gzip شدهفایل مخرب دومبه جای eval دستور echo رو گذاشتم که ببینم کدی که داره اجرا میشه چیه (اینکار رو میتونید با ابزارهایی مثل https://www.unphp.net/decode/ هم انجام بدید)خروجی کار دوباره یه کد انکد شده بود، ولی این دفعه یه کامنتی هم از سمت اتکر توش وجود داشتبا چند بار دیکد کردن و تبدیل کاراکترهای ascii به کاراکتر قابل خوندن،‌ همچین چیزی از کد در اومدخب می‌بینید که خیلی ساختار تو در تویی داره، ولی با دقت بهش دو تا خط کد پیدا کردم که کار اصلی رو دارن انجام می‌دن اون خطی که file_get_contents داره در حقیقت داره یه آدرس وب رو باز می‌کنه (در حقیقت DDoS لایه ۷ صورت می‌گیره)این تسک توی یه فایل اجرایی ذخیره می‌شه و احتمالا توی یک لوپ اجرا می‌شه (تو بقیه‌ فایلایی که ایجاد کرده بود بعضا حتی سعی به ایجاد cronjob هم می‌کرد)