Paroolide murdmine
Ettevalmistus
- 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).
Krüptograafiline räsifunktsioon
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 ühele räsifunktsiooni väljundile vastab lõpmata palju sisendeid. Oluline on 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 effektiivseks 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.
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 programmerunud ärge kartke järgnevalt tteme ainult väikesi muudatusi koodi, millega võiksite kenasti eelneva kogemuseta hakkama saada. Siinkohal kasutame C-keelt sest suurem osa Linux'ist 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
$ sudo apt install build-essential $ gcc -o ctest ctest.c -lcrypt
Kompileeritud programmi käivitamine:
$ ./ctest
- Muudke vastavalt kas C koodi 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 üksteisele järgnevat ridacrypt
käsust kus iga järgnev on ühe võrra pikema parooliga. - Lugege funktsiooni
crypt
manuaaliman crypt
ning modifitseerige eelmist programmi, nii et tekiksid MD5 räsid. Mitu märki paroolist läheb siin arvesse?
Parooli muutmine
Tekitage root-kasutaja test, eemaldades enne sellise nimega kasutaja, kui ta olemas on:
# userdel -r test # adduser test
Kasutajana test sisse logimine: ssh test@kasutaja-virtualbox
(ja logige pärast välja ka, et mitte endale segadust tekitada).
Moodustage programmi 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! Nüüd veenduge, et testkasutaja saab "uue" (käsitsi üle kirjutatud) parooliga sisse logida.
Arutage sõbraga (sõbra puudumisel konsulteerige Googlega)
- Millist meetodit (mis algoritm ja mitme bitine) kasutab Linux Mint 19 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 jaoks tuttav programmeerimiskeel: ctest.txt ja 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 võib need failid ümber nimetada ja siis python käsuga käsurealt käivitada:
$ mv ctest.txt ctest.py $ python ctest.py
NB! bf1.txt failis on taanded TAB
kasutades tehtud, kuid osad Linuxi tekstiredaktorid (näiteks xed
) panevad isegi TAB
klahvi vajutades ainult tühikuid. Seega veendu et Python koodis oleks kasutatud ainult TAB
või ainult tühikuid.
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):
aad5xQNvqUNT2 abCu5BZmWWFJU XYpZI5NBd2EgE
Modifitseerige programmi otsima 2, 3 ja 4-tähelisi paroole ning leidke paroolid, mis vastavad räsidele:
$1$andmturv$XgasHogvAwn83coENX2yn1 $5$soolSOOL$lNrYIlhaWXv9Q24Hg7zDUcKnvJ8dB3W.zJcDv5HFEN3 $6$aSdfgHj$3dV8QIKhyKVFi2zL7yXcaAbKLG0YUQT4CsukYt8i6jaZVxCucWeL0pjCpbKVcv9gV5tZDnT.Mayqi0sUh9j4R1
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://hashes.org , https://cracker.offensive-security.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.
Paigaldage paroolimurdja 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.dic 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.
Esitage vähemalt 3 eestikeelse sõnaraamatu
abil leitud DES
ja/või MD5
parooli
Paroolihaldustarkvara KeePass
Windowsi ja teiste levinud operatsioonisüsteemide jaoks on tasuta saadaval vabavaraline programm KeePass. Linuxi ja Mac OS jaoks on olemas selle port KeePassX, 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:
Edit->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. (0.5p)
Ülesande lahendus peab vastama järgmistele tingimustele:- Andmebaasi peavõtmeks on: "
turve2020
" (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 matriklinumber
- Parool peab olema
vähemalt 30 kohaline
(võiksite proovida paroolide genereerimist). URL
peab olemahttps://andmeturve.ut.ee
- Andmebaasi peavõtmeks on: "
Esitage Keepass2 *.kdbx andmebaasifail mis vastab ülesandeskirjeldatud nõuetele.
1. Vabatahtlik lisaülesanne - paroolipoliitika
Siit edasi on mittekohustuslik osa. Sunnime paroolipoliitika abil kasutajaid turvalisi paroole kasutama. Selleks paigaldame ühe PAM-i lisamooduli:
# apt install libpam-passwdqc
Tutvuge dokumentatsiooniga:
$ man pam_passwdqc
Kehtestage paroolile nõuded - otsige failist /etc/pam.d/common-password
üles rida, mis sisaldab pam_passwdqc.so ning lisage sinna lõppu parameetreid juurde, et see näeks umbes selline välja:
password requisite pam_passwdqc.so min=disabled,24,12,8,7 max=100 passphrase=3 match=4 similar=deny enforce=everyone
Testige paroolipoliitikat, logides sisse oma kasutajana test ning muutes parooli. Proovige nõudeid muuta.
Esialgse paroolipoliitika taastamiseks eemaldame süsteemist paigaldatud PAM mooduli:
# apt remove libpam-passwdqc
Kui apt
küsib Override local changes made to /etc/pam.d/common-*?, siis vastake Yes ning kontrolliga üle, et failis /etc/pam.d/common-password
ei oleks enam rida, kus on pam_passwdqc.so ning rida, kus on pam_unix.so, peaks välja nägema selline:
password [success=1 default=ignore] pam_unix.so obscure sha512
Vajadusel eemaldage pam_passwdqc.so-ga rida ning üleliigsed parameetrid pam_unix.so-ga reast.
Logige root välja.
Tagasiside
Praktikumi lõpus palume anda tagasisidet, sest see võimaldab meil antud praktikumi ja ka järgmisi praktikume paremaks muuta. Tagasiside on anonüümne ja tagasiside vormi leiate järgneva lingi abil: tagasiside ankeet.
Praktikumi ülesanded
Praktikumi ülesannete lahendamine annab kaks punkti. Praktikumi ülesanne võiks valmis saada praktikumi lõpuks, aga juhul kui see ei õnnestu, siis on võimalik lahendust esitada 7 päeva jooksul praktikumi toimumisest.
Praktikumi arvestuse saamiseks esitage:
- murtud paroolid (2-, 3- ja 4-tähelised) kokku
6
tükki - Programmi kood mida kasutasite 4-kohaliste parooli räside murdmiseks tekstilisel kujul (mitte ekraanivaade)
john
'iga leitud paroolid (vähemalt 3eestikeelse sõnaraamatu
abil leitudDES
ja/võiMD5
parooli).KeePass2
abil loodud paroolide andmebaas *.kdbx (mis vastab ülesande nõuetele).
Lahendusi võtame vastu järgmistes failiformaatides: .txt, .pdf, .zip ja .kdbx.
4. Praktikum 4 - ParoolidKodune ülesanne
Koduse ülesande lahendamine annab ühe punkti. Lahenduse esitamiseks on aega üks nädal, s.t selle päeva lõpuks, mil on järgmine praktikum. Koduse ülesande lahendus tuleks esitada aine kodulehelt. Küsimustele vastuste leidmiseks võib vaja minna lisamaterjalide, mille leiate allpool olevatest viidetest.
Teie eesmärgiks on leida parool ning selle abil kohalikus veebiserveris jooksvasse veebilehte sisse logida. Veebiserveri käivitamiseks tõmmake virtuaalmasinasse fail praks4.jar. Kõigepealt paigaldage java jre käsuga sudo apt install openjdk-8-jre
ja sudo update-alternatives --config java
sisestage JAVA 8
ehk java versioonile 1.8
vastav number 2
vms. Nüüd käivitage veebiserver käsuga java -jar praks4.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 street
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 veebilehele sisse logida.
NB! Teie kasutajatunnuseks olevas matriklinumbris kasutatud tähed on ka meie süsteemis suurtähtedena (näiteks "A51467").
Lahendusi võtame vastu järgmistes failiformaatides: esitluse kommentaar, .txt, .pdf.
19. Kodune ülesanne 4 - bruteforceNB! Ärge unustage pärast ülesande lõpetamist veebilehitseja proxy seadetes tehtud muudatused tagasi võtta.
3. Alternatiivsed Python`is kirjutatud programmid
* Keeles C kirjutatud näiteprogrammide asemel võib kasutada ka Pythonis kirjutatud alternatiive: ctest.txt ja bf1.txt. Need kasutavad seda sama crypt funktsiooni ning on seega sama funktsionaalsusega. Enne käivitamist võib need failid ümber nimetada ja siis python käsuga käsurealt käivitada:
NB! bf1.txt failis on taanded TAB
kasutades tehtud, kuid osad Linuxi tekstiredaktorid (näiteks xed
) panevad isegi TAB
klahvi vajutades ainult tühikuid. Seega veendu et Python koodis oleks kasutatud ainult TAB
või ainult tühikuid.
$ mv ctest.txt ctest.py $ python ctest.py
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)