Wuwejův zápisník

Have I been pwned aneb Jak se dozvědět o ukradeném heslu (a co s tím)

22.08.2017 23:09, Wu | počítače | komentáře -

Hesla a účty se kradou, to je fakt, se kterým musíme všichni počítat. Na důležité účty používat dvoufaktorou autentikaci, nikdy nepoužívat stejné heslo k více účtům, mít hesla dostatečně složitá… A doufat, že stejně opatrný bude i server, na kterém jsme registrovaní – že nemá hesla někde v plaintextu, že používá důsledně https a tak podobně. U serverů totiž nic jiného než doufat jaksi nemůžeme.

Vlastně můžeme ještě něco, využít služeb serveru haveibeenpwned.com a zjistit, jestli náš účet už nefiguruje v některém z úniků. Troy Hunt tam shromažďuje seznamy adres a hesel a vy si můžete testnout, zda jste v bezpečí:

have i been pwned? NO

A nejen to, můžete tam svou e-mailovou adresu také zaregistrovat k pozdějšímu upozornění na pozitivní nález. Odešlete a v klidu na vše zapomenete, týdny a měsíce plynou… A pak to přijde.

Přijde mail se předmětem „You're one of 457,962,538 people pwned in the Anti Public Combo List data breach (unverified)“:

have i been pwned? YES

Krása. Když jsem se z prvního šoku otřepal, šel jsem se podívat do svého trezoru na hesla, na kolika webech mám jako klíč e-mailovou adresu. Osmdesát tři!

Jen si to představte, na všechny se přihlásit a měnit heslo… Tak dlouho jsem tu hrůzu odkládal, až server přišel s řešením – nabídl totiž ke stažení seznam všech hesel. Tedy jejich SHA1 hashů, aby nebyly zneužitelné, a samozřejmě bez emailových adres. I to ale pro moje účely stačí. Můžu si totiž ze svých účtů hashe postupně spočítat a když tam některý najdu, vím zároveň, který web byl kompromitován.

V linuxu je na sha1 příkaz sha1sum, je ale určený primárně na kontrolu souborů (sha1sum soubor.txt). Když jméno souboru nedostane, používá standardní vstup, kam můžeme heslo interaktivně vepsat (a ukončit vkládání pomocí odentrování a stiskem ctrl+d). Praktičtější ale bude poslat mu ho přes rouru, tedy echo mojeheslo | sha1sum. A výsledek chceme najít v souboru s hesly, takže přidáme ještě grep. Jemu hledaný řetězec musíme dát jako první parametr a k tomu nám poslouží opačný apostrof, který vloží výstup příkazu na své místo:

grep "`echo -n mojeheslo | sha1sum`" pwned-passwords-1.0.txt

(asi to není nejelegantnější, ale zato jsem to poskládal sám)

Horší je, že jedno heslo se na mém obstarožním stroji prohledává pět minut (aby také ne, je to půl miliardy řádků ve 12 GB souboru) a celé to opakovat více než osmdesátkrát je trochu moc. Takže se přece jen bez nějakého vylepšení neobejdeme.

Z trezoru si exportujeme CSV soubor all.csv, v LibreOffice Calc z něj uložíme dva soubory, jeden pouze s hesly (hesla.csv), druhý se zbytkem informací (weby.csv).

Ano, všechna hesla – když už to děláme strojově, proč se nedozvědět, která všechna už jsou v oběhu – a která tudíž může útočník použít jako databázi pro své pokusné lámání...

Vyrobíme si skript createhashes.sh, který si čte postupně všechny řádky ze vstupu, každý pošle na sha1sum a výsledek zapíše na výstup.

while read line
do
echo -n $line | sha1sum | awk '{ print $1 }'
done

  • zdroj https://stackoverflow.com/questions/5890136/hash-each-line-in-text-file
  • -n, aby nepočítal hash z konce řádku (Troy ho taky nepočítá, což se dá lehce zjistit z příkladu p@55w0rd na této stránce). No a kdybych si to přečetl dříve, věděl bych, že existuje jak webové API, tak možnost vyzkoušet si SHA1 svých hesel online. Ale co teď už s tím, že – skript už dodělám.)
  • awk '{ print $1 }', protože výstup sha1sum za spočítaný hash přidává tabelátor a jméno souboru, ze kterého četl, a toho se potřebujeme zbavit. Příkaz print $1 vypíše první blok textu před oddělovacím znakem, takže právě ten samotný hash.

Pak na skript pošleme hesla a výsledek uložíme do jiného souboru

cat hesla.csv | ./createhashes.sh > hesla_sha1.csv

Pak honem rychle bezpečně smažeme jak originální seznam všeho, tak hesla, protože něco takového se na disku nešifrované válet nesmí:

shred -u all.csv hesla.csv

A konečně můžeme prohledávat soubory. Grep umí převzít seznam frází ze souboru (-f) a hledat ve více souborech, což se nám hodí, protože hashe už měly dva updaty:

grep -f hesla_sha1.csv pwned-passwords-1.0.txt pwned-passwords-update-1.txt pwned-passwords-update-2.txt

Po půlhodině to… nenašlo nic! Protože v hashích jsou velká písmena, zatímco sha1sum generuje malá. Takže znovu, ještě s přepínačem --ignore-case.

grep --ignore-case -f hesla_sha1.csv pwned-passwords-1.0.txt pwned-passwords-update-1.txt pwned-passwords-update-2.txt

A pak už to začalo lítat. Každý nalezený hash jsem si našel v souboru hesla_sha1.csv, tím získal číslo řádku, na kterém jsou v souboru weby.csv všechny ostatní informace. A zbytek je jasný – posoudit, jestli hrozí nebezpečí, a když ano, tak heslo změnit na nějaké vygenerované a dostatečně složité.

(P.S. vypadá to na kompromitované diskuzní fórum)

12345
1503436140000

Kategorie

Informace

Kontakt

Sledujte také

Archiv

STRÁNKY ARCHIVOVÁNY NÁRODNÍ KNIHOVNOU ČR

CBDB.cz – Databáze knih a spisovatelů, knihy online