-
Notifications
You must be signed in to change notification settings - Fork 0
/
sniffer.py
67 lines (53 loc) · 1.82 KB
/
sniffer.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
import socket
import time
import sys
import argparse
port_list = []
def ping(host, port):
try:
with socket.create_connection((host, port), 0.3) as sock:
sock.settimeout(0.3)
try:
sock.sendall('ping'.encode('utf8'))
except socket.timeout:
print("send data timeout")
except socket.error as ex:
print("send data error:", ex)
try:
data = sock.recv(1024).decode("utf8")
if data:
sys.stdout.write('.')
port_list.append(port)
sock.close()
except socket.error as ex:
pass
except:
pass
class PortError(Exception):
pass
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--port",
help="port range to scan, you can limit the range of ports to scan by providing --ports argument in format <start_port>-<end_port>, for instance: 3-600")
ap.add_argument('-ho', "--host", required=True,
help="host what you want to check, which can be either domain name, like google.com or IP address like 172.217.3.110")
args = vars(ap.parse_args())
if args['port'] is None:
start_port = 0
end_port = 65535
else:
start_port = int(args["port"].split('-')[0])
end_port = int(args["port"].split('-')[1])
while True:
if start_port >= 0 and end_port <= 65535:
break
else:
print("Enter valid range of ports!")
raise PortError()
try:
socket.inet_aton(args["host"])
for port_i in range(start_port, end_port+1):
ping(args["host"], port_i)
except socket.error:
print("Enter valid IP address!")
print('\n', ', '.join(map(str, port_list)) , "ports are opened")
sys.exit(0)