ろば電子が詰まつてゐるスマートフォン用の表示で見るろば電子が詰まつてゐる2014-09-05BASIC認証とDigest認証、hydraによる辞書攻撃セキュリティ某所でajitingさせてもらうという貴重なユーザ体験をしたのですが、「THC-Hydraでhttp-getにてクラックするとき、BASIC認証とDigest認証を自動判別してくれるのか?」という質問に答えられずに悔しい思いをしました。結論から言うと、THC-Hydraは自動でBASIC認証/Digest認証を判断してくれるので、http-get指定だけでよく、特別に設定する必要はありません。BASIC認証のおさらいまずはじめに、BASIC認証のおさらいをしておきます。BASIC認証では、IDとパスワードをコロンで連結した文字列を、Base64でエンコードしてAuthorization:ヘッダに付けることで認証をおこないます。max-age=0上の例は、BASIC認証配下にFirefoxでアクセスした際のリクエストヘッダですが、このうち以下の部分がBASIC認証のヘッダとなります。Z3Vlc3Q6VGFrZTU=この文字列は、以下のようにbase64コマンドでデコードすればそのままIDパスワードが得られます。そのため、BASIC認証は全く暗号化されていない......というのはまぁ初級教科書レベルのお話ですね。-dguest:Take5本稿では、この通りにIDはguest、パスワードはTake5で例を進めます。Digest認証BASIC認証では平文でIDパスワードが流れるので、これを嫌って、パスワード(+α)からメッセージダイジェストを生成してそれをやりとりするのがDigest認証です。Digest認証は、ユーザからするとほとんど違いが分かりません。Firefoxでは下図のように、Digest認証であっても見た目はBASIC認証と同じ、IDパスワードの入力ダイアログが出ます。ちなみにIEでは見た目がちょっと違います(BASIC認証の方は、危険だよ、って出してくれます)。Digest認証について細かい話をしているとそれだけでこの記事が終わってしまうので、以下、エッセンスだけ書きます。詳しくはRFC2617を読みましょう。Digest認証では、サーバから送られてきたランダム文字列(nonce)とパスワードのメッセージダイジェストを取り、その値をサーバ・クライアント間でやりとりします。そのため通信路にパスワードが平文で流れず安全です。リクエストの都度nonceが変わるので、同一パスワードのリクエストでもメッセージダイジェストは異なり、リプレイ攻撃もおこなえません(と書きたいのだが、Webサーバの実装によっては既に認証したnonceを再送されたときに受け取っちゃうことが......ややこしいのでここは今は踏み込みません)。Digest認証のヘッダを見てみましょう。最初のリクエストに対する、サーバからのレスポンスヘッダを見ます。401レスポンスが返ります。WWW-Authenticateというレスポンスヘッダがあり、この内容を元に再度認証リクエストを投げることが期待されています。Firefoxで、このレスポンスに対してIDパスワードを入力した際のリクエストヘッダは以下です。cnonce="a864d6a0e55de5d8"見て分かる通り、Authorization:ヘッダはBASIC認証に比べてとても複雑です。重要なのは、username,realm,responseの3つです。usernameは、ログインする際のユーザ名で、ダイアログボックスに入力した値です。見て分かる通り、Digest認証ではユーザ名は平文で流れるため、ユーザ名自体も隠したい場合にはDigest認証は意味がありません。realmは認証領域という意味で、Webブラウザの実装としては同じrealmにはID/パスワード再入力を求めない、というのが普通です。BASIC認証ではこのrealmはかなりテキトーでもなんとかなりましたが、後述するとおりDigest認証ではこのrealmを意識した設定をしないと正しく動きません。responseが、「色々やってメッセージダイジェストを取った値」です。するのが大変なのでここでは解説を省略しますが、基本的にはnonceとパスワードをこねくり回してMD5を取る、イメージです。サーバ側でも同様にMD5を取り、それが一致すれば認証OKということになります。ApacheでのDigest認証の設定ApacheでDigest認証を利用したい場合、BASIC認証の場合と設定は似ていますが、若干違う部分もあってハマることがあるのでまとめておきます。パスワードファイルはhtdigestコマンドを利用して作成します。htpasswdコマンドと違って、オプションは一つしかないので簡単です。引数を何も付けずに実行すると、ヘルプが出ます。file.Digest認証では、realmの値が必須です。いうわけでユーザ名guestのパスワードファイルは以下のように作れます。Auth:0444a04e4907251201e5dd43ebc79721見て分かるように、できあがったパスワードファイルには、realmの値も一緒に含まれています。Apache側のconfファイルは以下のようになります。valid-userAuthTypeはBASICではなくDigestになります(当たり前か)。AuthNameは、realmと必ず一致させます。それ意外は、BASIC認証と同様です。THC-HydraはDigest認証もOKかようやく本題です。Digest)が返ると、自動的にDigest認証の試行に切り替えます。そのため、相手がBASIC認証だろうがDigest認証だろうが気にする必要はありません。この辺の動きを確認するため、Apacheのアクセスログファイルを、「Authorization:ヘッダのみ出す」という変態設定に変えておきましょう。basic-authApacheでは、%{}iでくくると、そのヘッダだけをアクセスログに出すことができます。上記のようにすると、Authorizationヘッダだけがアクセスログに出ますから、クラックツールをかけながらログを見ればBASIC認証で来ているのかDigest認証で来ているのか、すぐ分かります。(追記:この設定方法は、@k_morihisaさんに教えていただきました、多謝)hydra実行後この状態で、Digest認証のURLに対して、hydraにより辞書攻撃をおこないます。/digestauth/この際のアクセスログは、以下のようになっていました。uri=\"/digestauth/\"....(省略)BASIC認証によるリクエストが、数えてみると16個あることに気がつきましたでしょうか(ちなみに、BASIC認証によるリクエストが1つだけずっと下の方にあるのは、これだけ何らかの理由で応答が遅れたからと思われます。Apacheでは、アクセスログはリクエストが来た時ではなくリクエスト完了時に出力されるので、応答が遅れるとログ出力も遅れます)。THC-Hydraでは、デフォルトでは1ホストに対して並列で16タスクが実行されます。このため動きとしては、まず16個のBASIC認証のリクエストをドバッっと投げて、その応答を見て「あ、やべ、こいつDigest認証だ」と気がついて、それ以降はDigest認証で試す......という流れになっています。これは、例えば以下のように並行実行のタスク数を-tオプションで1と設定すれば、BASIC認証は最初に1回だけ投げて、その後はすべてDigest認証になるという動きをするため確認できます。/digestauth/上記のようにタスク1で実行した場合は、確かに以下のようにBasic認証ははじめの1回だけで、あとはすべてDigest認証で投げていました。uri=\"/digestauth/\"というわけで、hydra安心。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。