Institute of Computer Science
  1. Courses
  2. 2018/19 spring
  3. Computer Security (LTAT.06.002)
ET
Log in

Computer Security 2018/19 spring

  • Pealeht
  • Loengud
  • Praktikumid
  • Referaat
  • Kirjandus
  • Uudised
  • Lingid

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.


Allikas: Wikimedia

Krüptograafias kasutatakse räsifunktsioone mitmel pool ning sellistel räsifunktsioonidel on nõutud teatavad omadused:

  1. Ühesuunalisus (one-wayness): räsifunktsiooni väljundist ei saa tuletada sisendit, st räsifunktsioon ei ole pööratav.
  2. Lisaoriginaalikindlus (second pre-image resistance): teades räsifunktsiooni sisendit on raske leida mõni teine sisend, mis annaks samasuguse väljundi.
  3. 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äsifunktsioonLause räsi
MD58727dc1ee0fd84c1e0d2d38cb02dfea0
SHA-17c32ae747dd38b6567ba86cce3bbe2f0323246ab
SHA-256017c36232edeac0f0b4c93b8d8e5e69c81799c3d8db32705ff60136148bcde0e

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 käsuga gcc - GNU project C and C++ compiler. Enne seda aga peaks installeerima kompilaatorile vajalik teek build-essential

$ sudo apt-get install build-essential
$ gcc -o ctest ctest.c -lcrypt

Kompileeritud programmi käivitamine:

$ ./ctest
  1. 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.
  2. Lugege funktsiooni crypt manuaali man crypt ning 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@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 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)

  1. Millist meetodit (mis algoritm ja mitme bitine) kasutab Linux Mint 18.3 vaikimis paroolide räsimiseks?
  2. 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ä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:

  1. Installida KeePass ja proovida selle kasutamist.
  2. Käivitage KeePass
  3. 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 (KeePassX seda omadust ei ole). On väga oluline, et te jätate peaparooli meelde, kui te tahate edaspidi oma paroolide andmebaasi kasutada.
  4. Kui teete muudatusi, siis salvestage andmebaas: File -> Save As -> (sisestage faili nimi) -> Save
  5. Lisage andmebaasi väljamõeldud konto koos parooliga: Edit->Add Entry... -> Täitke olulised väljad ning proovige ka parooli genereerimist.
  6. Lukustage KeePass: File -> Lock Workspace
  7. Proovige paroolide andmebaasi uuesti avada
  8. Ülesanne: looge KeePass või KeePassX 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 ja matriklinumber
    • Parool peab olema vähemalt 30 kohaline (võiksite proovida paroolide genereerimist).

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:

  1. murtud MD5 paroolid (2-, 3- ja 4-tähelised)
  2. murtud DES paroolid (2-, 3- ja 4-tähelised)
  3. john'iga leitud paroolid (vähemalt 3 parooli mõlema faili kohta).
  4. KeePassX abil loodud paroolide andmebaas

Lahendusi võtame vastu järgmistes failiformaatides: .txt, .pdf, .zip ja .kdbx.

2. Praktikum 2 - Paroolid
Solutions for this task can no longer be submitted.

Kodune ü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_2019.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 hw2_2019.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 auburn võite kasutada katsetamiseks.

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: Tools -> Options -> Local proxies -> 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: esitluse kommentaar, .txt, .pdf.

17. Kodune ülesanne 2
Solutions for this task can no longer be submitted.

NB! Ärge unustage pärast ülesande lõpetamist brauseri proxy seadetes tehtud muudatused tagasi võtta.

2. 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
    • Selgitus /etc/passwd faili kohta
    • Selgitus /etc/shadow faili kohta
    • Wikipedia artikkel /etc/passwd ja /etc/shadow kohta
    • pam_passwdqc dokumentatsioon
  • 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
    • Kuidas jätta meelde keerulisi paroole
    • Miks mitte kasutada samu paroole erinevatel veebilehtedel
  • Juhuslike paroolide genereerimine (kontrolli, et oleks HTTPS)
    • https://www.random.org/strings/
    • https://www.grc.com/passwords.htm

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment