トップ «前の日記(2011/08/22(Mon)) 最新 次の日記(2011/09/24(Sat))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2011/09/04(Sun) クエスト終了。面白かった。 [長年日記] 18:00現在弱いにわか雨 26℃

_ [Linux][Ubuntu][Debian][FC][Mac]WPA/WPA2-PSKのパスワードを超高速で発見できるソフト「Pyrit」

注意点

下記を実施する場合、かならず自分の無線LAN環境で行うこと。

暗号化されているネットワークに無断でアクセスするのは犯罪行為です。許されるのはハッキングまで。クラッキングは絶対にやめましょう。

参考

http://code.google.com/p/pyrit/
http://gigazine.net/news/20110707_pyrit/
http://beta.ivc.no/wiki/index.php/Pyrit_setup

基礎情報

「Pyrit」は、ATI Stream テクノロジー/Nvidia CUDA/OpenCLを使用し、GPUのパワーを使って超高速でWPA/WPA2-PSKのパスワードを解析するソフトウェアである。

「Pyrit」はフリー(GPLv3)のオープンソースソフトウェアであり、無料で使用できる。

WPA/WPA2の解析はPairwise Master Key(PMK)をいかに素早く見つけるかという点にかかっており、「Pyrit」ではGPUを活用することで、「Aircrak-ng」のようなCPUでの計算に比べて数十倍高速にPMKを計算できる。

解析は総当たりでパスワードを全種類試していく手法(ブルートフォースアタック)により行う。ブルートフォースアタックは無線LANのバグやセキュリティホールを突いているわけではないため、(それが現実的な時間かどうかは別問題として)時間さえかければどんなパスワードであろうと発見できる。

「Pyrit」が優れているのは、この総当りの速度が従来に比べて非常に高速である点だ。やっていることとしては、従来のものと同じく、用意したパスワード候補をひたすら試していくだけなので、実際に未知のパスワードを解析できるかどうかは使用するデータベース(辞書ファイル)の質に依存する。

そのため、パスワードの解析に必要となるのは、

・(パスワードの候補を収録した)データベース
・(高速計算を可能にするための、ある程度高性能な)GPU

の2つである。

「Pyrit」は、取得したパケットを元にパスワードの解析を行うだけのソフトであるため、パケットの取得には、また別のソフトウェア(Aircrack-ng等)を使う必要がある。パケットキャプチャについてはここでは説明しない。

実際にはGPUがない状態でもCPUのみで実行できるが、それだと従来のソフトウェア(Aircrack-ng等)と同じなので、わざわざ「Pyrit」を使う意味がない。むしろ、CPUのみでの計算速度では、「Aircrack-ng」のほうが完成度が高い。

また、データベースにはMySQL等が使えるが、ローカルで使用するだけなら適当な文字列を列挙しただけのプレーンなテキストファイルで十分である。

PCの構成

例として、今回使用したPCの構成を示す。

MotherBoard:MSI Big Bang Marshal
CPU:Intel Corei5 i5-2500K 3.3GHz
GPU:RH6990-E4GD/MDP4 x 2枚
HDD:Western Digital 2.0TB WD20EARX
OS:Ubuntu 10.04 64bit


