-
Notifications
You must be signed in to change notification settings - Fork 3
/
port_scanner.py
79 lines (70 loc) · 2.73 KB
/
port_scanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import argparse
import threading
import socket
import time
open_ports = []
def prepare_args():
options = argparse.ArgumentParser(description="Simple Python Port Scanner", usage="%(prog)s 192.168.1.2",epilog="Example - %(prog)s -s 80 -e 1024 -t 500 -V 192.168.1.2")
options.add_argument("-s","--start",metavar="\b", dest="start",type=int,help="Starting Port",default=1)
options.add_argument("-e","--end",metavar="\b",dest="end",type=int,help="Ending Port",default=65535)
options.add_argument("-t","--thread",metavar="\b",dest="thread",type=int,help="Number of thread",default=50)
options.add_argument("-V","--verbose",dest="verbose",action="store_true",help="Verbose Mode")
options.add_argument("-v","--version",action="version",version="%(prog)s 1.0",help="Print Version")
options.add_argument("-U","--udp",dest="udp",action="store_true",help="UDP Scan")
options.add_argument(metavar="Target",dest="ip",help="Target to Scan")
args = options.parse_args()
return args
#Generator function for ports.
def prepare_ports(start:int,end:int):
for port in range(start,end +1):
yield port
def tcpScan():
while True:
try:
s = socket.socket()
s.settimeout(1)
port = next(ports)
s.connect((arguments.ip,port))
open_ports.append(port)
if arguments.verbose:
print(f"\r{open_ports}",end="")
except (ConnectionRefusedError,socket.timeout):
continue
except StopIteration:
break
def udpScan():
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(1)
port = next(ports)
s.sendto(b"", (arguments.ip, port))
s.recvfrom(1024)
open_ports.append(port)
if arguments.verbose:
print(f"\r{open_ports}",end="")
except (ConnectionRefusedError,socket.timeout):
continue
except StopIteration:
break
def prepare_threads(threads:int):
thread_list = []
for _ in range(threads+1):
if arguments.udp == True:
thread_list.append(threading.Thread(target=udpScan))
else:
thread_list.append(threading.Thread(target=tcpScan))
for thread in thread_list:
thread.start()
for thread in thread_list:
thread.join()
if __name__ == "__main__":
arguments = prepare_args()
ports = prepare_ports(arguments.start,arguments.end)
start_time = time.time()
prepare_threads(arguments.thread)
end_time= time.time()
if arguments.verbose:
print("\n")
print(f"Found Open Ports - {open_ports}")
print(f"Scanned Ports in {round(end_time-start_time,2)}")