Created
March 19, 2019 14:58
-
-
Save vladignatyev/08a6a9630cfc02d2015b5b07f84095e3 to your computer and use it in GitHub Desktop.
Minimalistic Python 2 Multithread Portscan Tool
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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