利用Python实现端口扫描及Banner采集

利用Python实现端口扫描及Banner采集

import threading
import sys
import optparse
import socket

class BannerGrab:
    def __init__(self) -> None:
        self.target = self.get_params()[0]
        self.ports = self.get_params()[1]
        self.port_range = self.ports_format()
        print('[+] Start to scan target: %s\n\n' % self.target)
        self.signal = threading.Semaphore(value=1)
        socket.setdefaulttimeout(2)

    def get_params(self):
        parser = optparse.OptionParser('Usage: ./%s -t target -p port range' % sys.argv[0])
        parser.add_option('-t', '--target', dest='target', type='string', help='Specify target IP address')
        parser.add_option('-p', '--ports', dest='ports', type='string', help='Specify port range to scan')
        options, args = parser.parse_args()
        if options.ports is None:
            options.ports = '1-1000'
        if options.target is None:
            print('[-] Please specify target IP address')
            sys.exit()
        return options.target, options.ports
    
    def ports_format(self):
        if '-' in self.ports:
            start_port = self.ports.split('-')[0]
            end_port = self.ports.split('-')[1]
            return [port for port in range(int(start_port), int(end_port)+1)]
        elif ',' in self.ports:
            return [int(port) for port in self.ports.split(',')]
        else:
            return [int(self.ports)]
    
    def connect_port(self, port):
        try:
            
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((self.target,port))
            
            data = 'Scanner by Jason\n'
            s.send(data.encode('utf-8'))
            recv_data = s.recv(1024)
            
            self.signal.acquire()
            print(recv_data.decode('utf-8'))
            print('[+] Port %d open \nBanner: %s' % (port, recv_data.decode('utf-8')))

        except:
            
            pass

        finally:
            s.close()
            self.signal.release()
    
    def run(self):
        for port in self.port_range:
            t = threading.Thread(target=self.connect_port, args=(port,))
            t.start()
            t.join()
        

        print('[+] Finished scanning!')

if __name__ == '__main__':
    scanner = BannerGrab()
    scanner.run()
posted @ 2023-01-11 17:06  Jason_huawen  阅读(22)  评论(0编辑  收藏  举报