Koetilan palvelimen tutkiminen

Haavoittuvuudet
Hackabi
Digabi-webinaarit
**Abitti**
Ohjelmistot
Tehdyt parannukset
Vanhat Abitti-versiot
Tweak-A-bitin tutkiminen
**Laitteisto**
WLAN-tukiaseman konfigurointi
Tutkintoverkko

Koetilan palvelimen rakennetta on helppo tutkia ja samalla oppia ymmärtämään se, miten Abitti-järjestelmä toimii. Tällä sivulla annetaan ohjeet tutkimisen aloittamiseen ja kerrotaan lyhyesti koetilan palvelimen rakennetta. Korostamme, että koetilan palvelimen rakenteen tutkimisessa ei ole mitään lain tai edes hyvän tavan vastaista.

## Alkutoimenpiteet

Seuraavilla toimenpiteillä saat tehtyä ympäristön koetilan palvelimen tutkimiseen:

* Lataa verkosta AbittiUSB-ohjelmalla KTP (Koetilan palvelin) -tikun levykuva ja tee koetilan palvelimen muistitikku.AbittiUsb-ohjelma toimii Windows-käyttöjärjestelmässä.
* Tarvitset tutkimisessa Linux-käyttöjärjestelmää, asenna joku Linux-paketti koneelleesi, vaikkapa olemassa olevan käyttöjärjestelmän rinnalle. Jos et halua asentaa Linux-käyttöjärjestelmää koneellesi, voit tehdä kaiken tämän myös USB-muistilta käynnistetyltä Linuxilta.
* Laita palvelintikku kiinni koneeseesi, uudelleenkäynnistä koneesi ja käynnistä tikulla oleva koetilan palvelimen ohjelmisto YTL:n ohjeiden mukaan.
* Heti käynnistymisen jälkeen sammuta koetilan palvelin. Sinun ei tarvitse hyväksyä käyttöehtoja, ladata koetetäviä tai tehdä mitään muuta.

Käynnistyksen aikana KTP:n ohjelmisto kirjoitti paljon tiedostoja muistitikun persistence-osioon, ja näitä tiedostoja hyväksikäyttäen pääsemme tutkinnassa eteenpäin.

## Ylläpitäjän oikeudet

Seuraavilla toimenpiteillä saat administraattorin oikeudet koetilan palvelimelle

* Käynnistä Linux ja editoi alkutoimenpiteissä luomallesi persistence-partitiolle ilmestyneeseen etc/password-tiedostoon uusi admistraattoritunnus.

**Administraattorin lisääminen**

```
echo "new\_root::0:0:root:/root:/bin/bash" >> etc/passwd

```

* Nyt voit käynnistää koneen uudelleen tikulla olevaan koetilan palvelimen ohjelmistoon YTL:n ohjeiden mukaan.
* Pääset administraattoriksi painamalla Alt·Ctrl·F1 ja kirjautumalla sisään new\_root-tunnuksella.

Nyt voitkin tutustua tarkemmin kaikkeen siihen, mitä koetilan palvelimella tapahtuu.

## Muistitikun levypartitiot

Palvelintikulla on kolme levyosiota, seuraavassa on kerrottu kustakin levyosiosta tarkemmin

### EFI

Tätä levyosiota käytetään koneen käynnistyksen yhteydessä, levyosio sisältää GRUB2-ohjelman ja sen konfigurointitiedostot. GRUB2-ohjelma ladataan ensimmäisenä tietokoneen muistiin käynnistyksessä ja GRUB2 huolehtii koetilanteessa käytettävän DigabiOS-käyttöjärjestelmän lataamisesta, alustamisesta ja käynnistämisestä.

Olennainen tiedosto tässä osiossa on *grub/grub.cfg*, tiedostosta näkyy että DigabiOS-käyttöjärjestelmä käynnistetään joko koetilan palvelimeksi parametreillä "... ip=eth0:10.10.0.1:255.255.0.0 hostname=ktp1.local persistence" tai valvojan koneeksi parametreillä "... systemd.unit=remote-supo.target". Koetilan palvelin-moodissa parametreillä määritellään IP-osoite, koneen nimi ja otetaan käyttöön persistence-osio. Valvojan moodissa sen sijaan IP-osoite haetaan dynaamisesti ja koneen käynnistyksessä ajetaan *systemd*-järjestelmällä *remote-supo*-komentotiedosto

### SERVER1536Z

Huom: Levyosion nimi vaihtuu DigabiOS-käyttöjärjestemän version mukaan, nimen loppuosan numeroyhdistelmä kertoo käyttöjärjestelmän version.

Olennaisin levyosion sisältö on DigabiOS-käyttöjärjestelmän ydin (*vmlinuz*), käyttöjärjestelmän alustuksessa tarvittava levykuva (*initrd.img*) ja varsinainen levykuva (*filesystems.squashfs*). Lisäksi tässä levyosiossa on eri käynnistysmenetelmillä tarvittavia aputiedostoja.

Mielenkiintoisin tutkittava on tiedosto "*live/filesystems.squashfs*". Tämä kannattaa kopioida omalle koneelle ja purkaa *unsquashfs*-komennolla: "*sudo unsquasfs filesystems.squashfs*". Puretusta levykuvasta voit tutkia kaikkia DigabiOS:n tiedostoja.

### persistence

