पहुँच पाना आधा काम है; बाकी आधा उसे न खोना है। इसीलिए लगभग हर स्वचालित बदनीयत सॉफ़्टवेयर सबसे पहले अपने दोबारा चलने का इंतज़ाम करता है: पुनरारंभ के बाद, फ़ाइल मिटने के बाद, पासवर्ड बदलने के बाद। और यहीं से वह जानी-पहचानी कहानी आती है — «सफ़ाई की और दो दिन बाद फिर आ गया»।

जिन जगहों पर यह इंतज़ाम होता है वे इतनी ज़्यादा नहीं, और सबको कुछ मिनटों में जाँचा जा सकता है। नीचे क्रम से पूरा चक्र है।

1. SSH की कुंजियाँ

लौटने का सबसे सरल रास्ता: authorized_keys की एक पंक्ति पासवर्ड के बदलाव, सिस्टम अपडेट और पुनरारंभ को झेल जाती है।

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

हर पंक्ति किसी न किसी की स्थायी पहुँच है। अगर आप नहीं बता सकते कि किसकी, तो उसे पराया मानें। पंक्ति के अंत में लिखी टिप्पणी पर भी ध्यान दें: वह मनमाना पाठ है, और आपके नाम से मेल खाना कुछ साबित नहीं करता।

2. सभी उपयोगकर्ताओं के 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 से चलने वाली कोई भी चीज़। इन डायरेक्टरियों से कुछ भी मानक नहीं चलता।

3. 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 से जाँचें।

4. शेल की आरंभ फ़ाइलें

शेल की आरंभ फ़ाइल के अंत में जोड़ा गया कोड हर लॉगिन पर चलता है:

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

ठीक फ़ाइल के अंत को देखें — वहीं जोड़ा जाता है ताकि सरसरी नज़र में न आए।

5. ld.so.preload

ऐसी फ़ाइल जो सिस्टम को हर चलती प्रक्रिया में कोई नियत लाइब्रेरी लोड करने पर मजबूर करती है। और सामान्य हालात में वह कभी नहीं बनती:

ls -l /etc/ld.so.preload

उसकी मौजूदगी व्यावहारिक रूप से गंभीर समझौते का बिना संदेह संकेत है, और ऐसी लाइब्रेरी आमतौर पर फ़ाइलें, प्रक्रियाएँ और नेटवर्क कनेक्शन सब एक साथ छिपा देती है। और उस मशीन पर आप उसके बाद जो कुछ देखेंगे, वह भरोसे लायक नहीं।

6. पैकेज प्रबंधक के hook

एक तरीक़ा जो कम याद रहता है: 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/

ऐसा hook हर अपडेट की स्थापना पर चलता है — यानी नियमित रूप से और root के रूप में।

7. Ubuntu में दिन का संदेश

डायरेक्टरी /etc/update-motd.d/ में वे चलने योग्य स्क्रिप्ट होती हैं जो हर SSH लॉगिन पर चलती हैं और स्वागत का पाठ बनाती हैं। और यह जगह ठीक इसलिए सुविधाजनक है कि सिस्टम का हिस्सा लगती है:

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

8. स्थगित at कार्य

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

एक पुराना और कम इस्तेमाल होने वाला तंत्र, और इसीलिए सबसे कम जाँचा जाने वाला।

अगर कुछ मिल जाए तो क्या करें

पहली प्रतिक्रिया होती है जो मिला उसे तुरंत मिटा देना। और यह ग़लती है: उसके साथ यह जानकारी भी ग़ायब हो जाती है कि वह वहाँ कैसे पहुँचा, और इस सवाल के जवाब बिना सब कुछ दोहराया जाएगा।

  1. फ़ाइल या कार्य की और उसके बदलने के समय की नक़ल रखें।
  2. उसी समय की मदद से वेब सर्वर के लॉग में और auth.log में देखें कि उसी मिनट क्या हो रहा था। प्रवेश का बिंदु आमतौर पर वहीं होता है।
  3. सूची की सभी आठ जगहें जाँचें, न कि सिर्फ़ वह जहाँ कुछ मिला। पिछला दरवाज़ा लगभग कभी एक ही नक़ल में नहीं छोड़ा जाता।
  4. और तब सफ़ाई करें और ख़ुद ख़ामी बंद करें।

यह जानना कि सामान्य कैसा होता है

इस जाँच में असल कठिनाई कमांडें नहीं, बल्कि यह है कि कार्यों की सूची में कोई अनजानी पंक्ति संदिग्ध नहीं लगती अगर आपको याद न हो कि सूची पहले कैसी थी। और ऐसे सर्वर पर जिसे किसी और ने सेट किया हो, या जो एक साल पहले सेट हुआ हो, अपने और पराए में फ़र्क़ करना लगभग नामुमकिन है।

इससे व्यावहारिक नतीजा निकलता है: «जैसा है वैसा» स्नैपशॉट आज लेना मायने रखता है, जब तक सर्वर ठीक है। स्वस्थ मशीन पर cron कार्यों, टाइमरों, कुंजियों और सेवाओं की सूची वही मानक है जिससे बाद में सब कुछ मिलाया जाता है। और तारीख़ के साथ एक जगह जुड़ी और सुरक्षित होकर वह पिछले दरवाज़े की तलाश को कई घंटों की क़वायद से दो सूचियों की तुलना में बदल देती है। यह कैसा लगता है, नीचे डेमो पेज दिखाते हैं।