私がそうであるようにWordCampsに行くことを楽しむなら、あなたはおそらくすでにこれを聞いた:”WordPressのパスワードハッシュは安全ではありません”、または最も技..それはmd5ベースであるため、”。
確かに、強力なパスワードハッシュは、常にハッカーのためのジューシーなターゲットとなっているWordPressのような大規模なエコシステムのために重要です。 だから、私はハッシュシステムを詳しく見て、WordPressのハッシュを最初から解読しようとすることにしました!
WordPressのパスワードハッシュを理解する
私はいくつかのグーグルを始め、そこにある情報のほとんどが一般的で混乱していることがわかりました。 使用されているPHPライブラリへの参照がたくさんあります(phpassのportable hash)が、実際には具体的なものはありません。
私は仮定から別のアプローチを取ることにしました:
ハッシュは一方向のプロセスですが、WordPressはパスワード入力とデータベースに格納されているハッシュと一致するユーザーを認証することができます
そこから、コードをチェックし始め、最初の興味深い関数を見つけました。wp_check_password($password,$hash)
プレーンテキストのパスワードをハッシュと比較し、一致する場合はtrueを返します。
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 );
コードを調べると、すぐにCheckPassword
、crypt_private
、encode64
に移動します。
長い話を簡単にすると、crypt_private($password, $stored_hash)
は保存されたハッシュと比較される前にパスワードを再ハッシュします。 一致する場合は、パスワードが正しく、認証が行われます。 つまり、その関数を使用してハッシュを解読することもできます。
ハッシュ>
これはワードプレスのハッシュです:
1$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1
簡単にするために、このサイトではPHP>5と最も一般的な設定である最新のphpass portable hashを使用していると仮定します。
最初の3文字$P$
はIDであり、どの種類のハッシュがあるかをシステムに伝えます。
文字番号3(0からカウント)は、md5()が入力文字列を処理する回数を決定するために使用されます。
4から12までの文字nPVO4gP9
はsaltであり、ハッシュの前にパスワードに追加されたランダムな文字列であり、よりランダム性を与えます。 たとえば、あなたのパスワードがadminの場合、それはnpvo4gp9adminになってからハッシュされます。
ハッシュの残りの部分JUMSAM1WlLTHPdH6EDj4e1
は、文書化されていないencode64
関数で渡されたsalt+passwordによって生成される実際のランダム性です。
それは明確ではない、ええと? 私と一緒に固執します。
これまでのところ、私たちは知っています:
- ハッシュの最初の部分は固定id
- 第二は、カウンタとして使用される単一の文字であり、また固定
- 第三は、パスワードに縛ら塩であり、
- 最後は、ランダムであり、encode64関数によって処理された’salt+pass’によって生成された。
1
だから、私たちは論理を書き直すことができます-salt+パスワードはX回ハッシュし、encode64で渡されました-辞書やbruteforce攻撃を実行し、ハッシュの同じ”最後の部分”を取得し、それは成功したハッシュクラックになるでしょう!
実際のシナリオでは、パスワードマネージャーによって生成されることが多いため、サイト固有のランダムなパスワードではなく、再利用される可能性が高
golangを使用したencode64の書き換え
golangは非常に高速であり、大きなパスワード辞書を計算するにはその速度が必要であるため、golangを使用することにしました。
WordPressの暗号化手順と同じように、スクリプトはハッシュを取り、saltを分離し、辞書内のすべてのパスワードを試行し、md5ハッシュX回数を試行するパスワード(salt+pass)を構成し、Xがどのように決定されるかを見てきました。
1itoa64 := "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 2hashloop := 1 << strings.Index(itoa64, string(hash)); // char n. 4 in the hash
これを行うと、PHPでord()を使用して取得したバイトに対して一連のビット単位の演算が実行されますが、これはすでにバイト値があるため、golangでは必:
1itoa64 & 0x3f]
この時点で、文字列全体を見つける必要さえないことに気付きました。 パスワード全体を一致させ、スクリプトをより高性能にするには、いくつかの文字を一致させるだけで十分です! したがって、ハッシュプロセスの性質上、char nの場合。0 / 4 / 8 ……. 一致する場合、入力として渡されたパスワードは正しいです。
そして、私たちはハッシュをクラックしました:
1wphashcrash '$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1' Dev/wphashcrash/dict.txt 2$P$BnPVO4gP9JUMSAM1WlLTHPdH6EDj4e1 admin 32020/05/30 12:44:15 Executed in 0.000221
コードはGitHubの通常のとおりです-https://github.com/francescocarlucci/wphashcrash-現時点では、スクリプトはPOCであり、入力として単一のパスワードハッシュとパスワード辞書へのパスのみを取得します。
私はすでにreadmeで持っているといいだろういくつかの改善を概説し、私はおそらく将来的に追加します。
あなたが本当にハッシュのリストをハックしようとしたい場合は、それをフォークするか、単にbash forループでスクリプトをラップすることができます。
Secuirty considerations
この時点で、攻撃者がWordPressサイトのデータベースにアクセスすると、基本的にすべての弱いパスワードを解読できることは十分に明らかだと思います。
この不幸な、特に理由:
- Sqlインジェクションは、WordPressのプラグインではそれほど珍しいことではありません
- Rceは、DBへのアクセスを許可する可能性が最も高い
- WordPressのエコシステムは、フリーランサーの仕事のための巨大な領土であり、一時的なニーズのために作成された古い/未使用のwp-adminおよびFTPアカウントを見つけることは非常に一般的です
この最後のポイントは、wordpressの一般的な問題であるユーザー列挙と組み合わせて、WordPressの一般的な問題であるユーザー列挙と組み合わせて、この最後のポイントは、WordPressの一般的な問題である。盗まれた/質入れされた管理者の資格情報を使用してDBへのアクセスを得るためのドアが開きます。
これに加えて、多くのウェブサイトは、ユーザーエクスペリエンスを傷つけないように強力なパスワードを強制しておらず、私は上記の点のいずれかで直接の経験を持っています。
ウェブサイトが侵害されると、弱いハッシュが保存されていると、攻撃者はパスワードを再利用する傾向があり、彼らが知っている場合、他のサイト上の他のユーザーアカウントを侵害することができます。
解決策はありますか?
私の研究はそこまで行っていなかった、私はWordPressのハッシュを破る方法を見たかっただけです。
bcryptはmd5と比較してより強力なハッシュメソッドであることが知られており、bcryptを使用し、パスワードを処理するために必要なすべてのコア関数を置:
- wp_check_password()
- wp_hash_password()
- wp_set_password()
- wp_set_password()
- ()
もちろん、開発者として独自のソリューションを書くこともできますが、これは大規模な採用を目指すためにコアレベルで修正する問題だと思います。
Final note
hashcatやJohn The Ripperのように、ハッシュをクラックするためのツールはたくさんありますが、これもまた、この研究の範囲はWordPressのハッシュ構造を理解し、それをゼロからクラッキングすることです。