Skip to content

Instantly share code, notes, and snippets.

@vladignatyev
Created March 19, 2019 14:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vladignatyev/08a6a9630cfc02d2015b5b07f84095e3 to your computer and use it in GitHub Desktop.
Save vladignatyev/08a6a9630cfc02d2015b5b07f84095e3 to your computer and use it in GitHub Desktop.
Minimalistic Python 2 Multithread Portscan Tool
import sys
import socket
import errno
import threading
import time
from threading import Thread
class Worker(Thread):
def __init__(self, host, ports):
super(Worker, self).__init__()
self.host = host
self.ports = ports
self.sock = socket.socket(family=socket.AF_INET)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.settimeout(1)
self.open = []
self.skip = False
self.err = None
self.counter = 0
def run(self):
for port in self.ports:
r = self.sock.connect_ex((self.host, port))
self.sock.close()
self.sock = socket.socket(family=socket.AF_INET)
self.counter += 1
if r == 0:
self.open += [port]
elif r != errno.ECONNREFUSED:
# raise Exception(errno.errorcode[r])
self.err = errno.errorcode[r]
self.counter = len(self.ports)
break
def scan(host='127.0.0.1', start_port=1, end_port=65535, num_threads=253):
num_ports = end_port - start_port + 1
num_threads = num_threads if num_ports > num_threads else num_ports
workers = [Worker(host=host, ports=range(start_port + n, end_port + 1 + 1, num_threads)) for n in range(num_threads)]
map(Thread.start, workers)
executed_count = 0
while executed_count < num_ports:
sys.stdout.write("Progress: {now}/{total}\r".format(now=executed_count, total=num_ports))
sys.stdout.flush()
time.sleep(0.5)
executed_count = sum(map(lambda w: w.counter, workers))
sys.stdout.write(" " * 79 + "\r")
sys.stdout.flush()
map(Thread.join, workers)
host_port_tuples = [(host, port) for sublist in map(lambda t: t.open, workers) for port in sublist]
return host_port_tuples
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Scan TCP ports on remote host.')
parser.add_argument('--start-port', type=int, help='Port to start scan from', required=True)
parser.add_argument('--end-port', type=int, help='Port to end scan (inclusive)', required=True)
parser.add_argument('--num-threads', type=int, help='Number of parallel threads. Default is 253', required=True)
parser.add_argument('--host', type=str, help='Host address', required=True)
args = parser.parse_args()
s = scan(**args.__dict__)
for host, port in s:
print "%s:%s" % (host, port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment