Python3 : Kleiner Portscanner
Ist jetzt zwar kein Hexenwerk aber hier ein kleiner Portscanner in Python3
#!/usr/bin/env python3
import argparse , socket , sys , logging
from datetime import datetime
SOCKET_STATES = {
0: "open",
11: "firewalled",
111: "closed",
}
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("hostname", metavar="HOSTNAME",
help="define the hostname to be checked")
parser.add_argument("start_port", type=int, metavar="START_PORT",
help="define the start port")
parser.add_argument("end_port", type=int, metavar="END_PORT",
help="define the end port")
parser.add_argument("-a", "--all-ports", action="store_true",
help="shows all (default is show only open ports)")
parser.add_argument("-l", "--logfile", type=str,
help="if set i will write an logfile (you have to set an logfile incl path)")
parser.add_argument("-t", "--timeout", type=int, default=3,
help=("set the TIMEOUT for socket operations (default is 3 seconds)"))
parser.add_argument("-v", "--verbose", action="store_true",
help="set debug mode (set --all-ports)")
args = parser.parse_args()
if args.end_port < args.start_port:
sys.exit("END_PORT must be higher then START_PORT")
if 0 < args.start_port <= 65535 and 0 < args.end_port <= 65535:
return args
else:
sys.exit("The Portrange must between 1-65535")
def get_ip_address(hostname):
try:
return socket.gethostbyname(hostname)
except socket.error as err:
# print (str(err))
print ('Hostname could not be resolved. Exiting')
sys.exit(4)
def check_port(ip, port):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
result = s.connect_ex((ip, port))
return SOCKET_STATES.get(result, result)
except KeyboardInterrupt:
sys.exit(1)
except socket.gaierror:
print ('Hostname could not be resolved. Exiting')
sys.exit(3)
except socket.error:
print ("Couldn't connect to server")
sys.exit(2)
def write_log(entry,state):
if state in ['info', 'warning', 'critical','error']:
log_method = getattr(logging,state)
log_method(str(entry))
def scan_ports(remote_host, start_port, end_port, logfile , debug=False, show_all=False):
ip = get_ip_address(remote_host)
# Print Banner
print ("-" * 90)
print ("please wait, scanning remote host {0} , takes some time !".format(ip))
print ("-" * 90)
print ("\n")
t_start = datetime.now()
for port in range(start_port, end_port + 1):
if debug:
print ("\n--> check port {0} on ip {1}\n".format(port, ip))
port_state = check_port(ip, port)
if logfile:
write_log ("--> check port {0} on ip {1} its {2}".format(port, ip, port_state),"info")
if port_state == "open" or show_all or debug:
print ("Port {0: >5}: {1: >10}".format(port, port_state))
duration = datetime.now() - t_start
print ("\n")
print ("-" * 90)
print ("scanning completed in : {0}".format(duration))
if __name__ == '__main__':
args = parse_args()
socket.setdefaulttimeout(int(args.timeout))
logging.basicConfig(format='%(asctime)s | %(levelname)s | %(message)s',filename=args.logfile,filemode='w',level=logging.DEBUG)
scan_ports(remote_host=args.hostname,
start_port=args.start_port, end_port=args.end_port,
debug=args.verbose, show_all=args.all_ports,logfile=args.logfile)