インテル Core i5 2500K Box (LGA1155...

インテル Core i5 2500K Box (LGA1155...
価格:17,980円(税込、送料込)

【送料無料】WesternDigitalWD20EARX バルク品 ...

【送料無料】WesternDigital WD20EARX バルク品 ...
価格:5,640円(税込、送料込)

RH6990-E4GD/MDP4は2つのGPUを備えたマルチコア構成となっている。そのため今回の構成では、RH6990-E4GD/MDP4を2枚使って4つのGPUコアによる計算が可能である。

※4つ以上のコアを使って計算が可能かどうかは未確認であるため、チャレンジする場合は自己責任でお願いします。

ここで、複数のグラフィックボードを使用する場合は、CrossFireで接続『しない』ことに注意する。

どうやら、CrossFireで接続してしまうと、複数のGPUではなく、1つの高性能なGPUとして扱われてしまう模様。この状態でも一応「Pyrit」は実行できるものの、CrossFire接続した場合に比べて圧倒的に計算速度が遅くなる。

具体的には、CrossFire接続をした状態だと、2つのGPUを使った場合でも、1つのGPUだけで計算した場合と比較して、計算速度が 1.2 倍程度にしか向上しない。対して、CrossFire接続しない場合の計算速度は、単純に 2 倍となる。

pyritインストール前の準備

端末から以下のコマンドを実行する。

$ sudo apt-get update
$ sudo apt-get install python-scapy
$ sudo apt-get install python-dev
$ sudo apt-get install libpcap-dev
$ sudo apt-get install libssl-dev

pyritのインストール

端末から以下のコマンドを実行する。

$ wget http://pyrit.googlecode.com/files/pyrit-0.4.0.tar.gz
$ tar zxvf pyrit-0.4.0.tar.gz
$ cd pyrit-0.4.0
$ python setup.py build
$ sudo python setup.py install

正しくインストールできていることを確認

端末から以下のコマンドを実行する。

$ pyrit eval
$ pyrit list_cores
$ pyrit -e linksys create_essid

すべてエラーが出なければ、プログラムは正しくインストールされているはず。

なお、この段階ではまだGPUが使用可能になっていないため、CPUのコアしか発見できない。

ここで複数のコアが表示されるのは、CPUがマルチコアのため。今回の構成だと以下のように4つのコアが見えるはず。

Computed 3235.5 PMKs/s total.
#1: 'CPU-Core (SSE2)': 811.4 PMKs/s (RTT 2.8)
#2: 'CPU-Core (SSE2)': 768.2 PMKs/s (RTT 2.8)
#3: 'CPU-Core (SSE2)': 792.7 PMKs/s (RTT 2.5)
#4: 'CPU-Core (SSE2)': 782.9 PMKs/s (RTT 2.5)
#5: 'Network-Clients': 0.0 PMKs/s (RTT 0.0)

グラフィックボードのドライバをインストール

ディスプレイドライバをインストールし、GPUを計算に使用できる状態にする。

以下は、今回使用したRH6990-E4GD/MDP4の場合の設定方法である。これ以外のボードでも手順そのものは大きく変わらないはず。

まず、使用するGPUに合わせてグラフィックドライバーをインストールする。

ATIのボードの場合は以下のページからDLできる。

http://support.amd.com/us/gpudownload/Pages/index.aspx

今回はRH6990-E4GD/MDP4を使用するため、下記の手順でAMD Radeon HD6990のドライバをインストールする。

$ wget http://www2.ati.com/drivers/linux/ati-driver-installer-11-8-x86.x86_64.run
$ sudo apt-get update
$ sudo apt-get install libqtgui4
$ sudo sh ./ati-driver-installer-11-8-x86.x86_64.run
(GUIでインストール。参考ページのdebからインストールする方法だと失敗したため)

ディスプレイドライバの設定

インストールしたドライバに合わせて「/etc/X11/xorg.conf」を作成する。以下のコマンドを打つと、自動的に現在の環境にあわせた設定が書き込まれる。

$ sudo aticonfig --initial -f

ここで一度ログアウトし、ドライバを読み込む。

ドライバが正しく読み込まれていることを確認

以下のコマンドを実行。

$ sudo  fglrxinfo

使用しているグラフィックボードの情報が表示されるはず。

OpenCLをインストール

GPUによる計算には、OpenCLというライブラリを使用する。

AMDの場合、AMD APP SDK(旧ATI Stream SDK)がOpenCLに対応しているため、それを使用する。

http://developer.amd.com/sdks/AMDAPPSDK/Pages/default.aspx#five

※なお、Nvidiaの場合はNvidia CUDAがOpenCLに対応しているらしい(未確認)

以下のコマンドを実行し、AMD APP SDKをインストールする。

$ mkdir AMD-APP-SDK
$ cd AMD-APP-SDK/
$ wget http://download2-developer.amd.com/amd/APPSDK/AMD-APP-SDK-v2.5-lnx64.tgz
$ tar zxvf AMD-APP-SDK-v2.5-lnx64.tgz

ホームページからinstallation notesをDLし、それにしたがってインストールする。

※注意※

マニュアルには、

$ sudo ./Install-APP.sh

でインストールしろという説明があるが、手動で設定できるなら、可能な限り使わない方がいい。

なぜなら、これは一連の処理を実行したら警告もメッセージもなしにいきなりrebootするというひどいスクリプトだからだ。

一応logは吐かれるものの、再起動が終わってlogを確認するまで、インストールが成功しかどうかすら分からない。

しかも2回以上実行すると/etc/profileが破壊されるというおまけ付き。(これは自分の環境が悪いだけかも知れない)

もしこのスクリプトを複数回実行させてしまってログインできなくなった(ログイン画面⇒認証⇒ログイン画面⇒・・・と無限ループしてしまう)場合は、仮想コンソール(「Alt」+「F1」~「F6」)からCUIでログインし、「/etc/profile」を修正する必要がある。

Cpyrit OpenCL moduleのビルド

OpenCL用のモジュールをインストールし、GPUを使ってPryitを実行できるようにする。

$ wget http://pyrit.googlecode.com/files/cpyrit-opencl-0.4.0.tar.gz
$ tar zxvf cpyrit-opencl-0.4.0.tar.gz
$ cd cpyrit-opencl-0.4.0

ここで、「setup.py」内のincludeをしている部分に以下のパスを加える。

'/opt/AMDAPP/include', \

さらに、以下のコマンドでlibOpenCLへのリンクを貼る。

$sudo ln -s /opt/AMDAPP/lib/x86_64/libOpenCL.so /lib64/

ここまで設定できたら、ビルドとインストールを行う。

$ python setup.py build
$ sudo python setup.py install

正しくインストールされたことを確認。

$ pyrit list_cores
$ pyrit benchmark

おそらく以下のような結果が得られるはず。

Computed 36724.5 PMKs/s total.
#1: 'OpenCL-Device 'Cayman'': 33617.5 PMKs/s (RTT 1.7)
#2: 'CPU-Core (SSE2)': 796.5 PMKs/s (RTT 2.8)
#3: 'CPU-Core (SSE2)': 733.4 PMKs/s (RTT 2.8)
#4: 'CPU-Core (SSE2)': 789.8 PMKs/s (RTT 2.8)
#5: 'Network-Clients': 0.0 PMKs/s (RTT 0.0)

この時点では、Xを起動しているのは(マルチディスプレイでない限りは)ディスプレイに接続しているグラフィックボード1台だけなので、リストにもGPUは1つしか表示されない。

以下、xorg.confを修正して残りのGPUも計算に使用できるようにする。

xorg.confの設定

参考:

http://code.google.com/p/pyrit/issues/detail?id=123
http://www.backtrack-linux.org/forums/backtrack-howtos/33227-ati-driver-|-stream-sdk-2-2-opencl-1-1-|-cal-|-cpyrit_calpp-|-7.html

上でも書いたが、pyritでの計算の際には、CrossFireを無効にする必要がある。

特に、今回使用するHD 6990はデュアルGPU構成のため、ボード上の2つのGPU間でデフォルトでCrossFireが有効になっているため、このままだと問題が発生する可能性がある。

※自分の環境では、デュアルGPUの複数差しをした場合にPyritがうまく実行できず、エラーが出た。シングルでの仕様の際には、1枚のボードに乗っている2つのがまとめて1つのGPUとして扱われるため、一応は実行できる(ただし、CrossFire接続のため、十分に性能が発揮できない)

以下の手順で、CrossFireの設定を無効化し、4つのGPUをそれぞれ独立させて計算できるようにする。

まず、以下のコマンドで/etc/X11/xorg.confを初期化する。

$ sudo aticonfig --adapter=all --initial

その後、Xを再起動させる。再起動後、CrossFireの設定を確認。

$ aticonfig --lscs

まだCrossFireの設定がenableになっているものがあれば、以下のコマンドを打つ。

$ sudo aticonfig --adapter=all --cf=off

その後、Xを再起動させる。再起動後、CrossFireの設定を確認。

$ aticonfig --lscs

まだCrossFireの設定がenableになっているものがあれば、以下のコマンドを打つ。

$ sudo aticonfig --adapter=0 --cfd

その後、Xを再起動させる。再起動後、CrossFireの設定を確認。

$ aticonfig --lscs

まだCrossFireの設定がenableになっているものがあれば、以下のコマンドを打つ。

$ sudo aticonfig --adapter=all --cfd

その後、Xを再起動させる。再起動後、CrossFireの設定を確認。

aticonfig --lscs

CrossFireの設定がすべてdisableになっていることを確認したら、以下のコマンドでコアリストを表示する。

$ pyrit list_cores

GPUが一つしか認識されていない場合は、以下のコマンドを打ち、他のGPUにアクセスできるようにする。

$ export DISPLAY=:0

再度コアリストを表示する。

$ pyrit list_cores

すべてのコア(GPU4つ)が表示されたら、以下のコマンドで動作をチェックする

$ pyrit benchmark
$ pyrit selftest

おそらく次のような結果が得られるはず。

Computed 12974.3 PMKs/s total.
#1: 'OpenCL-Device 'Cayman'': 42157.5 PMKs/s (RTT 1.7)
#2: 'OpenCL-Device 'Cayman'': 37175.3 PMKs/s (RTT 1.8)
#1: 'OpenCL-Device 'Cayman'': 39431.6 PMKs/s (RTT 1.7)
#2: 'OpenCL-Device 'Cayman'': 45134.9 PMKs/s (RTT 1.8)
#5: 'Network-Clients': 0.0 PMKs/s (RTT 0.0)

自分の環境では、およそ13,000 PMKs/s の速度で実行できた。これはCPUのみで計算した場合の約30倍である。

うまく実行できたら、ホームディレクトリの「.bashrc」に、

export DISPLAY=:0

を追記する。これで、起動時に自動で全てのGPUコアが使用可能になる。

以上でPyritのセットアップは完了。

あとは公式HP(http://code.google.com/p/pyrit/)を見ながら、実際に解析を行っていくだけである。

補足(最低限の使い方)

pcapの解析(SSID等の確認や、handshakeが含まれているかを確認)
$ pyrit -r wpa-Induction.pcap analyze

使用するpcapはOmnipeekやAircrack-ng等でキャプチャしたものでOK。

動作チェックをしたいだけなら、プログラムのソースにサンプルが入っているので、それを使えばいい。また、Wiresharkのページ(http://wiki.wireshark.org/HowToDecrypt802.11)にサンプルがあるので、それを使わせていただくのもいいかもしれない。

辞書ファイルを使ったパスワード解析

Pyrit自体には、辞書を生成する仕組みはない。辞書の質がパスワード解析の可否を握っているので、未知のパスワードを解析する場合には、いかにしてこれを準備するかが重要となる。

簡単にプログラムの動作チェックをしたいだけなら、プログラムのソースにサンプルが入っているので、それを使えばいい。

なお、辞書ファイルは適当な文字列を列挙したテキストファイル(もしくはそれをtarで圧縮したもの)であればいいため、ランダムな文字列を記載した辞書を作成するプログラムを作るか、ネットから適当な辞書を探せばとりあえず最低限の解析は出来るはず。

BSSIDを指定して解析

$ pyrit -r wpa-Induction.pcap -i dic.txt -b 00:0b:86:c2:a4:85 attack_passthrough

ESSIDを指定して解析

$ pyrit -r wpa-Induction.pcap -i dic.txt -e Coherer attack_passthrough

対象を指定せずに解析

$pyrit -r wpa-Induction.pcap -i dic.txt attack_passthrough

蛇足(一般的なパスワードを解くのにかかる時間)

「password」や「aaaaaaaa」のように、よく使用される単語をパスワードにしている場合、(使用する辞書ファイルに依存するが)パスワードが破られる可能性はある。

なぜなら、今回使用したPCのように、1秒間に13万個という速度で計算が出来るのであれば、1億単語が収録された辞書でもたった1時間で全てチェックできるからだ。

少なくとも、既存の単語のみを使ったパスワードやその繰り返し(testtestなど)は避けたほうが無難である。

対して、完全にランダムな文字列からなるパスワードを解くのは実質的に不可能といっていい。

例えば、バッファロー製の無線LANルーター(WZR-HP-AG300H)の場合、デフォルトで設定されているパスワードには

(数字:10文字+英小文字:26文字)×13文字 = 36の13乗
= 170,581,728,179,578,208,256

もの組み合わせがある。

もしこれを 13万 PMKs/s ですべて解析しようとすると、およそ『4000万年』ほどかかる。

偶然に答えが得られる確率は、『4年間計算させ続けてやっとジャンボ宝くじ1等当選と同程度』でしかない。

なので、もしネットワークの安全性に出現に不安を感じているなら、完全にランダムな文字列を用意するか、それが面倒なら、製品のデフォルトパスワードを使うことをお勧めする。

反対に言うと、完全にランダムな文字列を使っているWPA / WPA2-PSKネットワークに対しては、「Pyrit」のような超高速でブルートフォースアタックをするようなツールでは(少なくとも一般人が手に入れられるレベルのPCでの)ハッキングおよびクラッキングはきわめて困難だと言える。

WPAパーソナルモードのパスフレーズは、『8文字から63文字』の『ASCIIの印字可能文字(94文字)』もしくは『64桁の16進数』と定められている。つまり、パスワードの長さまでランダムに定めるならば、その組み合わせの総数は、

(ASCII印字可能文字:93文字)×63!/7! = 3.6×10の85乗

となる。これは、塵劫記寛永8年式でいうところの不可思議(10の80乗)を超えて無量大数(10の88乗)に迫る勢いだ。先の『(数字:10文字+英小文字:26文字)×13文字』など比較にもならない。

なので、(実際には完全にランダムな文字列と言うことはありえないだろうが)「Pyrit」のような辞書攻撃に対して一番頑健なのは、『ASCII印字可能文字からランダムに抽出した93文字の文字列』をパスワードに使うことだろう。まず破られることはありえない。

まとめると、現状「Pyrit」でWPA / WPA2-PSKのパスワードが破られる可能性があるのは、辞書に登録されているような予測可能なパスワードを使っている場合や、数字のみ、英小文字のみといった限定された文字種のみを使った短いパスフレーズを設定している場合に限られる。

このことから、従来の数十倍の解析速度と言うのは確かに驚異的ではあるが、その程度ではWPA / WPA2-PSKの安全性を脅かすほどの脅威ではない、と考えられる。