From 87b5c0652f3e37cac7368057a96527e5c9cca7d8 Mon Sep 17 00:00:00 2001 From: AQuaZar Date: Mon, 7 Oct 2019 13:06:52 +0300 Subject: [PATCH 1/5] Add port-sniffer task --- submissions/AQuaZar/port-sniffer/sniffer.py | 69 +++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 submissions/AQuaZar/port-sniffer/sniffer.py diff --git a/submissions/AQuaZar/port-sniffer/sniffer.py b/submissions/AQuaZar/port-sniffer/sniffer.py new file mode 100644 index 0000000..cba708a --- /dev/null +++ b/submissions/AQuaZar/port-sniffer/sniffer.py @@ -0,0 +1,69 @@ +from __future__ import print_function # Compatibility with python2 +import sys +import argparse +import socket + + +def range_type(astr, min=0, max=65535): + value = int(astr) + if min <= value <= max: + return value + else: + raise argparse.ArgumentTypeError( + 'value not in range {min}-{max}'.format(min, max)) + + +parser = argparse.ArgumentParser( + description='Output a list of opened TCP ports on specified host. By default all ports in range (0..65535) will be checked') + +parser.add_argument('--host', + metavar='Host', + type=str, + help='IPv4 address or domain name, which ports to check e.g. www.google.com, 192.168.0.1, e.t.c ', + required=True) +parser.add_argument('--ports', + metavar=('First', 'Last'), + type=range_type, + nargs=2, + default=[0, 65535], + help='To check specific range of ports, define first and last port from range, e.g. --ports 69 420') + +args = parser.parse_args() + + +def port_scan(host, first, last): + print('Searching') + open_ports = [] + for port in range(first, last+1): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(0.3) + result = sock.connect_ex((host, port)) + + if result == 0: + open_ports.append(port) + print('.', end='') + sys.stdout.flush() + sock.close() + print('\n') + return open_ports + + +if __name__ == '__main__': + ports = [] + try: + ports = port_scan(args.host, args.ports[0], args.ports[1]) + except KeyboardInterrupt: + print("Interrupted by user") + except socket.gaierror: + print('Hostname could not be resolved') + sys.exit() + except socket.error: + print("Couldn't connect to server") + sys.exit() + + if len(ports) == 0: + print('Not found any opened ports on desired host') + elif len(ports) == 1: + print('Port {0} is opened'.format(ports[0])) + else: + print(('Ports '+', '.join(map(str, ports))+' are opened.')) From d61ec02f606dfaab63e36868e94467db602f4e14 Mon Sep 17 00:00:00 2001 From: AQuaZar Date: Mon, 7 Oct 2019 15:05:26 +0300 Subject: [PATCH 2/5] Changed due to black formatting --- submissions/AQuaZar/port-sniffer/sniffer.py | 51 ++++++++++++--------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/submissions/AQuaZar/port-sniffer/sniffer.py b/submissions/AQuaZar/port-sniffer/sniffer.py index cba708a..f1f2b57 100644 --- a/submissions/AQuaZar/port-sniffer/sniffer.py +++ b/submissions/AQuaZar/port-sniffer/sniffer.py @@ -10,60 +10,67 @@ def range_type(astr, min=0, max=65535): return value else: raise argparse.ArgumentTypeError( - 'value not in range {min}-{max}'.format(min, max)) + "value not in range {min}-{max}".format(min, max) + ) parser = argparse.ArgumentParser( - description='Output a list of opened TCP ports on specified host. By default all ports in range (0..65535) will be checked') + description="""Output a list of opened TCP ports on specified host. + By default all ports in range (0..65535) will be checked""" +) -parser.add_argument('--host', - metavar='Host', - type=str, - help='IPv4 address or domain name, which ports to check e.g. www.google.com, 192.168.0.1, e.t.c ', - required=True) -parser.add_argument('--ports', - metavar=('First', 'Last'), - type=range_type, - nargs=2, - default=[0, 65535], - help='To check specific range of ports, define first and last port from range, e.g. --ports 69 420') +parser.add_argument( + "--host", + metavar="Host", + type=str, + help="IPv4 address or domain name, which ports to check e.g. www.google.com, 192.168.0.1, e.t.c ", + required=True, +) +parser.add_argument( + "--ports", + metavar=("First", "Last"), + type=range_type, + nargs=2, + default=[0, 65535], + help="To check specific range of ports, define first and last port from range, e.g. --ports 69 420", +) args = parser.parse_args() def port_scan(host, first, last): - print('Searching') + print("Searching") open_ports = [] - for port in range(first, last+1): + for port in range(first, last + 1): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.3) result = sock.connect_ex((host, port)) if result == 0: open_ports.append(port) - print('.', end='') + print(".", end="") sys.stdout.flush() sock.close() - print('\n') + print("\n") return open_ports -if __name__ == '__main__': +if __name__ == "__main__": ports = [] try: ports = port_scan(args.host, args.ports[0], args.ports[1]) except KeyboardInterrupt: print("Interrupted by user") except socket.gaierror: - print('Hostname could not be resolved') + print("Hostname could not be resolved") sys.exit() except socket.error: print("Couldn't connect to server") sys.exit() if len(ports) == 0: - print('Not found any opened ports on desired host') + print("Not found any opened ports on desired host") elif len(ports) == 1: - print('Port {0} is opened'.format(ports[0])) + print("Port {0} is opened".format(ports[0])) else: - print(('Ports '+', '.join(map(str, ports))+' are opened.')) + print(("Ports " + ", ".join(map(str, ports)) + " are opened.")) From a6fee28271e96f2592b7c9a3e9e1b98d21ee1b3d Mon Sep 17 00:00:00 2001 From: AQuaZar Date: Mon, 7 Oct 2019 15:11:32 +0300 Subject: [PATCH 3/5] Remove future import and rename min,max variables --- submissions/AQuaZar/port-sniffer/sniffer.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/submissions/AQuaZar/port-sniffer/sniffer.py b/submissions/AQuaZar/port-sniffer/sniffer.py index f1f2b57..7b52c5b 100644 --- a/submissions/AQuaZar/port-sniffer/sniffer.py +++ b/submissions/AQuaZar/port-sniffer/sniffer.py @@ -1,16 +1,15 @@ -from __future__ import print_function # Compatibility with python2 import sys import argparse import socket -def range_type(astr, min=0, max=65535): +def range_type(astr, minimal=0, maximal=65535): value = int(astr) - if min <= value <= max: + if minimal <= value <= maximal: return value else: raise argparse.ArgumentTypeError( - "value not in range {min}-{max}".format(min, max) + "value not in range {min}-{max}".format(minimal, maximal) ) From ad1cac233e9b940aa5b33919668965ccf7dc403b Mon Sep 17 00:00:00 2001 From: AQuaZar Date: Mon, 7 Oct 2019 15:20:45 +0300 Subject: [PATCH 4/5] Replace .format with fstrings --- submissions/AQuaZar/port-sniffer/sniffer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/submissions/AQuaZar/port-sniffer/sniffer.py b/submissions/AQuaZar/port-sniffer/sniffer.py index 7b52c5b..b7e538d 100644 --- a/submissions/AQuaZar/port-sniffer/sniffer.py +++ b/submissions/AQuaZar/port-sniffer/sniffer.py @@ -8,9 +8,7 @@ def range_type(astr, minimal=0, maximal=65535): if minimal <= value <= maximal: return value else: - raise argparse.ArgumentTypeError( - "value not in range {min}-{max}".format(minimal, maximal) - ) + raise argparse.ArgumentTypeError(f"value not in range {minimal}-{maximal}") parser = argparse.ArgumentParser( @@ -70,6 +68,6 @@ def port_scan(host, first, last): if len(ports) == 0: print("Not found any opened ports on desired host") elif len(ports) == 1: - print("Port {0} is opened".format(ports[0])) + print(f"Port {ports[0]} is opened") else: print(("Ports " + ", ".join(map(str, ports)) + " are opened.")) From f89df826584cb1b31a7848160e5da926566180cb Mon Sep 17 00:00:00 2001 From: AQuaZar Date: Mon, 7 Oct 2019 17:45:16 +0300 Subject: [PATCH 5/5] Refactor exceptions and result output --- submissions/AQuaZar/port-sniffer/sniffer.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/submissions/AQuaZar/port-sniffer/sniffer.py b/submissions/AQuaZar/port-sniffer/sniffer.py index b7e538d..87a1668 100644 --- a/submissions/AQuaZar/port-sniffer/sniffer.py +++ b/submissions/AQuaZar/port-sniffer/sniffer.py @@ -53,21 +53,13 @@ def port_scan(host, first, last): if __name__ == "__main__": - ports = [] try: ports = port_scan(args.host, args.ports[0], args.ports[1]) - except KeyboardInterrupt: - print("Interrupted by user") - except socket.gaierror: - print("Hostname could not be resolved") - sys.exit() - except socket.error: - print("Couldn't connect to server") + except (KeyboardInterrupt, socket.gaierror, socket.error) as error: + print(error) sys.exit() - if len(ports) == 0: - print("Not found any opened ports on desired host") - elif len(ports) == 1: - print(f"Port {ports[0]} is opened") + if ports: + print("Opened: " + ", ".join(map(str, ports))) else: - print(("Ports " + ", ".join(map(str, ports)) + " are opened.")) + print("Not found any opened ports on desired host")