現代社会において、暴力や盗難といった様々な犯罪があるのと同じように、ICT の分野においても、情報の盗難やシステム、データの破損などの犯罪があります。
インターネットの普及によって、世界中のコンピューターが通信可能な状態となり、様々なサービスの恩恵を受けることができるようになっています。その一方で、世界中とつながっているため、個人や企業を問わず、サイバー攻撃によるコンピューターへの侵入や情報の盗難、データの改ざんなどの被害にあう可能性も高まっていることになります。サイバー攻撃による被害を避けるためにには、どのようなサイバー攻撃があるのか、また対処策は何なのかを把握しておく必要があります。
今回は、サイバー攻撃の一つであるパスワードクラックの各手法と対処策について紹介します。
パスワード クラックとは?
パスワードクラックとは、システムやサービスを利用する際に利用者が本人であることを確認するためのパスワードを、データ解析によって不正に割り出すことです。
近年では、個人情報の流出やサイトの改ざんなどの被害が増えています。このような被害が発生するのは、各ユーザーが設定するパスワードの弱さや管理の甘さによるところが大きいです。誕生日や簡単な英単語を利用するなど、解読されやすいパスワードを設定したり、複数のサービスで同じパスワードを使いまわすなど、ユーザーのパスワードの管理における危機管理の甘さを利用されているケースが多いです。
パスワード クラックの攻撃の対象とされるのは、SNS や動画共有サービス、インターネット ショッピング サイトなど各サービスです。また、企業サイトの構築に利用されている WordPress が攻撃対象とされ、パスワード クラックによって不正ログオンされ、企業サイトが改ざんされるケースもあります。
ブルートフォースアタック
ブルートフォースアタック(総当たり攻撃)とは、考えられる全てのパスワードの組み合わせを試して、パスワードを特定する方法です。時間や試行回数に制限がなければ、必ず解読することができる攻撃方法です。
例えば、暗証番号が数字4桁のシステムの場合、0000 から 9999 までの 1万通りの組み合わせの可能性があります。各組合せでのログオンの試行をコンピューターで自動で行える状況であれば、暗証番号の解読はすぐに行うことができます。
ブルートフォースアタックの攻撃手法は、パスワードとなる文字数や文字列の種類が多くなるほど解読するまでに時間がかかり難しくなります。例えば、先ほどの通り、暗証番号が数字4桁の場合であれば最大1万通りの組み合わせを試行すれば暗証番号を解析することができますが、暗証番号が数字8桁の場合であれば最大1億通りの組み合わせの試行が必要です。数字だけではなく、大文字、小文字、記号など他の種類の文字も利用できるのであれば、組み合わせの数はさらに大きくなります。
ブルートフォースアタックの攻撃手法の発想はシンプルですが、いつかは正しいパスワードを引き当てられてしまう強力な攻撃方法です。ブルートフォースアタックに対処するために、多くのシステムでは何回か連続でログインに失敗した場合に、アカウントをロックアウトして、ログオン処理ができないようにする仕組みが導入されています。
逆ブルートフォースアタック
逆ブルートフォースアタック(逆総当たり攻撃)とは、同じパスワードをユーザーを変えてログオンを試行する方法です。
ブルートフォースアタックはアカウント ロックアウトの仕組みが導入されているシステムにおいては、何度もパスワードの組み合わせを変えてログオンを試行できないため、この攻撃方法でパスワードを解析するのは難しくなります。それに対向する形で登場したのが「逆ブルートフォースアタック」で、「password」や「123456」のような、よく使われるパスワードを利用者を変えてログオンを試行する方法です。
ログオンに失敗したとしても「パスワードを1回間違っただけ」であるため、アカウントはロックアウトされず、利用者には気づかれません。脆弱なパスワードを利用しているユーザーは、逆ブルートフォースアタックによって、いずれは解読されてしまいます。
辞書攻撃
辞書攻撃とは、名前の通り辞書を使ってパスワードを推測し、パスワードを特定する方法です。
ブルートフォースアタックは力技な手法であり、いつかは確実にパスワード解析に至るものの、複雑なパスワードに対しては時間がかかってしまいます。
ブルートフォースアタックの弱点を解決するためのアイデアの一つが辞書攻撃で、利用者が使用しそうなパスワードを先に試すというものです。辞書攻撃で使用する「辞書」とは英単語辞書のような人が使用する辞書ではなく、パスワードの候補として使用されがちな文字列を体系化したデータベースのことです。password などのような文字列や zxcvbnm(キーボードの下一列)、年月を示す数字など、パスワードとしてよく使われる文字列をブラックハッカーの中で共有され、データベースへの登録が進んでいます。
攻撃の対象のユーザーが明確となっている場合は、事前に生年月日やペットの名前、電話番号、ユーザー ID(ユーザー ID とパスワードを同じにしている人は多い)などを入手して、これもデータベースに登録しておきます。
パスワード解析まで、最終的にパスワードを総当たりになるとしても、使用されそうなパスワードを先に試すことで、パスワードが解析されるまでの時間を大幅に削減できる可能性が高くなる攻撃方法となります。
レインボーテーブル攻撃
レインボーテーブル攻撃とは、パスワードのハッシュ値から、レインボーテーブルを使ってパスワードを特定する手法です。
パスワードを管理するデータベースでは、一般的にパスワードはハッシュ化されて保存されています。ハッシュ関数は一方向性の関数であるため、ハッシュ値から元の平文であるパスワードを特定することはできません。レインボーテーブルはパスワードとなりうる文字列とハッシュ値の組み合わせのデータのテーブルであり、その中から一致するハッシュ値がないかを総当たりで解析して、パスワードの文字列を特定する攻撃です。
「文字列」と「ハッシュ値」の組み合わせを管理するテーブルを使って、パスワードのハッシュ値を比較して解析を行う場合、テーブルにある組み合わせのパターンが多ければ多いほど、確実にパスワードを引き当てることができます。しかし、組み合わせが多くなれば多くなるほど、テーブルのデータ容量も大きくなり、膨大な数の各パターンとの比較処理を行わなければならないため、一般的なハードウェアスペックのコンピューターでの解析処理が難しくなります。
レインボーテーブル攻撃は、各パターンと比較した総当たりの解析を効率的に行う仕組みが用意されており、テーブルのデータ容量のコンパクト化や各パターンとの比較の処理における計算量が大幅に削減されるアルゴリズムとなっています。仕組みとしては「総当たり」によるパスワード解析という点は変わりませんが、効率的に解析処理ができる攻撃です。そのため、一般的なパーソナル コンピューターでもレインボーテーブル攻撃によるパスワード解析が可能となっています。
レインボーテーブル攻撃によるパスワード解析のアルゴリズムについて紹介します。
ハッシュ関数
ハッシュ関数とは、データの改ざん検知に使われる技術で、任意の長さのデータから固定長のデータを生成するアルゴリズムです。ハッシュ関数で生成された値を、ハッシュ値と呼びます。
ハッシュ関数については、以下の記事でも詳細を紹介しています。
前回の講座: [sitecard subtitle=PKI講座第4回 url=https://pkiwithadcs.com/public_key_encryption/ target=] ここまでに、データの暗号化方式について紹[…]
ハッシュ関数は不可逆性をもつ関数となり、ハッシュ値から元の平文のデータを算出することはできないという特徴をもつ関数です。ハッシュ関数は、同じ平文のデータからハッシュ値を算出すると、必ず同じハッシュ値が算出されます。また、元の平文データが 1 bit でも変わると、全く異なるハッシュ値が算出される関数となります。このような特徴から、ハッシュ値が一致するかを比較するか、元データが一致するかを確認することができます。
ハッシュ関数は、元の平文データが膨大なデータ量であっても、パスワードのような隠匿したいデータであっても、ハッシュ値の比較により「元データが一致するか」を確認するためには有用なアルゴリズムになります。
パスワード「nekomaru123」というパスワードを、MD5 というハッシュ関数で算出したハッシュ値は以下の通りです。
還元関数
還元関数とは、ハッシュ値からパスワード候補となる平文の文字列を生成する関数です。
還元関数は、一定の規則に従ってパスワードとなりうる平文の文字列を生成します。一定の規則とは、パスワード規則で定められている条件(例えば、8文字以上で英大文字・英小文字・数字それぞれを最低1文字以上は含めるなどの条件)のことで、その条件を満たすような文字列を生成する仕組みになっています。還元関数の入力パラメーター(ハッシュ値)が同じであれば、生成される文字列も同じとなります。そのため、同じハッシュ値のデータをパラメーターとして、同じ還元関数で文字を生成すると、同じ文字列が生成されます。
「還元」関数という名前から、ハッシュ値から算出されるのは「元の平文データ」と勘違いしがちですが、ハッシュ関数は一方向性の関数であり、ハッシュ値から元の平文データを算出することはできません。あくまで、レインボーテーブルの作成において、パスワードのパターンを大量に生成するために、ハッシュ値から別の文字列を生成することを目的とした関数となります。
レインボーテーブル
パスワードとハッシュの組み合わせについて多くのパターンを保持する「レインボーテーブル」を作成します。レインボーテーブル攻撃にて、特定のハッシュ値からパスワードを割り出すためのサンプルデータとなります。
レインボーテーブルの作成方法は以下の通りです。
① 任意の初期値となるパスワードを用意し、ハッシュ値を算出
初期値としてパスワードとなりうる文字列を用意し、ハッシュ関数でハッシュ値を算出します。ここで使用するハッシュ関数は、レインボーテーブル攻撃で、パスワードを割り出す対象のハッシュ値で使用されているハッシュ関数と同じものを利用します。ハッシュ値を算出したら、元の文字列とチェインとして紐づけます。
※青のボックスが「パスワードとなる文字列」で、緑のボックスが「ハッシュ値」です。
本記事ではわかりやすさの都合上、パスワードは都市名としていますが、本来はパスワードの条件を満たす文字列となります。
② ハッシュ値から還元関数1を使用して文字列を算出
還元関数1を使用して、ハッシュ値からパスワードとなる文字列を算出します。文字列を算出したら、パラメーターとなったハッシュ値と紐づけて、チェインとします。
③ パスワードの文字列からハッシュ値を算出
ハッシュ関数で、パスワードとなる文字列のハッシュ値を算出します。ハッシュ値を算出したら、元の文字列と紐づけて、チェインとします。
④ ハッシュ値から還元関数2を使用して文字列を算出
還元関数2を使用して、ハッシュ値からパスワードとなる文字列を算出します。文字列の算出に使う還元関数は、前回とは別のアルゴリズムを利用します。1回目に使う還元関数を還元関数1、2回目に使う還元関数を還元関数2とします。文字列を算出したら、パラメーターとなったハッシュ値と紐づけて、チェインとします。
⑤ パスワードの文字列からハッシュ値を算出
ハッシュ関数で、パスワードとなる文字列のハッシュ値を算出します。ハッシュ値を算出したら、元の文字列と紐づけて、チェインとします。
⑥ 同じ方法でハッシュ値とパスワードの文字列の組み合わせのチェーンを作成
①~⑤までの手順と同じ方法で、ハッシュ値とパスワードの文字列の組み合わせを作成し、チェーンでつなげていきます。還元関数でハッシュ値からパスワードとなる文字列の生成と、ハッシュ関数でパスワードとなる文字列からハッシュ値を生成する手順を、n 回繰り返してチェーンを完成させます。レインボーテーブルの作成にあたって、繰り返す回数は任意であり、100 回や 500 回など利用するツールによって異なります。
⑦ 初期値となるパスワードの文字列を変え、①~⑥の同じ手順でチェーンを作成
⑧各チェーンの初期値のパスワードと末尾のパスワード以外は削除
レインボーテーブルを使ったパスワードの特定
ハッシュ値から総当たりで、レインボーテーブルに該当する文字列がないか確認します。レインボーテーブル攻撃でのパスワード解析のアルゴリズムは以下の通りです。
① 解析対象のハッシュ値を還元関数 n を使ってチェーンを生成
パスワードの解析を行いたいハッシュ値を、還元関数 n を使ってパスワードとなるキーワードを生成し、パラメーターとなったハッシュ値と紐づけて、チェインとします。還元関数 n は、レインボーテーブルを作成した際の n 回目のパスワードとなるキーワードの作成に使用した関数を利用します。
② レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認
①で生成したチェーンの末尾のキーワードが、レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認します。
還元関数は同じハッシュ値のデータをパラメーターとすると、同じキーワードが生成されます。そのため、還元関数 n で生成されたキーワードが、レインボーテーブルのいずれかのチェーンの末尾のキーワードと一致する場合、還元関数 n のパラメーターとなったハッシュ値が同じであることを意味しています。
キーワードが一致するチェーンがあった場合、そのチェーンに同じパスワードのサンプルがあることを意味しています。しかし、レインボーテーブルのチェーンに含まれるパスワードとハッシュ値の組み合わせは削除されているため、対象のチェーンを復元してパスワードを特定する作業(⑧)に進みます。一致するチェーンがなかった場合、次の手順(③)に進みます。
③ 解析対象のハッシュ値を還元関数 n-1、還元関数 n を使ってチェーンを生成
パスワードの解析を行いたいハッシュ値から、還元関数 n-1 を使ってパスワードとなるキーワードを生成します。ハッシュ関数で生成したキーワードのハッシュ値を算出し、さらにそのハッシュ値を還元関数 n を使ってキーワードを生成して、チェーンとして紐づけします。還元関数は、レインボーテーブルを作成した際の n-1、n 回目のパスワードとなるキーワードの作成に使用した関数を利用します。
④ レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認
③ で生成したチェーンの末尾のキーワードが、レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認します。
還元関数は同じハッシュ値のデータをパラメーターとすると、同じキーワードが生成されます。また、ハッシュ関数は同じ文字列をパラメーターとすると、同じハッシュ値が生成されます。そのため、③で生成したチェーンの末尾のキーワードが、レインボーテーブルの各チェーンの末尾のキーワードと一致する場合、全てのチェーンの内容も全て一致することを意味しています。
キーワードが一致するチェーンがあった場合、そのチェーンに同じパスワードのサンプルがあることを意味しています。しかし、レインボーテーブルのチェーンに含まれるパスワードとハッシュ値の組み合わせは削除されているため、対象のチェーンを復元してパスワードを特定する作業(⑧)に進みます。一致するチェーンがなかった場合、次の手順(⑤)に進みます。
⑤ 解析対象のハッシュ値を還元関数 n-2、還元関数 n-1、還元関数 n を使ってチェーンを生成
パスワードの解析を行いたいハッシュ値を、還元関数 n-2 を使ってキーワードを生成します。ハッシュ関数で生成したキーワードのハッシュ値を算出し、さらにそのハッシュ値を還元関数を使ってキーワードを生成する作業を繰り返し、チェーンを生成します。還元関数は、レインボーテーブルを作成した際の n-2、n-1、n 回目のパスワードとなるキーワードの作成に使用した関数を利用します。
⑥ レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認
⑤ で生成したチェーンの末尾のキーワードが、レインボーテーブルの各チェーンの末尾のキーワードと一致するか確認します。
還元関数は同じハッシュ値のデータをパラメーターとすると、同じキーワードが生成されます。また、ハッシュ関数は同じ文字列をパラメーターとすると、同じハッシュ値が生成されます。そのため、⑤で生成したチェーンの末尾のキーワードが、レインボーテーブルの各チェーンの末尾のキーワードと一致する場合、全てのチェーンの内容も全て一致することを意味しています。
キーワードが一致するチェーンがあった場合、そのチェーンにパスワードの情報があることを意味しています。しかし、チェーンに含まれるパスワードとハッシュ値の組み合わせは削除されているため、チェーンを復元してパスワードを特定する作業(⑧)に進みます。一致するチェーンがなかった場合、次の手順(⑤)に進みます。
⑦ チェーンの末尾のキーワードと一致するまで
パスワードの解析を行いたいハッシュ値から、キーワードの生成に利用する還元関数を 1 つずつずらしてチェーンを作成し、末尾のキーワードと一致するレインボーテーブルのチェーンがないか確認します。この作業を、レインボーテーブルのいずれかのチェーンの末尾のキーワードと一致するまで繰り返します。
最終的に、キーワードの生成に利用する還元関数1までずらしてチェーンを作成しても、レインボーテーブルの全てのチェーンの末尾のキーワードと一致しなかった場合には、パスワードの解析を行いたいハッシュ値のサンプルはなかったことを意味します。その場合には、パスワード解析は失敗したことになります。
⑧ 一致したチェーンを再現し、一致するキーワードを確認
一致したレインボーテーブルのチェーンを再現し、検証対象のハッシュ値とキーワードのサンプルを特定します。
⑦での解析により、検証対象のハッシュ値はレインボーテーブルの「Tokyo」- 「Boston」のチェーンに含まれていることが確認できました。レインボーテーブルではチェーンの内容を削除しているため、「Tokyo」- 「Boston」のチェーンを同じ還元関数を利用して再現し、検証対象のハッシュ値のサンプルまでチェーンを構成します。
⑦では検証対象のハッシュ値を還元関数 n-k-2 でパスワードを生成して作成したチェーンで、末尾のキーワードと一致するレインボーテーブルのチェーンを確認できました。検証対象のハッシュ値とパスワードのサンプルは、チェーンの一つ前となります。そのため、レインボーテーブルのチェーンの復元には、還元関数でハッシュ値からパスワードとなる文字列の生成と、ハッシュ関数でパスワードとなる文字列からハッシュ値を生成する手順を繰り返す回数は n-k-3 回までで確認がとれます。
上図の例の場合では「Tokyo」- 「Boston」のチェーンを再現した結果、検証対象のハッシュ値のパスワードは「Tallinn」であることが確認とれました。
このように、レインボーテーブル攻撃では、各パターンと比較した総当たりの解析を効率的に行う仕組みが用意されており、テーブルのデータ容量のコンパクト化や、各パターンとの比較の処理における計算量が大幅に削減されるアルゴリズムとなっています。
パスワードクラック後の攻撃者の行動
パスワード クラックにより不正にログオンできた場合、侵入者は証拠の隠滅を図ったり、再度侵入できるように仕掛けをします。一般的には、ログオン後に以下のような行動をするため、万一、侵入されてしまった場合の対処も考慮しておくとよいでしょう。
ログの消去
ログオンにおいてシステムの管理者権限をはく奪された場合、システムで管理されている情報資産を自由に入手/削除できたり、システム設定を変更/破損することができるようになります。
このような状態になった場合、侵入者は侵入の形跡が残らないようにログの消去を行います。ログが残っている状況だと、侵入経路や接続元のマシンを特定される可能性があるため、これらを消去して不正ログオンの痕跡や証拠を抹消します。
ログ消去の対処策として、以下が有効です。
- ログファイルの格納場所を攻撃者が推測しにくい場所に変更
- ログファイルを暗号化
バックドアの作成
ログオンにおいてシステムの管理者権限をはく奪された場合、また同じシステムにログオンできるためように仕掛けを残すことがあります。
一度、システムにログオンできたとしても、同じ方法で再度ログオンできる保証はありません。ログオンに使用するパスワードを不正に入手してログオンできたとしても、その後にパスワードを変更されてしまうと、同じ方法でログオンすることができなくなります。また、侵入にかかる時間や手間を短縮する観点からも、攻撃者は「バックドア」という進入路を確保することがあります。
「バックドア」の作成には、セキュリティホールが使われたり、専用のツールなども存在します。また、侵入目的とは別に、パスワードやデータの変更を攻撃者に届けたり、情報を漏洩させる機能を含むプログラムのことを「バックドア」と呼ぶことがあります。
バックドアの作成の対処策として、以下が有効です。
- セキュリティ パッチの適用
- パーソナル ファイアウォールの導入
- 受信するデータだけでなく、コンピューターから送信されるデータも検査
対処策
パスワード クラックにより、攻撃者にパスワードを解析されて不正にログオンされる可能性があります。パスワード クラックの対策として、以下のような対策をして、パスワードを厳密に管理しましょう。
セキュリティ強度が高いパスワードを設定
パスワードはセキュリティ強度が高い文字列を設定することで、パスワード クラックへの耐性をもたせることができます。一般的には、大文字、小文字、数字、記号のいずれかの3種類を含ませ、10文字以上の文字列をキーワードとするとセキュリティ強度は十分と考えられます。
文字の種類や文字数の条件を満たす場合でも、以下のような特徴をもつ場合、推測されやすい文字列であるため、パスワードのセキュリティ強度が下がります。パスワード クラックされる可能性が高まりますので、該当する場合はパスワードの変更を検討することをおすすめします。
- 生年月日を含む
- 名前を含む
- 辞書にある単語を含む
- キーボードの配列順を含む
また、複数のアプリケーションやサービスで同じパスワードを使いまわすケースも多いですが、これは非常に危険な利用法です。万一、パスワードが漏洩した場合、攻撃者は同じパスワードで他のサービスにもログオンできるかを試すため、被害が拡大した事例も多く報告されています。そのため、サービスごとに別のパスワードを設定することをおすすめします。
パスワード管理ツール
攻撃者に推測されないパスワードを、サービスごとに別に作成したり記憶しておくのは難しいです。ユーザーがパスワードを使いまわしているケースが多いのは、複雑なパスワードの生成や記憶の難しさが原因です。
パスワード管理ツールを使うと、サービスごとに自動で複雑なパスワードを生成してくれ、パスワードの管理、ログイン時のパスワードの自動補完もしてくれます。ユーザーはパスワードの設定を意識しなくても、安全かつ効率的にパスワードを運用することができます。
色々なパスワード管理ツールが存在しますが、おすすめのパスワード管理ツールは「1password」です。
1password で管理しているパスワードはクラウド上で安全に管理しています。また、Windows OS や MacOS、Android や iOS など様々な OS に対応しているため、複数のデバイスを利用しているユーザーも1password をインストールすればパスワードは一元的に管理することができます。
1password では、以下のような機能を備えているため、安全性を担保しながら利便性も高いパスワード管理ツールとなっています。
- セキュリティ性の高いパスワードの自動生成
- 管理しているパスワードの自動補完
- 指紋認証
- 顔認証
- ブラウザ以外のアプリのログインの自動化
- パスワードの漏洩をチェック
- クレジットカードなどの重要な情報の保存
1password は有料となりますが、毎月300円程度でパスワードを安全に管理できるため、非常におすすめのパスワード管理ツールです。
アカウント ロックアウト
システムのログオン管理の設定にて、パスワードを一定回数間違えるとアカウントを凍結する「アカウント ロックアウト」の機能を有効にしておくとパスワード クラックへの耐性をもたせることができます。
総当たり攻撃などのパスワード クラックの手法では、考えられる全てのパスワードの組み合わせでログオンを試して、パスワードを特定します。ただし、総当たり攻撃の場合、何度もログオンに失敗することを前提とし、様々なパスワードでログオンを試行する必要があります。しかし、アカウント ロックアウトの機能が有効な環境では、パスワードを一定回数間違えるとアカウントが凍結されます。アカウント凍結後にはログオンは試行できないため、総当たり攻撃はできません。
アカウント ロックアウトの機能を有効にしていないと、パスワードクラックによりいつかはパスワードを解析されてしまう可能性があるので注意してください。
2段階認証
サービスやシステムを実装・構築する際に、セキュリティの向上のため2段階認証を導入すると、不正ログオンの防止につながります。
攻撃者によるパスワード データベースの蓄積やコンピューターの処理性能向上によって、パスワードクラックの技術が向上し、不正ログオンの事例は増えてきています。これまでのようなパスワード認証のみでは、完全に不正ログオンを防ぐのが難しくなってきているため、トークン、指紋や顔などの生体認証などの2段階認証を導入することで、セキュリティ強度を高めることができます。
トークン、指紋や顔などの生体認証など、本人しか持っていない情報で認証要求された場合、なりすましによるログオンは現在の技術では難しいため、攻撃者が不正ログオンすることはできません。