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
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).
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. Selleks, et seda rünnet vältida, tuleks paroolidele lisada enne räsimist sool ehk juhuslikkus.
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 kulukamaks. Näited sellistest funktsioonidest on PBKDF2, scrypt jt.
Paroolide räsid Linuxis
Märkus. Ärge muutke kasutajate "root" ja "kasutaja" paroole!
Märkus. Rooduna 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 roodul, seega minge ajutilselt rooduks (käsk su -
ja pärast lugemist logige root välja tagasi.) Lisainfot vastavate failide kohta leiate siit ja siit.
Tõmmake programm ctest.c või Python`i versioon * ja püüdke aru saada, mida see teeb. Kui te pole varem C keelt kasutanud, siis valige Pythoni versioon. Lugege juurde
$ man 3 crypt
C kirjutatud koodi tuleb kõigepealt kompileerida:
$ gcc -o ctest ctest.c -lcrypt
Kompileeritud programmi käivitamine:
$ ./ctest
- Muudke vastavalt kas C koodi või Pythoni koodi (tavakasutajana!) ning tehke katseliselt kindlaks, mitu märki paroolist läheb räsi moodustamisel arvesse DES räsi korral. DES korral on soola pikkuseks kaks sümbolit. Kompileerimiseks:
- Modifitseerige eelmist programmi, nii et tekiksid MD5 räsid. Mitu märki paroolist läheb siin arvesse?
Parooli muutmine
Tekitage rooduna kasutaja test, eemaldades enne sellise nimega kasutaja, kui ta olemas on:
# userdel -r test # adduser test
Kasutajana test sisse logimine: ssh test@localhost
(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 paste'ge faili algusse sodi! Nüüd veenduge, et testkasutaja saab nüüd selle parooliga sisse logida.
Arutage sõbraga (sõbra puudumisel konsulteerige Googlega)
- Millist meetodit (mis algoritm ja mitme bitine) kasutab Linux Mint 18.3 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). Tõmmake programm bf1.c või Python`i versioon * ja uurige seda. Mida see teeb? Uurige, kuni aru saate.
Modifitseerige programmi otsima 2, 3 ja 4-tähelisi paroole ning leidke paroolid, mis vastavad räsidele:
$1$aNbmTurV$mLzV2Y3DEUzjrGWxqidkc. $1$aKi7/s7p$jqodZnL6uczcgcfbVNwIK/ $1$Sto/sxpN$QwYPjCQZf1JgjeQi6NB/s0
Modifitseerige programme töötama DES paroolidega ning leidke paroolid:
sajERk4vfHJHw sXTdSnbUURssc a066OgfSG5ZXk
Paigaldage paroolimurdja john
:
$ sudo apt install john
Tõmmake paroolifailid: des.txt, md5.txt (md5 fail on suur, võtke sellest ainult mingi osa!)
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 minimaalselt kolm parooli. Kirjutage kasutajanimed ja neile vastavad paroolid üles, seda läheb hiljem vaja praktikumiülesande lahenduse esitamiseks.
Nüüd tõmmake eesti keele sõnastik et.dic ja kasutage seda! (või leidke internetist mingi muu 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.
Paroolihaldustarkvara KeePass
Windowsi jaoks on tasuta saadaval vabavaraline programm KeePass. Linuxi ja Mac OS jaoks on olemas selle port KeePassX, mis toetab sama andmebaasi formaati.
Harjutus:
- Installida
KeePass
ja proovida selle kasutamist. - Käivitage
KeePass
- Looge uus paroolide andmebaas:
File
->New database
->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 (KeePassX seda omadust ei ole). On väga oluline, et te jätate peaparooli meelde, kui te tahate edaspidi oma paroolide andmebaasi kasutada. - Salvestage andmebaas:
File
->Save Database As
->(sisestage faili nimi)
->Save
- Lisage andmebaasi väljamõeldud konto koos parooliga:
Entries
->Add New Entry...
->Täitke olulised väljad ning proovige ka parooli genereerimist
. - Lukustage KeePass:
File
->Lock Workspace
- Proovige paroolide andmebaasi uuesti avada
- Ülesanne: looge
KeePass
võiKeePassX
abil paroolide andmebaas ja esitage see praktikumi lahendusena. (0.5p)
Ülesande lahendus peab vastama järgmistele tingimustele:- Andmebaasi peavõtmeks on: "
turve123
" (see on meelega liiga lühike, et teha lahenduste kontrollimine lihtsamaks) - Paroolide andmebaasis on ainult üks väli.
- Välja nimeks olgu
teie nimi
jamatriklinumber
- Parool peab olema
vähemalt 30 kohaline
(võiksite proovida paroolide genereerimist).
- Andmebaasi peavõtmeks on: "
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
MD5
paroolid (2-, 3- ja 4-tähelised) - murtud
DES
paroolid (2-, 3- ja 4-tähelised) john
'iga leitud paroolid (vähemalt 3 parooli mõlema faili kohta).KeePassX
abil loodud paroolide andmebaas
Lahendusi võtame vastu järgmistes failiformaatides: .txt, .pdf, .zip ja .kdbx.
2. 2. Paroolid - praktikumi ülesanneKodune ü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 hw2_2018.jar. Kõigepealt paigaldage java jre käsuga sudo apt install default-jre
. Nüüd käivitage veebiserver käsuga java -jar hw2_2018.jar
ning avage veebibrauseris aadress localhost:8080/login
. Teie eesmärk on leida enda matriklinumbrile vastav parool, millega saate antud veebilehele sisse logida.
Seda ülesannet saab lahendada mitmel viisil. Üks võimalus on kasutada OWASP ZAP poolt pakutavat fuzzeri funktsionaalsust, mis võimaldab automatiseeritult erinevaid paroole katsetada. Teie parool on juhuslikult valitud järgnevast failist: 10_million_password_list_top_10000.txt. Soovitame paigalda ZAP Core
, mis ei nõua installeerimist ja seega säästab aega. Pärast ZAP Core allalaadimist tuleks tar fail lahti pakkida ja käivitada java -jar zap-2.7.0.jar
. Selleks, et vastavale ZAP versioonile lisada fuzzeri funktsionaals tuleb paigalda sobiv plugin: ZAP help menüüst -> check for updates -> marketplace -> install AdvFuzzer
.
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: Options -> Local proxy -> Port
. Samuti tuleb siis brauseri 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. 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: .txt, .pdf.
17. 2. Parooli leidmine - kodune ülesanne2. Vabatahtlik lisaülesanne - MySQL paroolide murdmine
Iseseisev töö - Mysql paroolid (tõenäoliselt siia ei jõua, seega võite iseseisvalt kodus proovida)
INSERT INTO admin_users VALUES (1,'anc','4cb9cb864c8eb861','Hans xxxxx','hans@xxxx.ee','Y','2'); INSERT INTO admin_users VALUES (2,'m1','6ee3588f38153ecb','Martin xxxxx','', 'Y','2'); INSERT INTO admin_users VALUES (3,'hannes','143f67237e902da2','Hannes xxxxx', '','Y','2');
(tõmmake john-the-ripperi lähtetekst, mysql paroolide patch, google!)
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)