Pääsyn hankkiminen on puoli työtä; toinen puoli on olla menettämättä sitä. Siksi lähes kaikki automatisoitu haittaohjelmisto varmistaa ensimmäisenä kykynsä käynnistyä uudelleen: uudelleenkäynnistyksen jälkeen, tiedoston poiston jälkeen, salasanan vaihdon jälkeen. Siitä tyypillinen tarina — ”siivosimme, ja kahden päivän päästä se oli takaisin”.

Paikkoja, joissa tämä järjestetään, ei ole kovin montaa, ja kaikki voi tarkistaa muutamassa minuutissa. Alla koko kierros järjestyksessä.

1. SSH-avaimet

Yksinkertaisin tapa palata: rivi tiedostossa authorized_keys selviää salasanan vaihdosta, järjestelmäpäivityksestä ja uudelleenkäynnistyksestä.

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

Jokainen rivi on jonkun pysyvä pääsy. Jos et osaa sanoa kenen, pidä sitä vieraana. Pane merkille myös rivin lopun kommentti: se on vapaata tekstiä, eikä sen osuminen omaan nimeesi todista mitään.

2. Kaikkien käyttäjien cron-tehtävät

Oman crontabin katsominen ei riitä:

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

Mihin kiinnittää huomiota: rivit @reboot, pitkät koodatut komennot, curl- tai wget-kutsut jotka putkitetaan komentotulkkiin, kaikki mikä käynnistyy hakemistoista /tmp, /dev/shm tai /var/tmp. Noista hakemistoista ei käynnisty normaalisti mitään.

3. systemd-ajastimet ja -palvelut

Cronin nykyaikainen vastine, ja sitä tarkistetaan huomattavasti harvemmin:

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

Erityisesti käyttäjäpalvelut, jotka toimivat ilman root-oikeuksia eivätkä päädy yleiselle listalle:

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

Vielä yksi yksityiskohta: käyttäjälle päälle kytketty istunnon jatkuvuus (loginctl enable-linger) sallii hänen palveluidensa toimia ilman aktiivista istuntoa. Se tarkistetaan komennolla loginctl list-users.

4. Komentotulkin käynnistystiedostot

Komentotulkin käynnistystiedoston loppuun lisätty koodi suoritetaan jokaisella kirjautumisella:

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

Katso nimenomaan tiedoston loppua — sinne lisätään, jottei se pistäisi silmään nopeassa selauksessa.

5. ld.so.preload

Tiedosto, joka pakottaa järjestelmän lataamaan määritellyn kirjaston jokaiseen käynnistettävään prosessiin. Normaaleissa oloissa sitä ei synny koskaan:

ls -l /etc/ld.so.preload

Sen olemassaolo on käytännössä yksiselitteinen merkki vakavasta vaarantumisesta, ja tuollainen kirjasto piilottaa yleensä sekä tiedostot, prosessit että verkkoyhteydet. Mikään, minkä sen jälkeen tuolla koneella näet, ei ansaitse luottamusta.

6. Paketinhallinnan koukut

Menetelmä, jota harvoin muistetaan: apt osaa suorittaa komentoja ennen jokaista pakettitoimintoa ja sen jälkeen.

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

Tuollainen koukku ajetaan jokaisen päivitysten asennuksen yhteydessä — siis säännöllisesti ja root-oikeuksin.

7. Päivän viesti Ubuntussa

Hakemisto /etc/update-motd.d/ sisältää suoritettavia skriptejä, jotka käynnistetään jokaisella SSH-kirjautumisella ja jotka kokoavat tervehdystekstin. Paikka on kätevä juuri siksi, että se näyttää järjestelmän omalta:

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

8. Viivästetyt at-tehtävät

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

Vanha ja harvoin käytetty mekanismi, ja siksi kaikista harvimmin tarkistettu.

Järjestys, jos jotain löytyy

Ensimmäinen impulssi on poistaa löydös heti. Se on virhe: sen mukana katoaa tieto siitä, miten se sinne päätyi, ja ilman vastausta siihen kysymykseen kaikki toistuu.

  1. Ota kopio tiedostosta tai tehtävästä ja sen muutosajankohdasta.
  2. Tarkista verkkopalvelimen lokeista ja tiedostosta auth.log, mitä samalla minuutilla tapahtui. Sieltä löytyy yleensä sisäänpääsy.
  3. Käy läpi kaikki kahdeksan listan paikkaa, ei vain sitä, josta jotain löytyi. Takaovia ei jätetä lähes koskaan yhtä ainoaa.
  4. Vasta sen jälkeen siivoa ja tuki itse haavoittuvuus.

Tietää miltä normaali näyttää

Tämän tarkistuksen suurin vaikeus eivät ole komennot vaan se, ettei tuntematon rivi tehtävälistalla näytä epäilyttävältä, jos ei muista miltä lista näytti aiemmin. Palvelimella, jonka joku muu on pystyttänyt tai joka pystytettiin vuosi sitten, omaa ja vierasta on lähes mahdotonta erottaa.

Siitä käytännön johtopäätös: ota tilannekuva ”sellaisena kuin on” tänään, kun palvelin on kunnossa. Cron-tehtävien, ajastimien, avainten ja palveluiden lista terveellä koneella on se vertailukohta, johon myöhemmin verrataan. Kerättynä ja historian kanssa säilytettynä se muuttaa takaoven etsinnän monen tunnin työstä kahden listan vertailuksi. Miltä se näyttää, näkyy alla olevilla esittelysivuilla.