Persistence-osiota käytetään tallettamaan kaikki tiedostojärjestelmään tehdyt muutokset, jolloin esimerkiksi koevastaukset säilyvät täällä, mikäli järjestelmä joudutaan uudelleenkäynnistämään. Persistence-osiossa on alkujaan vain yksi tiedosto, persistence.conf, joka määrittää miten persistence-osiota käytetään. DigabiOS:n tapauksessa tiedostossa on yksi rivi, "*/ union*", joka tarkoittaa, että kaikki muutokset talletetaan persistence-osioon.

Tätä persistence-osiota voidaan käyttää kahdella tavalla hyödyksi koetilan palvelimen tutkimisessa. Ensinnäkin koetilan palvelimen tekemät kaikki levymuutokset, kuten opiskelijoiden tekemät vastaukset löytyvät täältä ja ovat siirrettävissä muualle tarkempaa tuekimista varten. Toisekseen tähän levyosioon voidaan tehdä haluttuja muutoksia esim Linux-käyttöjärjestelmän alaisuudessa ja, kun kone on uudelleenkäynnistetty koetilan palvelimeksi, suorittaa nämä muutokset. Jälkimmäisestä hyvä esimerkki on edellä suoritettu ylläpitäjän oikeuksien hankinta koetilan palvelimelle.

## Koejärjestelmä ktpjs

YTL:n tekemä koejärjestelmä ktpjs lukee kokeen alussa koekysymykset USB-tikulta ja avaa kysymysten suojauksen. Kokeen aikana järjestelmä pitää kirjaa kokeeseen liittyneistä opiskelijoista, jakaa opiskelijoille koekysymykset ja kirjaa talteen tietokantaan opiskelijoiden vastaukset. Kokeen päätyttyä koejärjestelmä tallentaa vastaukset ja koetilan palvelimen logitiedot muistitikulle, jolta vastaukset voidaan siirtää arvosteltaviksi.

TÄMÄ LUKU ON OSITTAIN KESKEN

### Koevastausten tietokanta

Koevastaukset talletetaan osittain json-muotoisina Postgres SQL -tietokantaan.

Tietokannan rakenne on kuvattu tiedostossa "*/var/lib/ktpjs/ktp-ddl\_1.sql*" ja "*/var/lib/ktpjs/ktp-extensions-ddl\_1.sql*". Varsinkin ensiksimainittuun kannattaa perehtyä ymmärtääkseen vastausten tietokannan rakenteen palvelimella.

SQL-tietokantaa voi tutkia DigabiOS:ssa komennolla "*sudo -u postgres psql*", jolla käynnistetään SQL-tulkki. Ensimmäiseksi kannattaa antaa komento "*\c ktp*", jolla liitytään käsittelemään tietokantaan "ktp". Seuraavaksi voi esimerkiksi antaa SQL-komennon "*select \* from answer;*". Komento "*\q*" lopettaa SQL-tulkin.

Luonnollisestikin, jotta koevastausten tietokannassa olisi vastauksia, pitää sinun rakentaa koeverkko, liittää siihen opiskelijan kone ja vastata tällä toisella koneella johonkin koetehtävään.

### Koejärjestelmän toteutus

Koejärjestelmä on toteutettu pääosin JavaScript-kielellä käyttäen hyväksi Json-muotoilua. Javascript tekee kokeen tutkimisen ja muokkaamisen varsin helpoksi, käyttäjän ei tarvitse muuta kuin käydä muuttamassa koodia haluamakseen ja sitten uudelleenkäynnistää ktpjs.

Kokeen tutkiminen on helppoa välitulostuksien avulla. nämä saa helposti käyttöön lisäämällä js-tiedoston alkuun määritteen "*var logger = require('../server/logger.js').logger*" ja myöhemmin itse koodin joukkoon vaikkapa rivin "*logger.info('Tämä näkyy syslogissa, passphrase:' + passphrase)*", jolloin ohjelmaa ajettaessa syslogiin ilmestyy tuo rivi ja muuttujan passphrase arvo.

Koodimuutosten jälkeen koetilan palvelin pitää uudelleenkäynnistää komennolla "*service ktpjs restart*", jotta koodiin tehdyt muutokset tulisivat voimaan.

### Havaittua

YTL:n tekemää JS-koodia tutkiessa havaitsee seuraavaa:

* Koodi on kuin opiskelijapoloisten kirjoittamaa, ammattimaisuudesta ei ole jälkeäkään.
* Arkkitehtuurisuunnittelu on unohtunut tehdä kokonaan.
* Mitään virheentarkasteluja ei tehdä, koodissa luotetaan onneen, että kaikki menee niin kuin pitäisi.
* Uudet ominaisuudet koodiin on tehty leikkaa/liimaa periaatteella, lopputulos on vaikeasti ylläpidettävä tiulkkutäkki
* Unohdettu täysin se, että lähiverkkoon on mahdollisuus liittää ulkoinen laite joka käyttää "NSA" loggeria takaovena suorittamaan ROOT käyttäjällä komentoja. Ovatko nämä datanomeja töissä?

Miksiköhän kaikkein tärkein asia tehdään näin helposti murrettavissa olevilla menetelmillä?

## Logitusjärjestelmä

Koetilan palvelin kerää kaikkien opiskelijoiden koneiden logitiedot

KESKEN