dotfiles/scripts/bin/old-port-scanner.py

109 lines
3.3 KiB
Python
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/python3
# Information Security
# Certification Project #3
import socket
import common_ports
import re
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Testing
# target = "www.freecodecamp.org"
# target = socket.gethostbyname("www.freecodecamp.org")
# target = "hi"
# port_range = [75,85]
# Testing Function
# get_open_ports(target, port_range)
def get_open_ports(target, port_range, verbose=None):
# Test if target is URL or IP address, if invalid give correct error message
target_ip = None
target_url = None
try:
ip_addr = socket.gethostbyname(target)
except:
if re.search('^[0-9]+', target):
print('Target:', target, 'is an ip address')
target_ip = True
print('Error: Invalid IP address')
exit()
elif re.search('^[A-Za-z]+', target):
print('Target:', target, 'is a url')
target_url = True
print('Error: Invalid hostname')
exit()
print('Error: Invalid hostname or IP address')
exit()
# Creates list of ports from starting and ending ports given
ports_list = list()
for port in port_range:
while port <= port_range[1]:
ports_list.append(port)
port += 1
# Connects (if url/ip is valid) and checks for open ports
open_ports = []
# for each port in list, connect
for port in ports_list:
print('Checking port:', port, 'for target:', target)
# if port is open, add to open_ports
try:
s.connect_ex((target, port)) # == 0
s.settimeout(5)
open_ports.append[port]
print('Port', port, 'is open')
print('Open ports:', open_ports)
# if it can't connect, display correct output
except socket.error or socket.gaierror or socket.getaddrinfo:
if target_ip:
print('Error: Invalid IP address')
exit()
elif target_url:
print('Error: Invalid hostname')
exit()
except:
print('Port', port, 'is closed')
continue
print('\n* Finished scanning target *')
if not open_ports:
print('No open ports found on target', target)
else:
print('Open ports found:', open_ports, 'on', target)
# Output
print(f'\n* Scanning Target: {target} ({ip_addr}) *')
print('- Scanning ports:', port_range[0], 'to', port_range[-1])
# Verbose Output
# ports = tuple()
# service = dict()
serv_d = common_ports.ports_and_services
# for each port in open_ports
svcs_dict = {port: serv_d[port] for port in open_ports}
# svcs_list = [ v for k,v in svcs_dict.items() ]
if verbose:
print(f'\nOpen ports for {target} ({ip_addr})')
print('PORT     SERVICE')
# for port in open_ports:
# print(f'{port}     {common_ports.ports_and_services[port]}')
# print(f'{port}     {common_ports.ports_and_services(port)}')
# for opts in service:
for port, service in svcs_dict.items():
print(str(port) + '     ' + str(service))
# return print('{}     {}'.format(port, service))
return
elif not verbose:
print('Open Ports:', open_ports)
s.close()
return
return (open_ports)
# return(target, port_range)