jos nautit WordCamps kuten minä, olet luultavasti kuullut tämän jo: ”WordPress salasana hashtashing ei ole turvallinen”, tai kaikkein tekninen versio:”…koska se on md5-pohjainen”.
totta tai ei, vahva salasanojen hashing on ratkaisevan tärkeää suuren ekosysteemin kuten WordPress one, joka on aina ollut mehukas kohde hakkereille. Niin, päätin tarkastella lähemmin tiivistysjärjestelmä ja yrittää murtaa WordPress hashes tyhjästä!
WordPressin salasanojen ymmärtäminen
aloin tehdä googlausta ja huomasin, että suurin osa tarjolla olevasta tiedosta on geneeristä ja hämmentävää. Paljon viittauksia käytettyihin PHP-kirjastoihin (portable hash from phpass), mutta ei mitään konkreettista.
päätin ottaa toisenlaisen lähestymistavan aloittaen oletuksesta:
hashtashing on yksisuuntainen prosessi, mutta WordPress pystyy jollain tavalla todentamaan käyttäjät, jotka vastaavat salasanasyöttöään tietokantaan tallennettuun hasikseen
sieltä aloitin koodin tarkistamisen ja löysin ensimmäisen mielenkiintoisen funktion: wp_check_password($password,$hash)
, joka vertaa pelkkää tekstiä olevaa salasanaa hasikseen ja palauttaa true jos ne vastaavat.
1// presume the new style phpass portable hash. 2if ( empty( $wp_hasher ) ) { 3 require_once ABSPATH . WPINC . '/class-phpass.php'; 4 // By default, use the portable hash from phpass. 5 $wp_hasher = new PasswordHash( 8, true ); 6} 7 8$check = $wp_hasher->CheckPassword( $password, $hash ); 9 10/** This filter is documented in wp-includes/pluggable.php */ 11return apply_filters( 'check_password', $check, $password, $hash, $user_id );
koodin läpikäyminen vie meidät nopeasti CheckPassword
, crypt_private
ja encode64
, jossa periaatteessa taika tapahtuu.
pitkä tarina lyhyesti, crypt_private($password, $stored_hash)
virittää salasanan uudelleen ennen kuin sitä verrataan tallennettuun hasikseen. Jos ne täsmäävät, salasana on oikea ja tunnistautuminen jatkuu. Se tarkoittaa, että voimme käyttää sitä myös hasiksen murtamiseen.
hasiksen anatomia
tämä on WordPress-hasista:
1$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1
yksinkertaisuuden vuoksi oletamme, että sivusto käyttää PHP>5: tä ja uusinta phpass portable hash-sovellusta, joka on yleisin asennus.
ensimmäiset 3 merkkiä $P$
ovat tunnus, joka kertoo järjestelmälle, minkälainen oh hash meillä on.
merkkiä 3 (lasketaan 0: sta) käytetään määrittämään, kuinka monta kertaa MD5: n() on käsiteltävä tulomerkkijonoa.
merkit 4-12 nPVO4gP9
ovat suola, joka on satunnainen merkkijono, joka liitetään salasanaan ennen tiivistämistä, jotta se olisi satunnaisempi. Esimerkiksi, jos salasanasi on admin, se saa kääntyi nPVO4gP9admin ja sitten hashed.
jäljelle jäävä osa fo hash JUMSAM1WlLTHPdH6EDj4e1
on todellinen satunnaisuus, joka syntyy salt+ – salasanalla, joka kulkee paperittomassa encode64
– funktiossa, joka suorittaa joitain bitwise-operaatioita syöttömerkkijonolla ja palauttaa 22 merkin tulosteen.
ei niin selvää, uh? Pysy kanssani.
toistaiseksi tiedetään:
- hasiksen ensimmäinen osa on kiinteä tunnus
- toinen on laskurina käytetty yksittäinen merkki, myös kiinteä
- kolmas on salasanaan sidottu suola
- viimeinen on satunnainen, jonka tuottaa koode64-funktiolla käsitelty ”salt+pass”
1
niin, voimme uudelleen kirjoittaa logic-salt+salasana hashed x kertaa ja läpäissyt encode64 – suorittaa sanakirjan tai bruteforce hyökkäys, ja saada sama ”viimeinen osa” hash ja että olisi onnistunut hash crack!
tosielämän skenaariossa, ja hakkerit olisivat kiinnostuneempia heikkojen salasanojen löytämisestä, koska niitä käytetään todennäköisemmin uudelleen satunnaisten salasanojen sijaan, jotka ovat usein salasananhallintaohjelman luomia ja siten sivustokohtaisia.
kirjoitettaessa uudelleen koodia64 käyttäen golangia
päätin lähteä golangin mukaan, koska se on hyvin nopea, ja tarvitsemme kaiken tuon nopeuden suurten salasanasanakirjojen laskemiseen.
aivan kuten WordPress salaus menettely, skripti ottaa hash ja eristää suolaa, sitten se muodostaa salasanan (salt+pass) yrittää jokainen salasana sanakirjassa ja md5-hashing X useita kertoja, ja olemme nähneet, miten X määritetään.
1itoa64 := "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 2hashloop := 1 << strings.Index(itoa64, string(hash)); // char n. 4 in the hash
Näin tehdessään se suorittaa sarjan bitwise-operaatiota tavuille, jotka on saatu PHP: ssä ord: llä (), jota emme tarvitse golangissa, koska meillä on jo tavuarvot:
1itoa64 & 0x3f]
tässä vaiheessa tajusin, ettei meidän tarvitse edes löytää koko narua. Riittää vastaamaan muutamia merkkejä vastaamaan koko salasana ja tehdä skripti enemmän performant! Tiivistämisprosessin luonteen vuoksi, jos näin on. 0 / 4 / 8 … täsmää, salasana syötettynä on oikein.
and BOOM, we cracked the hash:
1wphashcrash '$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1' Dev/wphashcrash/dict.txt 2$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1 admin 32020/05/30 12:44:15 Executed in 0.000221
koodi on tuttuun tapaan GitHubissa – https://github.com/francescocarlucci/wphashcrash – ja tällä hetkellä skripti on POC ja saa syötteeksi vain yhden salasanan hashin sekä salasanan sanakirjan polun.
hahmottelin jo readmessa joitakin parannuksia, jotka olisi kiva saada ja lisään todennäköisesti tulevaisuudessa.
jos todella haluat yrittää hakkeroida hash-listan, voit haarukoida sen tai vain kääriä käsikirjoituksen bash for loopiin.
Secuirty considerations
tässä vaiheessa mielestäni on riittävän selvää, että jos hyökkääjä pääsee tietokantaan WordPress-sivustolla, hän/hän voi periaatteessa murtaa jokaisen heikon salasanan.
tämä valitettavaa, varsinkin koska:
- SQL Injection ei ole niin harvinainen WordPress plugins
- RCE myös todennäköisesti myöntää pääsyn DB
- WordPress ekosysteemi on valtava alue freelancerin työtä ja on hyvin yleistä löytää vanhoja/käyttämättömät wp-admin ja FTP tilit, luotu tilapäisiin tarpeisiin
tämä viimeinen kohta, yhdistettynä käyttäjän luettelointi joka WordPress yhteinen ongelma, jättää oven auki päästä käsiksi db varastettujen/pantattu admin tunnistetiedot.
tämän lisäksi monet sivustot eivät pakota vahvoja salasanoja, jotta käyttäjäkokemusta ei vahingoitettaisi, ja minulla on suoraa kokemusta mistä tahansa mainituista kohdista.
kun sivusto on vaarantunut, heikot Tiivisteet tallentavat hyökkääjät voivat vaarantaa muiden käyttäjätilien käytön muilla sivustoilla, jos heillä on tapana käyttää salasanoja uudelleen, ja tiedämme, että he käyttävät.
onko meillä ratkaisuja?
tutkimukseni ei mennyt niin pitkälle, halusin vain nähdä, miten murtaa WordPress-Tiivisteet.
Bcrypt tunnetaan vahvempana tiivistysmenetelmänä verrattuna MD5: een, ja olemassa on liitännäinen, joka käyttää bcryptiä ja korvaa kaikki salasanojen käsittelyyn tarvittavat ydintoiminnot:
- wp_check_password ()
- wp_hash_password ()
- wp_set_password()
ja tietenkin, voit kirjoittaa oman ratkaisun kehittäjänä, mutta uskon, että tämä on ongelma korjata ydintasolla tavoitteena suuri hyväksyminen.
Loppuhuomautus
on olemassa monia työkaluja hashien murtamiseen, kuten Hashcat ja John the Ripper, jotka voivat olla vielä suorituskykyisempiä, mutta tässäkin tutkimuksessa on kyse WordPressin hash-rakenteen ymmärtämisestä ja sen murtamisesta tyhjästä.
Kiitos lukemisesta.
frenxi