اول از همه یه تعریف مختصر از زامبی بگم. داستان اینجوریه که مهاجمایی که میخوان حمله DDoS رو روی یک سایتی اجرا بکنن، نیاز به تعداد زیادی کامپیوتر تو جاهای مختلف هستن، که حملههاشونو با اون سیستمهای از همهجا بیخبر انجام بدن و قابل ردیابی نباشن. این کار با استفاده از ریختن بدافزار روی اون کامپیوترها به هر نحوی انجام میشه. کامپیوتری که این بدافزار رو بگیره رو به اصطلاح میگن زامبی شده، یعنی منتظر دستوری از سمت سرور مرکزیه، تا به یه قربانی حمله بکنه.
چه طور بفهمیم که سیستم/سرورمون زامبی شده؟
اول از همه میتونید از دستور netstat استفاده کنید که توی ویندوز/لینوکس و مک قابل استفادهس.
sudo netstat -anop
این دستور لیست کانکشنهای فعالی که دارید رو به همراه PID (آیدی پراسس) براتون لیست میکنه. اگه سیستم شما زامبی شده باشه باید تعداد زیادی کانکشن فعال به آیپیهای متفاوت (احتمالا Foreign Address اکثرشون باید پورت ۸۰ و ۴۴۳ باشه) که PID همشون هم یکی هست داشته باشید.
یه چیز مشکوک دیگهای که وجود داره، تعداد زیادی درخواست UDP به آیپیهای DNS سرورهاست که باهاش DNS Reflection Attack رو انجام میدن.
دستور زیر رو اجرا کنید (به جای ۱۲۳۴ باید PID رو بذارید)
ps -auxwe | grep 1234
توی خروجی این دستور میتونید فایل اجرایی که این کانکشنها رو باز کرده رو ببینید.
توی سرور ما به دلیل کانفیگ نشدن درست وردپرس، و احتمالا یک پلاگین آسیبپذیر، تونسته بودن توی بخش آپلودها یه فایل php اپلود کنن و ادامهی ماجرا.
برای جلوگیری از تکرار این موضوع من ۲ تا کار رو کردم:
<Files *.php> deny from all </Files>
۲. فعال کردن disable_functions در php
یه قابلیت خوبی که php داره اینه که میشه استفاده از یه سری توابعش رو محدود کرد. توی php یک سری توابعی وجود داره که باهاش میشه دستورای سیستمی اجرا کرد و اکثرا توی برنامههای عادی کاربردی نداره و برای برنامههای مخرب زیاد ازشون استفاده میشه.
کافیه فایل php.ini رو باز کنید و این رو توش بذارید
disable_functions = "passthru,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"
مطمئن باشید که 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 به کاراکتر قابل خوندن، همچین چیزی از کد در اومد
خب میبینید که خیلی ساختار تو در تویی داره، ولی با دقت بهش دو تا خط کد پیدا کردم که کار اصلی رو دارن انجام میدن