Erdem YILDIZ

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

Python ile Port Tarama ve Çalışan Servisi Bulma

Merhaba arkadaşlar bugün python ile yazmış olduğum script'de parametre olarak sizden hedef ip adresi , port bilgisi ve eğer isterseniz hedef'in kullandığı işletim sistemini öğrenmek üzere verdiğiniz parametreleri işleyerek sizlere bu 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.Port tarama ,üzerine çalışan servis hakkında bilgi edinme(banner grabbing) ve son olarak isteğe bağlı hedef'in kullandığı işletim sitemi gibi bilgileri yakalayıp getiren pekçok tool var. Bende bu tool'ların kodlarını inceleyerek ve nasıl davrandıklarını anlayarak herhangi bir 3.parti kütüphane eklemeden kendi tool'umu yazmak istedim(Burada nmap kütüphanesi sadece hedef'in kullandığı işletim sistemini öğrenmek için kullanılmıştır.)Burada "-ip" parametresiyle hedefin ip bilgisini "-port" parametresi taranacak port dizisini ve son olarak "-os" verdiğiniz True veya False bilgisiyle'de hedef üzerinde çalışan işletim sistemi öğrenmeyi etkinleştirerek script'i çalıştırıyoruz.

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.
ve
                                        #Port-Scan-Banner-Grabb.py
                                        # -*- coding: utf-8 -*-
                                        # Nmap sadece hedef işletim sisteminin bulmak için kullandım
                                        import nmap
                                        import socket
                                        import argparse
                                        import threading
                                        import time
                                        from bs4 import BeautifulSoup
                                        #----------------------
                                        ip_addr_list=[]
                                        port_list=[]
                                        os_version={}
                                        os_stat=""
                                        inf = {}
                                        #-----------------------


                                        #thread start kısmı
                                        def Start(ip,ports):
                                            ScanPort(ip,ports)

                                        def ScanPort(ip,ports):
                                            for i in ports:
                                                try:
                                                    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                                                    socket.setdefaulttimeout(1)
                                                    resp = s.connect_ex((ip,int(i)))
                                                    if resp == 0:
                                                        if int(i) == 80:
                                                            inf[ip].append({i:banner_grab_HTTP(s)})
                                                        else:
                                                            inf[ip].append({i:banner_grab(s)})

                                                except:
                                                    pass

                                        def banner_grab(conn):
                                          try:
                                            conn.send('Hello, is it me you\'re looking for? \r\n')
                                            ret = conn.recv(1024)
                                            resp = str(ret)
                                            return resp
                                          except Exception, e:
                                            return ""

                                        def banner_grab_HTTP(conn):
                                          try:
                                            conn.send('GET HTTP/1.1 \r\n')
                                            ret = conn.recv(1024)
                                            soup = BeautifulSoup(ret, "html.parser")
                                            get = soup.find("address")
                                            return get.text
                                          except Exception, e:
                                            return ""

                                        def OS(ip_addr, ports):
                                            nm = nmap.PortScanner()
                                            for port in ports:
                                                nm.scan(str(ip_addr), str(port), arguments='-O')
                                                tut = nm[ip_addr]["osmatch"]
                                                try:

                                                    osname = tut[0]["osclass"][0]["osfamily"]
                                                    print ip_addr, "os --> ", osname
                                                    break
                                                except:
                                                    pass


                                        def Show():
                                            print("#" * 25 + "open ports" + "#" * 25)
                                            for i in ip_addr_list:
                                                print("-" * 50)
                                                if os_stat == "True" or os_stat == "true":
                                                    OS(i,port_list)
                                                for port in inf[i]:
                                                    print i ,"-->",port

                                        if __name__ =="__main__":

                                            parser = argparse.ArgumentParser()
                                            parser.add_argument("-ip",  help="ip address dizisi girin",type=str)
                                            parser.add_argument("-port",help="port adresleri giriniz",type=str)
                                            parser.add_argument("-os",  help="hedef işletim sistmei belirlemek için kullan.(True or False)",type=str)

                                            args = parser.parse_args()
                                            os_stat=args.os
                                            #ip addr'ları listeye ekledik
                                            for i in args.ip.split(","):
                                                ip_addr_list.append(i)
                                                inf[i]=[]
                                            #portarı listeye ekledik
                                            for i in args.port.split(","):
                                                port_list.append(i)
                                                #OS statu


                                            for i in ip_addr_list:
                                                t = threading.Thread(target=Start , args=(i,port_list))
                                                t.start()
                                            time.sleep(len(port_list)*7)
                                            Show()




                                        

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