パスワードクラック
パスワードクラックの種類
推測によるパスワードクラック(類推攻撃)
誕生日やユーザIDなどからパスワードを推測する。
辞書攻撃
辞書ファイル(パスワードに使われそうな単語を登録したもの)を使用した攻撃
総当り攻撃(ブルートフォース)
文字種すべての組み合わせを試す方法。
パスワードリスト攻撃
どこかのサイトから漏洩したユーザIDとパスワードのリストをもって、
他のサイトのログインを試みる方法
事前計算攻撃
盗聴などで入手したハッシュ値に変換されたパスワードを解析する方法。
事前にパスワードとなりうる文字列のハッシュ値を計算しておき、テーブルで保持する。
ハッシュ値に変換されたパスワードと事前計算しておいたテーブルを比較することでパスワードを割り出す攻撃。
膨大なストレージを必要とする。
レインボー攻撃
事前計算攻撃を改善したもの。ストレージがいくらか減らす事ができる。
ハッシュ化関数H()と、ハッシュ値から平文を作り出す関数R()があるとする。
※H()で作成したハッシュをR()に入れても元の平文を得られるものではない。
・以下の手順でテーブル作成を行う。
[1]平文をH()でハッシュ化
[2] [1]で得られたハッシュ値からR()で平文を作り出す。
[3] [1]、[2]を一定回数繰り返す。(これをチェインという。)
[4] 最初の平文と最後の平文をテーブルに保存しておく(レインボーテーブル)
・攻撃は以下の手順。
[1] 対象のハッシュ値からR()で平文求める。
[2] 一致するものをレインボーテーブルから探す。
[3- A] 発見できれば、一致した平文を作成したチェインの中に元の平文が含まれる事になる。チェインの先頭からもう一度計算を行い、一致した平文に対するハッシュ値を計算し、そのハッシュ値に対する平文が求めるパスワードとなる。
[3- B] 発見できなければ、入手した攻撃対象のハッシュ値に対してR()で平文を作成。
さらにH()でハッシュ化し、[1]に戻る。これはチェインの回数分だけ繰り返すだけで済む。(※)
※R()→H()はチェインの作成と同じ。
つまり[3-B]の手順によって、対象のハッシュ値に対してチェインを進めたことになる。
逆に言えば、対象のハッシュ値はチェインの末尾から遡ったといえる。
参考:
レインボーテーブル – パスワード流出への対策を根本から理解する。 | Developers.IO
オンライン攻撃
実際に動作しているサーバや動作中のサービスに認証情報を送って試みる攻撃。
通常、動作しているサーバ/サービスで一定回数以上の認証ミスがあればロックがかかる。
そのため、何十回と試行する必要がある攻撃は実施できない。
以下の攻撃が主なオンライン攻撃。
- 推測によるパスワードクラック
- パスワードリスト攻撃
オフライン攻撃
パスワードファイルやパスワードがかかったファイルを入手し、パスワードクラックを試みる攻撃。サービスではないため、試行回数でのロックはかけられない。
以下の攻撃が主なオフライン攻撃
- 総当り攻撃
- 辞書攻撃
- 類推攻撃
- レインボー攻撃
対策
予防・防止
- ワンタイムパスワード、バイオメトリクス認証などを使用する
- 固定式パスワードの場合、ロックアウトを設定する。
※ロックアウト…一定回数以上の失敗でアカウントを使用不可にする事。
- 脆弱なパスワードを設定しない。 (ツールを使用してチェックする)
- ログインの成否をログに記録する。
- 定期的にパスワードを変更する。
- パスワードファイルなどを盗まれないようにする。(セキュリティホールを対処しておく。)
検知・追跡
- ネットワーク監視型IDS、ホスト監視型IDS、IPSで検知する。
- ログイン失敗のログから攻撃されている事を検知する。
回復
- 攻撃を受けたホストとそのホストからアクセス可能な全てのホストに不正プログラムの埋め込みや、データ改ざん、設定変更がないかを確認・検証する。
問題があれば対処する。最悪はOSをクリーンインストール。
ソルト
レインボー攻撃に対しての対策。
ユーザが設定したパスワードをハッシュ値に変換する際、ランダムな短い文字列(ソルト)を追加した状態で変換する。
ソルトはユーザごとに変え、パスワードともに保管しておく。
これによって、
・同じパスワードでも異なるハッシュ値になる。
・文字列が長くなり、レインボー攻撃の探索を妨げる。
ストレッチング
総当たり攻撃、レインボー攻撃に有効。
ハッシュ関数に時間がかかるものを用意すれば、攻撃されにくくなるが
そのために低速アルゴリズムを開発するには手間がかかる。そのため、高速アルゴリズムを数千回繰り返す事でハッシュ値計算を低速にすること。