Toegang krijgen is het halve werk; de andere helft bestaat eruit die niet te verliezen. Daarom zorgt vrijwel alle geautomatiseerde schadelijke software er allereerst voor dat ze opnieuw wordt gestart: na een herstart, na het verwijderen van het bestand, na een wachtwoordwijziging. Vandaar het bekende verhaal — «we hebben opgeruimd en twee dagen later was het terug».

Zoveel plekken waar dat wordt geregeld zijn er niet, en ze zijn alle in enkele minuten na te lopen. Hieronder de volledige ronde, op volgorde.

1. De SSH-sleutels

De eenvoudigste terugweg: een regel in authorized_keys overleeft een wachtwoordwijziging, een systeemupdate en een herstart.

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

Elke regel is iemands blijvende toegang. Kunt u niet zeggen van wie, beschouw hem dan als vreemd. Let ook op de opmerking aan het eind van de regel: dat is vrije tekst, en overeenkomst met uw eigen naam bewijst niets.

2. De cron-taken van alle gebruikers

Niet alleen uw eigen crontab moet worden nagelopen:

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

Waarop u let: regels met @reboot, lange gecodeerde commando's, aanroepen van curl of wget doorgesluisd naar een shell, alles wat vanuit /tmp, /dev/shm of /var/tmp wordt gestart. Uit die mappen draait niets regulier.

3. Timers en diensten van systemd

Het moderne equivalent van cron, en het wordt merkbaar minder vaak nagelopen:

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

Apart de gebruikersdiensten, die zonder rootrechten draaien en niet in de algemene lijst verschijnen:

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

Nog een detail: is voor een gebruiker het blijven draaien ingeschakeld (loginctl enable-linger), dan draaien zijn diensten zonder actieve sessie. Te controleren met loginctl list-users.

4. De opstartbestanden van de shell

Code die aan het eind van een shell-opstartbestand is toegevoegd, draait bij elke aanmelding:

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

Kijk juist naar het eind van het bestand: daar wordt aangevuld om bij een vluchtige blik niet op te vallen.

5. ld.so.preload

Een bestand dat het systeem dwingt een opgegeven bibliotheek in elk gestart proces te laden. Onder normale omstandigheden wordt het nooit aangemaakt:

ls -l /etc/ld.so.preload

Het bestaan ervan is vrijwel een ondubbelzinnig teken van ernstige compromittering, en zo'n bibliotheek verbergt doorgaans zowel bestanden als processen en netwerkverbindingen. Niets van wat u daarna op die machine ziet, verdient vertrouwen.

6. De haken van de pakketbeheerder

Een methode waaraan zelden wordt gedacht: apt kan vóór en na elke pakketbewerking commando's uitvoeren.

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

Zo'n haak gaat af bij elke installatie van updates — dus regelmatig en als root.

7. Het bericht van de dag op Ubuntu

De map /etc/update-motd.d/ bevat uitvoerbare scripts die bij elke SSH-aanmelding draaien en de welkomsttekst samenstellen. De plek is juist daarom handig omdat ze op een systeemonderdeel lijkt:

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

8. Uitgestelde at-taken

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

Een oud en weinig gebruikt mechanisme, en daarom het minst nagelopen van allemaal.

Wat te doen als er iets opduikt

De eerste ingeving is de vondst meteen te verwijderen. Dat is een fout: daarmee verdwijnt de informatie over hoe ze daar is gekomen, en zonder antwoord op die vraag herhaalt alles zich.

  1. Een kopie van het bestand of de taak en de wijzigingstijd bewaren.
  2. Met die tijd in de webserverlogboeken en in auth.log kijken wat er in diezelfde minuut gebeurde. Daar zit meestal het toegangspunt.
  3. Alle acht plekken uit de lijst nalopen, en niet alleen die waar iets opdook. Een achterdeur wordt vrijwel nooit in één exemplaar achtergelaten.
  4. Pas daarna opruimen en de kwetsbaarheid zelf dichten.

Weten hoe het normaal eruitziet

De grootste moeilijkheid van deze controle zijn niet de commando's, maar het feit dat een onbekende regel in een takenlijst niet verdacht oogt als u zich niet herinnert hoe die lijst er eerder uitzag. Op een server die door iemand anders is ingericht, of een jaar geleden, is het eigene van het vreemde bijna niet te onderscheiden.

Vandaar de praktische slotsom: een momentopname van de huidige toestand maken heeft vandaag zin, zolang de server in orde is. De lijst met cron-taken, timers, sleutels en diensten van een gezonde machine is de referentie waarmee later wordt vergeleken. Verzameld en met historie bewaard, verandert ze het zoeken naar een achterdeur van een oefening van uren in het vergelijken van twee lijsten. Hoe dat oogt, tonen de demopagina's hieronder.