# -*- encoding=utf-8
#!/usr/bin/env python
import socket, time, datetime, argparse, os, sys
from termcolor import colored
os.system('clear')
b = 0
info = """
_______ _______ _______ _________ _______ _______ _______ _ _ _______ _______
( ____ )( ___ )( ____ )\__ __/ ( ____ \( ____ \( ___ )( ( /|( ( /|( ____ \( ____ )
| ( )|| ( ) || ( )| ) ( | ( \/| ( \/| ( ) || \ ( || \ ( || ( \/| ( )|
| (____)|| | | || (____)| | | _____ | (_____ | | | (___) || \ | || \ | || (__ | (____)|
| _____)| | | || __) | |(_____)(_____ )| | | ___ || (\ \) || (\ \) || __) | __)
| ( | | | || (\ ( | | ) || | | ( ) || | \ || | \ || ( | (\ (
| ) | (___) || ) \ \__ | | /\____) || (____/\| ) ( || ) \ || ) \ || (____/\| ) \ \__
|/ (_______)|/ \__/ )_( \_______)(_______/|/ \||/ )_)|/ )_)(_______/|/ \__/
V1.0 by jopcode
Ejemplo de uso: python port-scann.py domain.com 1 5000
- podra escanear desde el puerto 1 al 5000 del host 'domain.com'
"""
print colored(info,"red", attrs=['bold'])
# Leer sobre el "argparse" viene bastante bien para analizar argumentos.
parser = argparse.ArgumentParser(description = info, formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('host', metavar='H', help='Host name you want to scan')
parser.add_argument('startport', metavar='P1', nargs='?', help='Start scanning from this port')
parser.add_argument('endport', metavar='P2', nargs='?',help='Scan until this port')
args = parser.parse_args()
# Host para escanear los puertos
host = args.host
# OBtiene la direccion ip del host
ip = socket.gethostbyname(host)
# Comprobamos si se han definido el inicio y final de los puertos a escanear
# Si no son definidos se usaran los puertos TCP mas populares
if(args.startport) and args.endport:
# SI la condicion se cumple, escaneara dentro de este rango
start_port = int(args.startport)
end_port = int(args.endport)
else:
# SI la condicion no se cumple, se usaran los puertos mas comunes para escanear
b = 1
# Lista de los puertos abiertos
open_ports = []
# Puertos TCP mas populares
ports = {
'21': 'FTP',
'22': 'SSH',
'23': 'TELNET',
'25': 'SMTP',
'53': 'DNS',
'69': 'TFTP',
'80': 'HTTP',
'109': 'POP2',
'110': 'POP3',
'123': 'NTP',
'137': 'NETBIOS-NS',
'138': 'NETBIOS-DGM',
'139': 'NETBIOS-SSN',
'143': 'IMAP',
'156': 'SQL-SERVER',
'389': 'LDAP',
'443': 'HTTPS',
'546': 'DHCP-CLIENT',
'547': 'DHCP-SERVER',
'995': 'POP3-SSL',
'993': 'IMAP-SSL',
'2086': 'WHM/CPANEL',
'2087': 'WHM/CPANEL',
'2082': 'CPANEL',
'2083': 'CPANEL',
'3306': 'MYSQL',
'8443': 'PLESK',
}
# Tiempo de inicio
start_time = time.time()
print colored("[+] Port Scanner", "yellow", attrs=['bold'])
if (b):
# no se proporciono un rango de puertos se usaran los mas comunes
print colored("\n[+] Analizando Puertos mas comunes en: %s", "blue", attrs=['bold']) % (host)
else:
# Se espesifico un rango de puertos para escanear
print colored("\n[+] Scan lanzado en %s desde los puertos %s - %s: ", "blue", attrs=['bold']) % (host, start_port, end_port)
print colored("[+] A las %s", "blue", attrs=['bold']) % (time.strftime("%I:%M:%S %P"))
# Conectara a los puertos y comprobara si estan abiertos o cerrados
def check_port(host, port, result = 1):
# Usa 3 argumentos
# Host: Ip a escanear
# puerto: numero del puerto a escanear
try:
# Creo un objecto socket llamado 'S'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Tiempo de espera del socket para no ser por siempre
s.settimeout(0.5)
# COnecta al socket
# Si se hizo una conexion correcta significa que el puerto esta abierto y R devolvera 0
r = s.connect_ex((host, port))
if r == 0:
result = r
# Cerrar el socket
s.close()
except Exception, e:
pass
# Retorna el resultado del scan
return result
# Lee el diccionario de puertos y servicios
# a la vez comprueba el nombre de servicio correspondiente a un puerto
def get_service(port):
# Convierte INT en STR
port = str(port)
# Comprueba el puerto en los puertos comunes
if port in ports:
return ports[port] # Devulve el nombre del servicio
else:
return 0 # No se identifica el servicio
try:
print colored("\n[+] Scan en progreso...", "red", attrs=['bold'])
print colored("[+] Comenzando el scan de puertos", "red", attrs=['bold'])
# No se dio ningun rango de puertos
if b:
# Scanea los puertos comunes
for p in sorted(ports):
sys.stdout.flush()
p = int(p)
# Conecta al puerto
response = check_port(host, p)
if response == 0:
# Añade a la lista de puertos abiertos
open_ports.append(p)
else:
# Se dio un rango de puertos
for p in range(start_port, end_port + 1):
sys.stdout.flush()
# Conecta al puerto
response = check_port(host, p)
if response == 0:
# Añade a la lista de puertos abiertos
open_ports.append(p)
print colored("\n[+] Scan completado a las %s", "blue", attrs=['bold']) % (time.strftime("%I:%M:%S %p"))
end_time = time.time()
# Tiempo total de uso del scan
total_time = end_time - start_time
print colored("'\n\t[-] Scan info: %s", "white", attrs=['bold']) % (host)
if total_time <= 60:
total_time = str(round(total_time, 2))
print("\t[-] Scan hecho en %s segundos") % (total_time)
else:
total_time = total_time / 60
print("\t[-] Scan hecho en %s minutos") % (total_time)
if open_ports:
# Hay puertos abiertos
print "\t[-] Puertos abiertos: "
for i in sorted(open_ports):
service = get_service(i)
if not service:
# No se reconocio el servicio
service = "Unknown service"
print('\t[-] %s - %s: Abierto') % (i, service)
else:
# No se encontraron puertos abiertos
print colored("\n[+]No se encontraron puertos abiertos :'(", "red", attrs=['bold'])
except KeyboardInterrupt:
# Si se interrumpe con un "ctrl-c" por ejemplo
print "Bye!"
sys.exit(1)
SImple port scanner of port common and a range of port
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.