Add network scan
This commit is contained in:
parent
8f2913d463
commit
222649cd8d
202
python-ofensivo/14_escaner_red_ICMP/network_scaner.py
Normal file
202
python-ofensivo/14_escaner_red_ICMP/network_scaner.py
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
# /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Escaner de red ICMP
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import ipaddress
|
||||||
|
import re
|
||||||
|
import signal
|
||||||
|
import subprocess
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
from termcolor import colored
|
||||||
|
|
||||||
|
|
||||||
|
def def_handler(sig, frame):
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
"\n\n[!] Saliendo del programa...\n", "blue")
|
||||||
|
)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, def_handler)
|
||||||
|
|
||||||
|
|
||||||
|
def get_arguments():
|
||||||
|
"""
|
||||||
|
Obtiene los argumentos de la linea de comandos
|
||||||
|
"""
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Escaner de red ICMP")
|
||||||
|
parser.add_argument(
|
||||||
|
"-t", "--target",
|
||||||
|
required=True, dest="target",
|
||||||
|
help="Host o rango de red a escanear"
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
return args.target
|
||||||
|
|
||||||
|
|
||||||
|
def validar_ip(target_str):
|
||||||
|
"""
|
||||||
|
Valida si el target es una IP o un rango de IPs
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Verificar si es un rango de IPs
|
||||||
|
rango_match = re.match(
|
||||||
|
r'^(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})-(\d{1,3})$', target_str)
|
||||||
|
|
||||||
|
if rango_match:
|
||||||
|
ip_inicio = rango_match.group(1)
|
||||||
|
|
||||||
|
ip_fin = int(rango_match.group(2))
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Convertir la IP de inicio a un objeto ipaddress
|
||||||
|
ipaddress.IPv4Address(ip_inicio)
|
||||||
|
|
||||||
|
# Verificar que el rango sea válido
|
||||||
|
if 0 <= ip_fin <= 255:
|
||||||
|
|
||||||
|
# Crear un objeto ipaddress para la IP de inicio
|
||||||
|
inicio = ipaddress.IPv4Address(ip_inicio)
|
||||||
|
|
||||||
|
# Crear un objeto ipaddress para la IP de fin
|
||||||
|
fin = ipaddress.IPv4Address(
|
||||||
|
ip_inicio.rsplit('.', 1)[0] + '.' + str(ip_fin)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Verificar que la IP de inicio sea menor que la IP de fin
|
||||||
|
if inicio < fin:
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
f"\n[+] Escaneando el rango de IPs: {inicio} - {fin}",
|
||||||
|
"blue")
|
||||||
|
)
|
||||||
|
rango_ips = ipaddress.summarize_address_range(inicio, fin)
|
||||||
|
return rango_ips
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
"\n[!] Error: El rango debe ser de menor a mayor",
|
||||||
|
"red")
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
"\n[!] Error: El rango especificado no es válido",
|
||||||
|
"red")
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
except ipaddress.AddressValueError:
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
"\n[!] Error: El rango especificado no son IPs válidas",
|
||||||
|
"red")
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
# Si no es un rango, verificar si es una IP individual
|
||||||
|
try:
|
||||||
|
|
||||||
|
ipaddress.IPv4Address(target_str)
|
||||||
|
print(colored(
|
||||||
|
f"\n[+] Escaneando IP: {target_str}", "blue")
|
||||||
|
)
|
||||||
|
return target_str
|
||||||
|
|
||||||
|
except ipaddress.AddressValueError:
|
||||||
|
print(colored(
|
||||||
|
"\n[!] Error: El target especificado no es una IP válida",
|
||||||
|
"red")
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def parse_target(target_str):
|
||||||
|
"""
|
||||||
|
Parsea el target y devuelve una lista de IPs
|
||||||
|
"""
|
||||||
|
|
||||||
|
if "-" in target_str:
|
||||||
|
|
||||||
|
ip_list = target_str.split('-')
|
||||||
|
|
||||||
|
ip_inicio = ip_list[0]
|
||||||
|
ip_fin = int(ip_list[1])
|
||||||
|
|
||||||
|
inicio = ipaddress.IPv4Address(ip_inicio)
|
||||||
|
|
||||||
|
fin = ipaddress.IPv4Address(
|
||||||
|
ip_inicio.rsplit('.', 1)[0] + '.' + str(ip_fin)
|
||||||
|
)
|
||||||
|
|
||||||
|
ips_return = []
|
||||||
|
|
||||||
|
for ip in range(int(ip_inicio.split('.')[3]), ip_fin + 1):
|
||||||
|
|
||||||
|
ip_address = ip_inicio.rsplit('.', 1)[0] + '.' + str(ip)
|
||||||
|
|
||||||
|
ips_return.append(ip_address)
|
||||||
|
|
||||||
|
return ips_return
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
# Si target_str es una IP individual, crear una lista con esa IP
|
||||||
|
target_list = [target_str]
|
||||||
|
|
||||||
|
return target_list
|
||||||
|
|
||||||
|
|
||||||
|
def host_discovwery(target):
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
ping = subprocess.run(
|
||||||
|
["ping", "-c", "1", target],
|
||||||
|
timeout=1, stdout=subprocess.DEVNULL
|
||||||
|
)
|
||||||
|
|
||||||
|
if ping.returncode == 0:
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
f"[+] {target} está activo", "green")
|
||||||
|
)
|
||||||
|
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Funcion principal
|
||||||
|
"""
|
||||||
|
|
||||||
|
target_str = get_arguments()
|
||||||
|
|
||||||
|
if not validar_ip(target_str):
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
"\n[!] Introduce un target válido", "red")
|
||||||
|
)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
targets = parse_target(target_str)
|
||||||
|
|
||||||
|
with ThreadPoolExecutor(max_workers=50) as executor:
|
||||||
|
|
||||||
|
executor.map(host_discovwery, targets)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
@ -25,5 +25,6 @@ Quizá encuentres aquí cosas que no están en el vídeo, o viceversa, son apunt
|
|||||||
| 9. [Bloc de notas](./09_bloc_notas/) |
|
| 9. [Bloc de notas](./09_bloc_notas/) |
|
||||||
| 10. [Calculadora](./10_calculadora/) |
|
| 10. [Calculadora](./10_calculadora/) |
|
||||||
| 11. [Chat cifrado con E2E](./11_chat_cifrado_E2E/) |
|
| 11. [Chat cifrado con E2E](./11_chat_cifrado_E2E/) |
|
||||||
| 12 [Escaner de puertos](./12_escaner_puertos/) |
|
| 12. [Escaner de puertos](./12_escaner_puertos/) |
|
||||||
| 13 [Cambiador de MAC](./13_cambiar_mac_address/) |
|
| 13. [Cambiador de MAC](./13_cambiar_mac_address/) |
|
||||||
|
| 14. [Escaner de red ICMP](./14_escaner_red_ICMP/) |
|
||||||
|
Loading…
Reference in New Issue
Block a user