diff --git a/README.md b/README.md index 5f72aa9..5524316 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,10 @@ A Python-based network vulnerability scanner developed for educational purposes. ## Usage ```bash -python3 scanner.py +python3 portscanner.py --targets 127.0.0.1 --ports 100 ``` + +You can still run interactively by omitting flags. ![Port Scan](Screenshots/run_Command) Sample Output diff --git a/portscanner.py b/portscanner.py index f5aae96..966d037 100644 --- a/portscanner.py +++ b/portscanner.py @@ -1,30 +1,64 @@ # Network Vulnerability Scanner +import argparse import socket + import termcolor -def scan(target, ports): - print('\n' + ' Starting Scan For ' + str(target)) - for port in range(1,ports): - scan_port(target,port) +def scan(target: str, port_count: int, timeout: float = 1.0) -> None: + print("\n" + " Starting Scan For " + str(target)) + # Inclusive upper bound: scanning N ports means 1..N + for port in range(1, port_count + 1): + scan_port(target, port, timeout) + + +def scan_port(ipaddress: str, port: int, timeout: float) -> None: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(timeout) + try: + if sock.connect_ex((ipaddress, port)) == 0: + print("[+] Port Opened " + str(port)) + except OSError: + pass + finally: + sock.close() + + +def main() -> None: + parser = argparse.ArgumentParser(description="Simple TCP port scanner") + parser.add_argument( + "--targets", + help="Comma-separated IPs/hostnames (prompted if omitted)", + ) + parser.add_argument( + "--ports", + type=int, + help="Number of ports to scan from 1 (prompted if omitted)", + ) + parser.add_argument( + "--timeout", + type=float, + default=1.0, + help="Per-port connect timeout in seconds (default: 1.0)", + ) + args = parser.parse_args() + + targets = args.targets or input("[*] Enter Targets To Scan (split them by ,): ") + port_count = args.ports or int( + input("[*] Enter How Many Ports You Want To Scan: ") + ) + if port_count < 1 or port_count > 65535: + raise SystemExit("Port count must be between 1 and 65535.") -def scan_port(ipaddress, port): - try: - sock = socket.socket() - sock.connect((ipaddress, port)) - print("[+] Port Opened " + str(port)) - sock.close() - except: - pass + if "," in targets: + print(termcolor.colored("[*] Scanning Multiple Targets", "green")) + for ip_addr in targets.split(","): + scan(ip_addr.strip(), port_count, args.timeout) + else: + scan(targets.strip(), port_count, args.timeout) -targets = input("[*] Enter Targets To Scan(split them by ,): ") -ports = int(input("[*] Enter How Many Ports You Want To Scan: ")) -if ',' in targets: - print(termcolor.colored(("[*] Scanning Multiple Targets"), 'green')) - for ip_addr in targets.split(','): - scan(ip_addr.strip(' '), ports) -else: - scan(targets,ports) +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f84fa80..1f69ccc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -# No external dependencies required. +termcolor>=2.4.0,<3 \ No newline at end of file