Praktikum2 - Paroolide murdmine
Anonüümne ja üldine (avalik) info internetis ja arvutis on piiratud, seega varem või hiljem jõuame olukorda, kus meil on vaja kasutajaid ja seadmeid tuvastada ehk autentida. Levinuim meetod kasutajate tuvastamiseks on kasutajatunnus
ja parool
kombinatsiooni kasutamine. Käesolevas praktikumis vaatamegi lähemalt kuidas arvutisüsteemid paroole salvestavad, kuidas paroole murda (häkkida) ning kuidas paroole turvaliselt kasutada. e-õppe tudengitel on soovitatav vaadata 2021 praktikumijuhendit tutvustava video (Ülesanded ja tegevused kehtivad ka 2023, kuid räsid ja matriklinumbrid harjutustes on uuendatud).
Krüptograafiline räsifunktsioon
Arvutisüsteemides on meil vaja kasutajate paroole hoiustada ja hiljem võrrelda sellega mida nad sisestavad sisse logides süsteemi. Algselt hoiustati paroole tekstikujul
, kuid kiiresti jõuti arusaamani, et vähimgi eksimus viib suure koguse paroolide leketeni ja negatiivsed tagajärjed on vältimatud. Tänapäeval on jõutud olukorrani, kus enamik süsteeme ei salvesta paroole tekstikujul vaid salvestatakse parooli räsisid
koos soolaga.
Räsifunktsioon (hash function) on deterministlik algoritm, mis saab sisendiks suvalise hulga andmeid ning mille väljund on alati ühepikkune (teatud arv bitte). Loomulikult tähendab see seda, et teades räsifunktsiooni väljundit (räsi) ei ole võimalik pöördtehtena välja arvutada sisendit. Oluline on ka see, et iga muudatus sisendis muudab tervet räsifunktsiooni väljundit.
Krüptograafias kasutatakse räsifunktsioone mitmel pool ning sellistel räsifunktsioonidel on nõutud teatavad omadused:
- Ühesuunalisus (one-wayness): räsifunktsiooni väljundist ei saa tuletada sisendit, st räsifunktsioon ei ole pööratav.
- Lisaoriginaalikindlus (second pre-image resistance): teades räsifunktsiooni sisendit on raske leida mõni teine sisend, mis annaks samasuguse väljundi.
- Kollisioonikindlus (collision resistance): on raske leida kahte erinevat sisendit, mis annaks sama väljundi.
Tuntumad räsialgoritmid on MD5, SHA-1, SHA-2 pere (SHA-224, SHA-256, SHA-384, SHA-512), SHA-3 (ehk Keccak), Elliptic-curve cryptography (ECC).
Leiame räsi lausele "krüptograafiline räsifunktsioon on ühesuunaline".
Räsifunktsioon | Lause räsi |
---|---|
MD5 | 8727dc1ee0fd84c1e0d2d38cb02dfea0 |
SHA-1 | 7c32ae747dd38b6567ba86cce3bbe2f0323246ab |
SHA-256 | 017c36232edeac0f0b4c93b8d8e5e69c81799c3d8db32705ff60136148bcde0e |
Kui kasutaja tahab näiteks veebilehele sisse logida ja oma parooli sisestab, siis arvutab veebileht sellest uuesti räsi ja võrdleb seda andmabaasis olevaga. Krüptograafilise räsifunktsiooni omadused võimaldavad kasutada räsisid paroolide andmebaasidesse salvestamiseks, sest juhul kui kasutatakse turvalist krüptograafilist räsifunktsiooni, ei ole võimalik räsist tuletada esialgset parooli. Seega kui andmebaas lekib, siis ei leki kasutajate paroolid vaid lekivad paroolide räsid. Sellises olukorras peab ründaja hakkama kasutajate paroole ära arvama ehk räsima massiliselt erinevaid sümbolite kombinatsioone, et leida sobiv räsi. Tegelikult saab ründaja teha seda juba enne lekke toimumist ehk ründajal on võimalus teha arvutuslikult keeruline töö varem valmis, et koostada räside, paroolide sõnaraamat (rainbow table
). Selleks, et seda rünnet vältida, tuleks paroolidele lisada enne räsimist sool ehk juhuslikkus. Sool on teadaolev (nn avalik) räsi osa mis liidetakse paroolile enne räsifunktsiooni rakendamist. Iga räsi jaoks on vaja koostada eraldi rainbow table seega muutub räsidega paroolide eelnev väljaarvutamine vähe efektiivseks ründamise meetodiks.
Ründajate elu tehakse veelgi keerulisemaks ning tavalise räsifunktsiooni asemel kasutatakse hoopis spetsiaalset paroolipõhist võtmetuletusfunktsiooni (password-based key derivation function). Selliste funktsioonde mõte on selles, et nad räsivad sisendit mitte üks vaid näiteks 10 000 korda, muutes seega ründajal paroolide arvamise oluliselt ajaliselt (rahaliselt) kulukamaks. Näited sellistest funktsioonidest on PBKDF2, scrypt jt.
Allikas - xkcd koomiks
Ettevalmistus praktikumi harjutusteks
- Käivitage Linux Mint virtuaalmasinas
terminal
- Jooksutage järgmised käsud:
sudo apt update
sudo apt install build-essential
- Juhul kui tahate käsurealt vahetada eestikeelset klaviatuuri, siis:
setxkbmap ee
(võib vajada terminali taaskäivitust).
Paroolide räsid Linuxis
Märkus. Ärge muutke kasutajate "root" ja "kasutaja" paroole!
Märkus. Root-kasutajana teha ainult selleks vajalikke asju. Programmide allalaadimine, redigeerimine, kompileerimine, john'i jooksutamine jms tehke tavakasutajana!
Uurige /etc/passwd
ja /etc/shadow
faile, näiteks less
abil. Neist teise lugemiseks on õigusi vaid root-kasutajal, seega minge ajutilselt root'ks (käsk su -
ja pärast lugemist logige välja root'st tagasi). Lisainfot vastavate failide kohta leiate siit ja siit.
Tõmmake programm ctest.c (C-keeles) ja püüdke aru saada, mida see teeb. Kui te pole enne C-keeles programmeerinud ärge kartke järgnevalt teha väikesi muudatusi koodi, millega võiksite kenasti eelneva kogemuseta hakkama saada. Siinkohal kasutame C-keelt sest suurem osa Linux'st on kirjutatud C-keeles ja süsteemselt kasutab Linux sama crypt
C-teeki. Lugege juurde crypt
kasutamisest manuaalist:
$ man 3 crypt
C kirjutatud koodi tuleb kõigepealt kompileerida käsuga gcc
- GNU project C and C++ compiler.
Enne seda aga peaks installeerima kompilaatorile vajalikud lisad build-essential
, kui te jätsite eelnevalt selle tegemata:
$ sudo apt install build-essential $ mv ctest.txt ctest.c $ gcc -o ctest ctest.c -lcrypt
Kompileeritud programmi käivitamine:
$ ./ctest
Muutke C-keele lähtekoodi tavakasutajana ning tehke katseliselt kindlaks, mitu märki paroolist läheb räsi moodustamisel arvesse DES räsi korral. DES korral crypt
kasutades on soola pikkuseks esimesed kaks sümbolit lõplikust räsist. Selleks modifitseerige näidiskoodi nii et see kuvaks kuni 12 kohalise parooli korral arvutatud räsi. Seda saab teha tsüklis kuid kiirem on arvatavasti koodi kopeerida lihtsalt mitu räsi arvutamise rida (crypt
käsuga rida koodis) üksteisele järele, kus iga järgnevas real on parool ühe võrra pikem. Tulemusena peaksite avastama, et ühest hetkest pikem parool ei genereeri enam erinevat räsi. See põhjustas juhtumeid kus "vanemates" arvutisüsteemides oli oluline ainult parooli "algus" õigesti sisestada.
Lisaülesanne: Lugege funktsiooni crypt
manuaali man crypt
ning modifitseerige eelmist programmi, nii et tekiksid MD5 räsid. Mitu märki paroolist läheb siin arvesse?
Kasutajal parooli muutmine
Tekitage kasutaja test ning andke talle lihtne parool (näiteks: 123456
).
$ sudo adduser test
PS! Kui teil kasutaja nimega test
on juba olemas või soovite katsetamiseks uuesti luua siis kustutada saate kasutaja käsuga userdel -r test
Kasutajana test
sisse logimine: su - test
(ja logige pärast välja ka exit
käsuga, et mitte endale segadust tekitada).
Moodustage python käsu abil endale teadaoleva parooliga räsi, pange see testkasutajale /etc/shadow
faili. Ettevaatust shadow faili redigeerimisel - ärge muutke muid ridu ega modifitseerige faili muid kohti! Teie peaksite ainult muutma viimases reas esimese ja teise kooloni :
vahele jääva olemasoleva räsi. Räsi saate luua käsuga:
python3 -c 'import crypt;print(crypt.crypt("parool", "$5$sool"))'
Nüüd veenduge, et testkasutaja saab "uue" (käsitsi üle kirjutatud) parooliga parool
sisse logida. su - test
Arutage sõbraga (sõbra puudumisel konsulteerige Googlega)
- Millist meetodit (mis algoritm ja mitme bitine) kasutab Linux Mint 21 vaikimis paroolide räsimiseks?
- Miks ei ole vaja kasutajate infot sisaldavas andmebaasis soola krüpteerida?
Paroolide murdmine
Eelmises punktis vaatasime kuidas paroole genereerida ja üle kirjutada meile teada olevaga, nüüd katsetame nende teada saamist (lahti häkkimist).
Kasutame Pythonis kirjutatud näitekoode, mis on enamuse osalejate jaoks tuttav programmeerimiskeel: bf1.txt. Need kasutavad seda sama crypt funktsiooni ning on seega sama funktsionaalsusega kui käsurealt kasutatud crypt või C-keele crypt. Enne käivitamist peab näidisfaili ümber nimetama ja siis python käsuga käsurealt käivitada:
$ mv bf1.txt bf1.py $ python3 bf1.py
NB! bf1.txt failis on taanded TAB
kasutades tehtud, kuid osad Linuxi tekstiredaktorid (näiteks xed
vaikimisi tekstiredaktor Linux Mint'is) panevad isegi TAB
klahvi vajutades ainult tühikuid. Seega veendu et Python koodis oleks kasutatud ainult TAB
või ainult tühikuid. Siinkohal soovitame kasutada näiteks TÜs loodud Thonny
nimelist tarkvara pythoni koodi redigeerimiseks sudo apt install thonny
- Ülesanne 1a: Modifitseerige programmi otsima 2, 3 ja 4-täheliste DES paroolidega ning leidke paroolid ( DES puhul 2 esimest tähemärki on sool näiteks "aa" esimese räsi korral, paroolide pikkused on vastavalt 2, 3, 4 tähemärki):
aaYnY9JY1skVY abpNtJ15XGZyU XZkMWgaNMr552
- Ülesanne 1b: Modifitseerige programmi otsima 2, 3 ja 4-tähelisi paroole ning leidke paroolid, mis vastavad räsidele:
$1$SoolSalt$6kodg6UCOHV2owr1QxUX60 $5$Andmeturve$aRN3yaCA0QP4tgVRUF6u8NxZS7o.OD2gAoSzj66wyS1 $6$SomethingHere$L5zuxicIHC90jGVZ9xgoOjUw36DjduwH1nPGJ.uwcgLqCvhlGe6wWp55eojE9jAIXxDbcsmbAKLXuXg2AbKZo0
Üldiselt ei tohiks "õige" parooli leidmisele python koodil kuluda kauem kui minut, seega kui kulub üle minuti, siis on teil koodis viga. Piisava aja ja katsetamise korral on võimalik nii enamik paroole "välja" arvutada, kuid praktikas kuluks mõistliku pikkusega parooli "ära arvamiseks" liialt palju aega ja arvutusvõimsust (raha).
Seda kas ka teie kasutajatunnused ja paroolid (parooli räsid) on lekkinud saate kontrollida lehel https://haveibeenpwned.com/ . Vastavate lehtede puhul on alati küsimus, et mida sisestatud e-mailidega peale hakatakse ja ega neid edasi ei müüda turunduse jms eesmärkidel, kuid https://haveibeenpwned.com/ on turul üks suurimaid ja suhteliselt usaldusväärne senimaani. Veebist leiab ka mitmeid erinevaid lehekülgesid (https://crackstation.net/ , https://www.onlinehashcrack.com/ , https://hashes.com jne), mis pakuvad nn räsi murdmise teenust kuhu saate laadida oma räsi, mida kontrollitakse olemasolevate tabelite (rainbow table) vastu ja mõne dollari eest saate paluda neil soovi korral ka proovida seda murda kui vastust eelnevalt välja pole arvutatud. Näitena võite proovida õppejõu e-maile alop@ut.ee
ja/või alo.peets@ut.ee
.
Paroolide murdmine tarkvaraga john
:
$ sudo apt install john
Tõmmake paroolifailid: des.txt, md5.txt
Tutvuge john
'i parameetritega ja kasutage seda tõmmatud paroolide murdmiseks. Kuna john
hoiab varasemalt murtud paroolid meeles, siis on võite enne uuesti kasutamist tema vahemälu kustutada, et ta lihtsad paroolid uuesti lahti murraks:
$ rm -rf /home/kasutaja/.john
Esialgu kasutage programmiga kaasasolevat (inglise) sõnastikku. Leidke sellega mõlemast failist paar parooli.
Nüüd tõmmake eesti keele sõnastik et.txt ja kasutage seda! (või leidke internetist mingi muu Eesti keelne sõnastik). Kui mõned paroolid leitakse, kirjutage nad kuhugi faili, neid on hiljem vaja. Jätke paroolimurdja tööle, las ta murrab edasi. Meie saame ka edasi minna.
- Ülesanne 2: Esitage vähemalt 3
eestikeelse sõnaraamatu
abil leitudDES
ja/võiMD5
parooli
Paroolide murdmine näidisveebilehel
Teie eesmärgiks on leida parool ning selle abil kohalikus veebiserveris jooksvasse veebilehte sisse logida. Veebiserveri käivitamiseks tõmmake virtuaalmasinasse fail andmeturve-praktikum2.jar. Käivitage veebiserver käsuga java -jar andmeturve-praktikum2.jar
ning avage veebibrauseris aadress localhost:8080/login
. Teie eesmärk on leida enda matriklinumbrile vastav parool, millega saate antud veebilehele sisse logida. Näidiskasutaja demo
ja parool joshua
võite kasutada katsetamiseks.
Seda ülesannet saab lahendada mitmel viisil. Meie soovitus on kasutada OWASP ZAP poolt pakutavat fuzzeri funktsionaalsust, mis võimaldab automatiseeritult erinevaid paroole katsetada veebilehtedel. Teie parool on juhuslikult valitud järgnevast failist: 10_million_password_list_top_10000.txt , mille peaksite fuzzer'ile ette andma.
ZAP ning fuzzeri funktsionaalsuse kasutamise kohta saate infot videost:OWASP ZAP - Easily Brute Force Web Portals. On oluline tähele panna, et lokaalne veebiserver jookseb pordil 8080 ning seetõttu peaksite andma ZAP jaoks mõne teise pordi, näiteks 8081
. Zap porti saate muuta nii: ZAP -> Tools -> Options -> Local proxies -> Port
. Täiendavalt tuleb ZAP -> Tools -> Options -> HUD -> Enable when using ZAP Desktop
eemaldada linnuke. Seejärel tuleb siis veebilehitseja (firefox) proxy seadetes
liiklus edasi suunata pordile 8081
, et ZAP seda näha saaks. NB! Proxy peate nii seadistama, et see töötaks ka localhosti jaoks. Tavaseadistusena proxy ei tööta localhost korral. Seega firefox
aadressiribale kirjutage about:config
-> Accept the Risk and Continue
-> otsige localhost
-> network.proxy.allow_hijacking_localhost
muutke true
. Kui see on tehtud, siis üritage veebilehele enda matriklinumbri ja suvalise parooliga sisse logida ning püüdke vastav päring ZAP-ga kinni ning alustage fuzzeri kasutamist. Fuzzer ei ütle otse, mis oli õige parool, see info tuleb fuzzeri väljundist ise leida. Lahenduseks esitage parool, millega saite edukalt demo-veebilehele sisse logida. Aegajalt ründed võtavad kauem aega ehk hoiatame et käesolevas harjutuses kulub keskmisel arvutil 10 000 parooli läbiproovimiseks umbes 30 minutit. Võite samal ajal kui ootate ära lahendada praktikumijuhendi viimase ülesande.
NB! Leiate enda matriklinumbri kõige mugavamalt courses veebilehel enda nime peal vajutades -> Minu andmed
. Teie kasutajatunnuseks olevas matriklinumbris kasutatud tähed on ka meie süsteemis suurtähtedena (näiteks "A51467"). Ühtlasi leiate sealt ka enda personaalse pseudonüümi, mille alusel avalikustame teie edenemise kursusel (hinded vastavas hindetabelis). Tudengid, kes registreerusid ainele pärast semestri algust (07.veebr) teid ei ole seal andmebaasis kasutage kasutajaid turve1
- turve5
.
- Ülesanne 3: Esitage OWASP ZAP abil leitud näidisveebilehelt
andmeturve-praktikum2.jar
endamatriklinumbrile
vastavparool
. Piisab kui on tekstikujul, ei ole vaja ekraanivaadet.
NB! Ärge unustage pärast ülesande lõpetamist veebilehitseja proxy
seadetes tehtud muudatused tagasi võtta.
Paroolihaldustarkvara KeePass
Eelnevates harjutustes nägime kui lihtne on "levinud" ja/või "lihtsaid" paroole ära arvata, kui süsteemi looja pole seadnud parooli katsetamise piiranguid. Samas inimese mälu ei ole ideaalne ja me kipume keerulisemaid paroole ära unustama. Seega vajame süsteemi (tarkvara), mis aitaks meil paroole turvaliselt meeles pidada (nn. paroolihaldur
). Lihtsaim paroolihalduse meetod on paber ja pliiats, mille turvalisus sõltub ennekõike sellest, kus sa paberit hoiad ning lisaks on võimalik mitte kirja panna kogu parool vaid näiteks parooli vihje, osa paroolist jne... Arvutis on mugavam kasutada tarkvara mis sinu eest paroole meeles peab ja sisestab kui on vaja ning vastavale tarkvarale ligipääs on piiratus master password
ehk ühe peamise parooliga.
Windowsi ja teiste levinud operatsioonisüsteemide jaoks on tasuta saadaval vabavaraline programm KeePass. Tarkvarast on olemas ka selle port (alternatiiv) KeePassXC, mis toetab sama andmebaasi formaati. Hetkel kasutavad suurem osa inimesi Keepass2 versiooni mis on mugavalt olemas ka enamikes Linuxi repositooriumides:
Harjutus:
- Installida
KeePass
ja proovida selle kasutamist.sudo apt install keepass2
- Käivitage
KeePass
- Looge uus paroolide andmebaas:
File
->New
->OK
->Sisestage andmebaasi faili nimi
->sisestage peavõti (master password)
. Võti ei tohiks olla lühike ja triviaalne, sellest sõltub kõikide teiste paroolide turvalisus.KeePass
kuvab parooli välja all ka visuaalselt parooli hinnangulist keerukust. On väga oluline, et te jätate peaparooli meelde. - Kui teete muudatusi, siis salvestage andmebaas:
File
->Save As
->(sisestage faili nimi)
->Save
- Lisage andmebaasi väljamõeldud konto koos parooliga:
Entry->Add Entry...
->Täitke olulised väljad ning proovige ka parooli genereerimist
. - Lukustage KeePass:
File
->Lock Workspace
- Proovige paroolide andmebaasi uuesti avada
- Ülesanne: looge
KeePass2
abil paroolide andmebaas ja esitage see praktikumi lahendusena.
Ülesande lahendus peab vastama järgmistele tingimustele:- Andmebaasi peavõtmeks on: "
turve
" (see on meelega liiga lühike, et teha lahenduste kontrollimine lihtsamaks) - Paroolide andmebaasis on teie lisatud väli.
- Välja nimeks
Title
olguteie Perenimi
- Välja kasutajatunnus
User name
olguteie Eesnimi
- Parool peab olema
vähemalt 30 kohaline
(võiksite proovida paroolide genereerimist). URL
peab olemahttps://courses.cs.ut.ee
- Andmebaasi peavõtmeks on: "
- Ülesanne 4: Esitage Keepass2 *.kdbx andmebaasifail, mis vastab ülesandes kirjeldatud nõuetele.
Praktikumi arvestuse saamiseks esitage:
Praktikumi ülesande lahendamine annab neli punkti ja esitamiseks on umbes kaks nädalat alates praktikumi toimumisajast ( 02. märts tähtajani).
- Ülesanne 1: Murtud paroolid (2-, 3- ja 4-tähelised) kokku
6
tükki japrogrammi kood
, mida kasutasite 4-kohaliste parooli räside murdmiseks tekstilisel kujul (mitte ekraanivaade) - 1p - Ülesanne 2: Esitage
john
'iga leitud vähemalt3
eestikeelse sõnaraamatu
abil leitudDES
ja/võiMD5
parooli. - 0.5p - Ülesanne 3: Esitage OWASP ZAP abil leitud näidisveebilehelt
andmeturve-praktikum2.jar
endamatriklinumbrile
vastavparool
. - 2p - Ülesanne 4:
KeePass2
abil loodud paroolide andmebaas*.kdbx
(mis vastab ülesande nõuetele). - 0.5p
Ülesannete lahendus lisage failina, arhiivina (kokkupakituna, ZIP, RAR, 7z), DOCX
, PDF
.
Viited
- Linuxi paroolihaldus
- Relevantsed artiklid
- Why passwords have never been weaker—and crackers have never been stronger (2012)
- Windowsi paroolide murdmisest (2012)
- The secret to online safety: Lies, random characters, and a password manager (2013)
- Websites, Please Stop Blocking Password Managers. It's 2015
- Once seen as bulletproof, 11 million+ Ashley Madison passwords already cracked (2015)
- Andrese lisamaterjalid
- XKCD
- Juhuslike paroolide genereerimine (kontrolli, et oleks HTTPS)