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.
- Ota kopio tiedostosta tai tehtävästä ja sen muutosajankohdasta.
- Tarkista verkkopalvelimen lokeista ja tiedostosta
auth.log, mitä samalla minuutilla tapahtui. Sieltä löytyy yleensä sisäänpääsy. - Käy läpi kaikki kahdeksan listan paikkaa, ei vain sitä, josta jotain löytyi. Takaovia ei jätetä lähes koskaan yhtä ainoaa.
- 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.