backdoor CTF 2014 Misc 250a Writeup
ショルダーハッキングのスキルを駆使して、Satyamは友人であるPravjのパスワードの最後の3文字が007であることをようやく突き止めた。好奇心旺盛なハッカーである彼は、PravjのWiFiルータで転送されていたパケットもキャプチャした。キャプチャファイルはここからダウンロードできる。
SatyamはPravjの親しい友人であり、彼が16進法を愛していることを知っている。Satyamを助けて、WiFiパスワードをクラックせよ(彼はシフトキーを利用するということは思いつかなかったようだ)。
ヒント : 当然ではあるが、我々はあなたが持てるコンピューターリソースを試したいのではない。試したいのはスマートなブルートフォーススキルなのだ。
問題文を見ると明らかにWifiのパスワードをクラックする問題なのですが、一応キャプチャファイルをWiresharkで開いてみます。
Protocolの列でソートすると、EAPOLというタイプのパケットが4つだけあります。見てみるとWPAの鍵交換が行われているので、このクラックが目的であることがわかります。Wifiのクラック = aircrack-ngということで、CTF用に準備しているKali linuxのVMを起動してaircrack-ngに問題のキャプチャファイルを読ませてみます。Kaliは数多くのクラッキングツールが詰め込まれた特殊なディストリビューションですが、CTFでは必携と言っても過言ではありません。
root@kali-x86:~# aircrack-ng ./network.cap Opening ./network.cap Read 904 packets. # BSSID ESSID Encryption 1 00:14:6C:F5:8F:12 backdoor WPA (1 handshake) Choosing first network as target. Opening ./network.cap Please specify a dictionary (option -w). Quitting aircrack-ng...
”辞書がない”と怒られてしまいました。ここで普通なら辞書ファイルを適当な所から入手してきて利用するのですが、今回は以下のことがわかっており、通常の辞書ファイルを利用してもクラックできないのは明らかです。
- パスワードの最後の3文字は”0077″
- パスワード作成者は16進法Love
なので、この条件に合致するパスワードリストを生成するスクリプトをさくっと作りました。CTFで用いられるスクリプト系の言語はなぜかPythonが圧倒的に多いので、ここはPythonで書いてみました。管理人はPython超初心者ですが(古い人なので手に馴染んであるのはPerlです)、やることが単純かつ明確なので、ものの十数分(これでもかかりすぎですが…)で書けてしまいました。
# -*- coding: utf-8 -*- if __name__ == "__main__": f = open("pass.txt","w") i = 1 while True: j = '%x' % i k = j + "007" f.write(k) f.write("n") if (i == 1000000): break i = i + 1
超簡単なので、内容の説明は省略します。ループ回数が100万回なのは特に意味がありません。10万回でやったらaircrack-ngですぐに探索が終了してしまったため、増やしただけです。これでダメだったら1000万回にしようと思っていました。これを実行すると、100万行のパスワードが詰まったpass.txtが生成されます。
初回起動時に怒られた時のメッセージを参考に、引数に”-w pass.txt”を指定してaircrack-ngを実行してから待つこと7分、パスワードの解析が完了しました。
管理人の環境は今から見ればそれほどリッチではありませんので(Intel Core 7i 3930K + 16GB Memory)、そこそこのマシンであれば現実的な時間で解析が完了するでしょう。問題文を改めてみると、flagは”md5(wifi_password)”とありますので、得られた文字列をmd5sumにかければ求めるflagを得ることができます。md5の最後にあるハイフンは、ファイル名を省略したという意味です(通常はファイル名を引数に取る)。
$ echo -n e9b6f007 | md5sum c578ddd79dc30186ba22714e6afe5f18 -
aircrack-ngを知っていてパスワードリストを生成することさえできれば、簡単に解ける問題と言えるでしょう。