به‌دست‌آوردن دسترسی نیمی از کار است؛ نیم دیگر از دست‌ندادن آن است. به همین دلیل تقریباً همه بدافزارهای خودکار پیش از هر چیز اجرای دوباره خود را سامان می‌دهند: پس از بازراه‌اندازی، پس از حذف فایل، پس از تغییر گذرواژه. و داستان آشنا از همین‌جا می‌آید — «پاک کردیم و دو روز بعد برگشت».

جاهایی که این کار در آن‌ها سامان می‌یابد چندان بسیار نیستند، و همه را می‌توان در چند دقیقه بررسی کرد. در ادامه دور کامل به ترتیب می‌آید.

۱. کلیدهای SSH

ساده‌ترین راه بازگشت: سطری در authorized_keys از تغییر گذرواژه و به‌روزرسانی سامانه و بازراه‌اندازی جان به در می‌برد.

sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;

هر سطر دسترسی همیشگی کسی است. اگر نمی‌توانید بگویید از آنِ کیست، بیگانه‌اش بشمارید. به توضیح پایان سطر هم توجه کنید: متنی دلخواه است، و همخوانی‌اش با نام خودتان چیزی را ثابت نمی‌کند.

۲. وظیفه‌های cron همه کاربران

تنها crontab خودتان نیست که نیاز به بررسی دارد:

for u in $(cut -f1 -d: /etc/passwd); do echo "== $u"; sudo crontab -u "$u" -l 2>/dev/null; done
sudo ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/
sudo cat /etc/crontab

نشانه‌هایی که ارزش جست‌وجو دارند: سطرهای @reboot، فرمان‌های رمزگذاری‌شده بلند، فراخوان‌های curl یا wget که به پوسته لوله شده‌اند، و هر چیزی که از /tmp یا /dev/shm یا /var/tmp اجرا می‌شود. هیچ چیز استانداردی از این پوشه‌ها اجرا نمی‌شود.

۳. زمان‌سنج‌ها و سرویس‌های systemd

هم‌ارز امروزی cron، و آشکارا کمتر بررسی می‌شود:

systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/

و جداگانه، سرویس‌های کاربر که بدون اختیارهای root اجرا می‌شوند و در فهرست عمومی پیدا نمی‌شوند:

systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/

و جزئی دیگر: lingering فعال‌شده برای کاربری (loginctl enable-linger) به سرویس‌هایش اجازه می‌دهد بدون نشستی فعال اجرا شوند. با loginctl list-users بررسی‌اش کنید.

۴. فایل‌های آغاز پوسته

کدی که به پایان فایل آغاز پوسته افزوده شود در هر ورود اجرا می‌شود:

sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/

دقیقاً به پایان فایل بنگرید — آنجا می‌افزایند تا در نگاهی شتاب‌زده به چشم نیاید.

۵. ld.so.preload

فایلی که سامانه را وامی‌دارد کتابخانه‌ای معین را در هر فرایندِ اجراشده بار کند. و در شرایط عادی هرگز ساخته نمی‌شود:

ls -l /etc/ld.so.preload

وجودش عملاً نشانه‌ای بی‌ابهام از یک نفوذ جدی است، و چنین کتابخانه‌ای معمولاً فایل‌ها و فرایندها و اتصال‌های شبکه را یکسان پنهان می‌کند. و هیچ‌چیزی که پس از آن روی آن ماشین می‌بینید شایسته اعتماد نیست.

۶. قلاب‌های مدیر بسته

روشی که کمتر به یاد می‌آید: apt می‌تواند پیش و پس از هر عملیات روی بسته‌ها فرمان‌هایی اجرا کند.

sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/

چنین قلابی در هر نصب به‌روزرسانی فعال می‌شود — یعنی منظم و با root.

۷. پیام روز در Ubuntu

پوشه /etc/update-motd.d/ اسکریپت‌های اجرایی‌ای دارد که در هر ورود SSH اجرا می‌شوند و متن خوش‌آمد را می‌سازند. و این جا دقیقاً از آن رو مناسب است که بخشی از سامانه به نظر می‌رسد:

sudo ls -la /etc/update-motd.d/

۸. وظیفه‌های تعویق‌افتاده at

sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null

سازوکاری کهنه و کم‌کاربرد، و از همین‌رو کمتر از همه بررسی‌شده.

اگر چیزی یافتید چه کنید

نخستین انگیزه حذف بی‌درنگ یافته است. و این خطاست: با آن، آگاهی از اینکه چگونه به آنجا رسیده هم ناپدید می‌شود، و بدون پاسخ به این پرسش همه‌چیز تکرار خواهد شد.

  1. رونوشتی از فایل یا وظیفه و زمان تغییرش نگه دارید.
  2. با همان زمان، در گزارش‌های وب‌سرور و در auth.log ببینید در همان دقیقه چه می‌گذشت. نقطه ورود معمولاً همان‌جاست.
  3. هر هشت جای فهرست را بررسی کنید، نه تنها جایی را که چیزی پیدا شده. در پشتی تقریباً هرگز در یک نسخه رها نمی‌شود.
  4. و تنها پس از آن پاک کنید و خود آسیب‌پذیری را ببندید.

بدانید وضع عادی چه شکلی است

دشواری اصلی در این بررسی فرمان‌ها نیستند بلکه این است که سطری ناآشنا در فهرست وظیفه‌ها مشکوک به نظر نمی‌رسد اگر به یاد نداشته باشید فهرست پیش‌تر چگونه بود. و روی سروری که کسی دیگر تنظیمش کرده یا سالی پیش تنظیم شده، جداکردن مال خودتان از مال بیگانه تقریباً ناممکن است.

از همین‌جا نتیجه‌ای عملی برمی‌آید: گرفتن تصویری لحظه‌ای «همان‌گونه که هست» امروز معنا دارد، تا وقتی سرور سالم است. فهرست وظیفه‌های cron و زمان‌سنج‌ها و کلیدها و سرویس‌ها روی ماشینی سالم همان مرجعی است که بعدها همه‌چیز با آن سنجیده می‌شود. و گردآمده و نگه‌داشته‌شده با تاریخچه، شکار در پشتی را از تمرینی چندساعته به سنجش دو فهرست بدل می‌کند. شکل این را صفحه‌های نمایشی پایین نشان می‌دهند.