Palvelimien, ohjelmien ja tiedostojen hallintaa saltilla. Tämä raportti on osa Tero Karvisen k2020 palvelinten hallinta-kurssia. Raportti on kirjoitettu uudelleen selkeämmäksi ja parannetuilla esimerkeillä 11.5.2020.
a) Demonin asennus ja asetukset
Tehtävänä automatisoida Apache2-palvelimen asennus ja asetukset saltilla
Loin samaan kansioon lähdetiedoston, johon luotu sls-tiedosto viittaa sudoedit default-index.html. Muutin Apachen oletussivua kirjoittamalla tiedostoon Hello Apache! This is salt.
Ajoin tilan sudo salt '*' state.apply apache
Katsoin tuloksen selaimella localhostista
b) Uusi ohjelma ja find-komento
Kokeilin asentuuko Spotify saltilla. Asensin ensin käsin Spotifyn ohjeilla.
Seuraavaksi kokeilin saltia. Loin uuden kansion sekä sls-tiedoston mkdir /srv/salt/spotify ja sudoedit /srv/salt/spotify/init-sls
Ajoin tilan sudo salt '*' state.apply spotify
Asennus onnistui ja ohjelma toimii. Katsotaan vielä muutoksia find-komennolla find /etc/ -printf '%T+ %p\n'|sort
Find-komento raportoi tarkan ajankohdan jokaiselle muutokselle. Huomasin ettei Spotifylla ole omaa asennuskansiota /etc/-hakemistossa. whereis spotify kertoo missä tiedostoja sijaitsee.
c) Tilan ajo paikallisesti
Ajoin vielä apache-tilan paikallisesti sudo salt-call --local state.apply apache --state-output terse ja katsoin tulostetta
Komento tulosti yhteenvedon kohteista (esim. apache2), funktioista (esim.pkg.installed) sekä tuloksista (esim. Clean started) ja myös ajasta (Duration). Kaikki 4 moduulia ajettiin paikallisesti onnistuneesti ilman muutoksia.
a) OpenVPN-yhteyden avaus ja yhteydenotto kohdeverkkoon
Ensiksi avasin OpenVPN-yhteyden lataamalla ja ajamalla .ovpn-tiedoston HackTheBoxin sivuilta (vaatii kirjautumisen). Tarkistin, että kohdeverkko on yksityinen ja vastaa yhteydenottoihin.
Komento tulosti avonaiset portit sekä verkkoprotokollat ja versiot. Kaikki portit käyttävät tcp-yhteyttä. Portin 80 http-protokolla siirtää tietoa www-palvelimien ja selainten välillä. Portit 135, 49666 ja 49667 käyttävät msrpc-protokollaa (Microsoft Remote Procedure Call), joka antaa eri koneiden ohjelmien pyytää palvelua toisiltaan tietämättä toistensa verkkoja. Portti 3306 käyttää mysql-protokollaa, jota käytetään MySQL clientin sekä MySQL serverin välillä.
Ratkaise WebGoatista 5-10 tehtävää lisää. (Hyppää yli niistä, jotka eivät toimi tässä versiossa, esim “Developer version only” tai tuki haavoittuvuus muokkaamalla WebGoatin sorsia).
Onnistuneen WebGoat-asennuksen ja kirjautumisen jälkeinen näkymä
Stage 1: Bypass Business Layer Access Control
Käytin Inspect element-toimintoa ViewProfile-painikkeessa ja muutin value=ViewProfile -> DeleteProfile. Painoin painiketta ja tehtävä oli suoritettu.
Stage 3: Breaking Data Layer Access Control.
Tutkin Inspect-toiminnolla tunnuslistaa ja employee id-arvoja. Tarvitsin managerin oikeudet joten poimin employee-id-listasta arvon 107, joka kuului David Giambille.
Kirjauduin käyttäjälle Tom Cat salasanalla tom. Muutin Tomin employee id:n arvoksi 107, joka antoi manageri-statuksen. Painoin ViewProfile ja tehtävä suoritettu.
LAB: Client Side Filtering
Tavoitteena selvittää toimitusjohtajan piilotettu palkka. Tutkin koodia ja löysin ilmeisen taulun “hiddenEmployeeRecords”, josta löytyi “piilotettuja” id-arvoja. Yksi näistä kuului itse toimitusjohtajalle, jonka palkka-luku näkyy kuvassa. Tehtävään kuului myös toinen vaihe, johon tarvitsee Firebug-ohjelmaa. Jätin toiseen vaiheen toistaiseksi tekemättä.
DOM Injection
Tehtävänä ohittaa Activate-painike, joka estää pääsyn. Poistin koodista disabled=””-rivin ja painoin Activate. Tehtävä suoritettu.
XML Injection
Lisää palkintolistaasi loput palkinnot saataviksi.
Muokkasin taulun koodia, jossa listattiin saadut palkinnot. Kopioin ja monistin palkintojen koodirivit ja lisäsin loput palkinnot listan jatkoksi. Painoin submit ja tehtävä suoritettu.
JSON Injection
Muokkaa kalliimmasta $600 lennosta halvempi.
Etsin priceID:n koodista ja muutin arvoksi 300. Submit ja tehtävä suoritettu.
Kuuntele jokin murto Darknet Diaries -podcastista. Analysoi tätä murtoa Cyber Kill Chain (Hutchins et al 2011) ja Mitre ATT&CK -mallien avulla. Kirjoita siten, että analyysisi auttaa käytännön hyökkäyksissä.
Jakso kertoo tunkeutumistestaajasta, joka palkataan murtotestauskeikalle joulupyhien aikaan, kun tietoturvatasot ovat oletettavasti suhteellisen alhaalla. Tämän opetus tietoturvahenkilöille on, että turvatasoa täytyy pitää tasaisesti yllä riippumatta ajasta, paikasta tai sesongista. Hakkerit ja murtautujat voivat tarkoituksellisesti ajoittaa hyökkäyksensä, kun töissä on oletettavasti vähemmän ihmisiä.
Murtotestaaja kertoo klassisiksi menetelmiksi tunnuslätkien väärentämisen. Ihmiset kantavat tunnuksiaan epäsäännöllisesti ja epämääräisesti ja jos hymyilee nätisti, ihmiset saattavat avata ovia jokatapauksessa. Usein murto tapahtuu arkisissa tilanteissa jokapäiväisessä ympäristössä. Valtuudet tulisi aina tarkistaa systemaattisesti varsinkin, kun kyseessä on pääsy kriittisiin tietoihin. Murtautujan tulee välttää ylimääräistä liikkumista kohdetiloissa välttääkseen epäilyt. Sulautuakseen joukkoon vaikutettava määrätietoiselta.
Murtautuja sai kiinnitettyä Raspberry Pi-laitteen tilan laitteeseen käyttämällä tilapäistä tekosyytä istua lähelle paikallista tietokonetta ja huijaamalla kiinnittävänsä oman läppärinsä virtapistokkeeseen. Laite oli pienempi kuin luottokortti ja vaikea huomata yleisissä tiloissa. Yhteystestien ja nopean verkkoskannauksen jälkeen murtautuja jätti R-Pi:n kiinni paikalliseen koneeseen ja poistui tiloista jatkaen tietomurtoa etänä. Niin kauan kuin laite pysyi huomaamattomana kiinni tilojen koneessa, hakkeri pystyi jatkamaan tietomurtoaan.
Cyber Kill Chain-mallin mukaan tämö murto aloitettiin kohteen todentamisesta ja suunnittelusta (reconnaissance). Ajaksi valittiin joulupyhät ja oletettavasti turvataso oli matalammalla. Työkaluna oli Raspberry-Pi-laite, joka sisälsi kirjon murto-ohjelmia (weaponization). Tämän jälkeen tapahtui laitteen toimitus (delivery), kun hakkeri saapui paikan päälle paljastumatta. Murtotyökalu kiinnitettiin suoraan paikalliseen laitteeseen ja testattiin ohjelmien toimivuus (exploitation) sekä etäyhteys hakkerin omasta laitteesta (installation). Hakkeri oli saanut käsiinsä jatkuvan yhteyden tilojen tietoverkkoon (command & control). Nyt hakkeri voi jatkaa toimintaansa keskeytymättömänä (actions on objective).
Suurin muutos tapahtui prosessorissa, jonka prosentuaalinen käyttö moninkertaistui kuormituksen alla kuvan hetkellä jopa 96% asti.
c) iotop; iotop -oa
Asennus:$ sudo apt install iotop. iotop kerää dataa verkon siirtonopeuksista.
$ sudo iotop
Tila kuormituksen alla:
Kuormittaessa siirtinopeuden (IO>) prosentti kasvoi nollasta noin 50-prosentin huippuun. Suuri muutos, mutta pienempi kuormitus kuin prosessorilla.
d) dstat
$ sudo apt install dstat. dstat kerää tiiviisti tietoa monesta järjestelmän osasta; cpu, levytila, siirtonopeus…
Kuormituksen alla:
Raportista näkee nopeasti kuormituksen hetkellisen vaikutuksen ennen paluuta normaalitilaan. idl=idle=käyttämätön prosessorikapasiteetti loppui lähes välittömästi, kun usr=käyttäjä varasi suurimman osan ja sys= Linux kernel loput. Verkkoliikenne hyppäsi hetkessä nollasta useaan megatavuun.
e) ss –listening –tcp –numeric; ss –listening –tcp; ss –tcp; ss –listening –udp; ss –listening –udp;
Kyseinen komentosarja raportoi tilapäisesti kuunneltavat portit, niiden ip-osoitteet, verkkoprotokollat (tcp, udp, http…) sekä paikalliset portit
Kyseinen grep-komento raportoi lokit sanahaulla ‘error’. Tämä on tehokas työkalu vikaetsinnässä ja ongelmanratkonnassa. Suuri osa omista virheilmoituksistani on tullut nimipalvelurikkeistä.
g) Load average näkyy esim ‘uptime’, ‘top’, ‘htop’. Prosessoriydinten määrä näkyy ‘nproc’. Miten load average tulkitaan? Miksi prosessoriydinten määrä on tässä kiinnostava? Vapaaehtoisena bonuksena voit miettiä, mitä hyötyä on kuormituslukemasta, joka voi mennä yli yhden eli yli 100%.
$ uptime
Raportista voi tulkita kellonajan sekä uptimen eli koneen viimeisimmän yhtäjaksoisen käyntiajan. Nykyinen sessio on kestänyt jo 13 tuntia, 36 minuuttia. Load average laskee kuormituksen keskiarvon per viimeiset 1, 5 ja 15 minuuttia. Ajoin seuraavaksi kuormiksen ja mittasin uudelleen:
Kuormitin järjestelmää tällä kertaa 30 sekuntia. Kaikki keskiarvot nousivat -viimeisimmän minuutin keskiarvo yli kymmenenkertaiseksi.
h) Analysoi lopuksi koko ajalta keräämäsi kuormitustiedot. Löydätkö esimerkiksi aiheuttamasi kuormituspiikin?
sar-komento raportoi prosessoriresurssien jakautumisen viiden minuutin välein. Kuvassa käyttäjän kuormituskeskiarvo viimeiseltä kahdelta tunnilta oli 6,05%. Suurin piikki keskiarvosta 11,27% tapahtui ajalla 02.45.01. Samaan aikaan system% oli 4,13, joka on lähes kaksinkertainen lasketusta keskiarvosta (2,23).
%idle-kolumni näyttää, että ylikuormitukseen ei olla vielä ylletty, keskiarvon ollessa 91,69% ja alimmillaan 84,48%.
Etsin labratehtävän keväältä 2018. Tehtävän kulku tapahtuu portaittain. Samalla seuraan palvelimen kuormitusta, josta teen yhteenvedon raportin lopussa.
Suoritusympäristönä oma sylikone Lenovo Ideapad 320s käynnistettynä Live-tikulta, josta ajetaan Linux-pohjainen käyttöympäristö Ubuntu 18.04.3.
Asenna LAMP (Linux, Apache, MySQL, PHP) ja testaa sen toiminta.
Aloitin asennukset Apache 2:sta: $sudo apt-get update ja sudo apt-get install apache2. Avasin palomuurin Apachelle: $ sudo ufw allow apache. Avasin selaimesta localhost-sivun, jolla näkyi Apache2-oletussivu. Korvasin oletussivun: $ echo ”Markuksen testisivu”|sudo tee /var/www/html/index.html.
Seuraavaksi MySQL/MariaDB asennus ja testaus. Ensin suojasin tulevan tietokannan palomuurilla: $ sudo ufw allow 22/tcp. Hain jälleen tottumuksesta päivitykset, jonka jälkeen asensin MariaDB:n: $ sudo apt-get -y install mariadb-client mariadb-server. Lopuksi ajoin komennon $ sudo mysql_secure_installation, johon tein tarvittavat asetukset kuten root-salasanan sekä tietokanta-asetukset. Nyt tietokanta on valmis luotavaksi.
MariaDB [(none)]> create database asiakkaat;
MariaDB [(none)]> show databases;
Annoin asiakkaat-käyttäjälle käyttöoikeudet tietokantaan: MariaDB [(none)]> grant all on asiakkaat.* to asiakkaat@localhost identified by '*omasalasana*!';. Tämän jälkeen exit.
MariaDB [(none)]> USE asiakkaat;MariaDB [asiakkaat]> CREATE TABLE Asiakkaat (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(1024), price FLOAT);MariaDB [(asiakkaat)]> show tables;
Lisäsin Asiakkaat-tauluun kolme nimeä komentomuodolla MariaDB [asiakkaat]> insert into asiakkaat(name) values ("*Yrityksen nimi*"); :
Exit
Seuraavaksi PHP:n asennus ja testaus. Aloitin asennuksilla: $sudo apt-get install libapache2-mod-php, $sudo apt-get install php-mysql.
Loin kotihakemistoon public_html-kansion, jonne lisäsin index.php-tiedoston, johon lisäsin Tero Karvisen testikoodin:
echo '<?php print(2+2+"\n\n"); ?>'> index.php
Testasin ohjelmaa selaimella osoitteessa localhost/~markus/. Sivu valitettavasti näytti tyhjää. Ohjelma näkyi lähdekoodissa:
Siirryn tehtävässä eteenpäin ja testaan toistuuko ongelma.
Testasin toimisiko onnistuisiko php-ohjelma lukemaan tekemääni asiakkaat-tietokantaa. Syötin index.php-tiedostoon Tero Karvisen koodin, johon lisäsin oman tietokantani tiedot. Koitin selaimella uudestaan:
Hmm, sama virhe yhä. Jostain syystä en saa ohjelmaa ajettua PHP:lla. Koitan korjata tilanteen.
Tehtävänantoa seuraten etsin seuraavaksi lokeista todisteita palvelimen murtoyrityksistä:
Ilmeisiä murtoyrityksiä ei näkynyt lokeissa. Tämä tosin ei ollutkaan koetilanne.
"Tee staattinen HTML5 weppisivu, jonka otsikkona (molemmat title ja h1) on "Sorkka ja Rauta Oy".
Laita sivu näkyviin osoitteeseen http://rauta.example.com/"
Loin käyttäjän kotihakemistoon kansion ‘examplesite’, jonne loin uuden index.html-tiedoston. Täydensin koodin Tero Karvisen HTML5-koodin pohjalta:
Seuraavaksi loin conf-tiedoston apache2/sites-available -kansioon:
Tehtävä: Luo yksinkertainen tietokantaohjelma palvelimelle. Tämän jälkeen laita ohjelma toimimaan wsgi-moduulin kanssa. Tehtävä on osana Tero Karvisen kevään 2020 Linux-palvelimet-kurssia. Kaikki ohjeet, lähteet sekä valmiit koodit tehtävään luettavissa sivulta terokarvinen.com.
Edellisessä harjoituksessani loin Python-flaskin tuotantoympäristöön, johon lisäsin templatet. Käytän harjoituksen tuloksia kuten kansioita, tiedostoja sekä ohjelmia pohjana tälle tehtävälle.
Loin nano-komennolla uudet tiedostot ‘autoformed.py’ sekä ‘base.html’ ja ‘replies.html’ templates-alakansioon. Ohjelmien pohjakoodina käytin Tero Karvisen koodeja. Santtu Hyvärinen kommentoi kyseisellä sivulla, että ohjelman ajamiseen tarvitsee SQL-alchemy sekä wtforms -ohjelmat. Asensin ohjelmat komennoilla sudo apt-get install -y python3-flask-sqlalchemy ja sudo apt-get install python3-flaskext.wtf.
Lisäsin ‘autoformed.py’ sekä ‘replies-html’ -tiedostoihin address-rivin:
Testasin ajaa ohjelman komennolla python3 autoformed.py
Sivu toimii localhostissa onnistuneesti tietokannan päällä.
Seuraavana tavoitteena on luoda ensin Python Web App kehitysympäristössä, jonka jälkeen luodaan Flask tuotantoympäristössä käyttäen wsgi-moduulia. Kaikki oppimateriaalit sekä ohjeet tehtävään sivulta terokarvinen.com.
Testaus onnistui kirjoittamalla ‘localhost/’ selainriville.
Tietoturvan kannalta loin uuden käyttäjän markuswsgi, jolle annoin uuden salasanan sekä käyttäjätiedot (koko nimi, loput sivuutetaan). Tämän jälkeen lukitsin käyttäjän ja lisäsin itseni uuteen ryhmään markuswsgi. Komentoina tämä vaihe näytti:
Loin samaan kansioon ‘hello.py’-tiedoston komennolla ~$ nano /home/markuswsgi/public_wsgi/hello.py
Ajoin ohjelman komennolla $ python3 hello.py
Seuraavaksi tein ‘templates-flask.py’ public_wsgi-kansioon ja ‘base.html’ -tiedoston omaan templates-kansioon public_wsgi-kansion sisälle nano-komennolla.
Tavoitteena uuden julkisen palvelimen luominen internetiin.
Hallitsen jo palvelinta markusmikaelsaikkonen.me, jonka loin Digital Oceanin kautta. Koska minulla on jo tunnukset valmiina, pääsen heti luomaan uutta palvelinta.
Omat Create Droplets-alkuasetukseni: Ubuntu, Plan: standard, $5/mo, ei block storagea, Datakeskukseksi Frankfurt, ei muita lisävaihtoehtoja, hostname: saikkonenmarkusmikael. Digital Ocean luo palvelimen asetusten mukaan. Valitsin myös Digital Oceanin lähettämään sähköpostiin kertakäyttöisen salasanan.
Seuraavaksi tarvitsen Domain nimen. DNS-nimiä voi ostaa sivulta Namecheap.com, jonne myös tarvitsee luoda tunnukset. Opiskelijana voit saada kerran ilmaiseksi .me-päätteisen nimen. Tällä kertaa hankin itselleni uuden nimen saikkonenmarkusmikael.tech hintaan $0.48. Oston jälkeen liitin nimen uuteen palvelimeen saikkonenmarkus Digital Oceanin kautta.
Digital Ocean oli lähettänyt palvelimeni ip-osoitteen, käyttäjänimen (root) sekä salasanan sähköpostiin. Seuraavaksi otin konsolilla ssh-yhteyden uuteen palvelimeeni komennolla ssh root@207.154.225.189. Tämän jälkeen root salasana tulee vaihtaa.
Päivän teemana on asentaa Apache 2 web-palvelin omalle kotikoneelle ja pystyttää sen päälle oma kotisivu. Tämän jälkeen tarkastellaan palvelimen lokia.
Päivän teemaan löytyi kattavat ohjeet mainiosti nimetyltä sivulta VITUX.
Aloitin päivittämällä järjestelmän. Tämän jälkeen hain ja asensin Apache 2-palvelimen. Onnistuneen asennuksen jälkeen tarkistin version.
Seuraavaksi katsoin tulimuurista listan sovelluksista ja sallin liikenteen Apachelle.
$ sudo ufw app list
$ sudo ufw allow 'Apache'
Nyt palvelinta voi konfiguroida. Ensin varmistin, että palvelin on päällä ja toimii.
$ sudo systemctl status apache2
Palvelin on päällä, joten siirryin IP-osoitteeseen:
$ hostname -I
Kopioin palvelimen IP-osoitteen web-selaimeen ja pääsin onnistuneesti Apache 2-oletussivulle.
Aika laittaa pystyyn virtual host sekä nimetä domain. Käytin seuraavia komentoja luodakseni directoryn domainille uudella nimellä vantablackfinland.com ja saadakseni käyttöoikeudet domainiin.