利用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()
STRIVE FOR PROGRESS,NOT FOR PERFECTION