hicmp - Detector de hosts

Publicado por henrique (última atualização em 18/01/2023)

[ Hits: 3.228 ]

Homepage: naotem.com

Download hicmp.py




Um detector de hosts em icmp com opção de máscara de rede, salvar os hosts detectados em arquivo e timeout em Python.

  



Esconder código-fonte

#!/bin/python3

# Author: mrh

# importações
import socket, struct, ipaddress, time, random, argparse
from threading import Thread; from colorama import Fore

# banner
print('-' * 65)
print(Fore.LIGHTYELLOW_EX + """
        .------..------..------..------..------.
        |H.--. ||I.--. ||C.--. ||M.--. ||P.--. |
        | :/\: || (\/) || :/\: || (\/) || :/\: |
        | (__) || :\/: || :\/: || :\/: || (__) |
        | '--'H|| '--'I|| '--'C|| '--'M|| '--'P|
        `------'`------'`------'`------'`------'
""")

SIGNAL = True
#entrada de dados pelo terminal
parser = argparse.ArgumentParser(description='Um detector de hosts em icmp com opção de mascara de rede em python', usage='./hicmp.py -d 192.168.0.0/16 -w 0.0001 -o dominios.txt')
parser.add_argument('-d', '--domain', action='store', dest='hosts', help='dominio ou dominios', required=True)
parser.add_argument('-o', '--output', action='store', dest='output', default='output.txt', help='salvar em um arquivo os hosts encontrados')
parser.add_argument('-w', '--wait', action='store', dest='wait', default='0.0001', help='tempo de espera', type=float)
arguments = parser.parse_args()


#calculo para criar o pacote icmp
def checksum(source_string):
    sum = 0
    count_to = (len(source_string) / 2) * 2
    count = 0
    while count < count_to:
        this_val = source_string[count + 1] * 256 + source_string[count]
        sum = sum + this_val
        sum = sum & 0xffffffff
        count = count + 2
    if count_to < len(source_string):
        sum = sum + source_string[len(source_string) - 1]
        sum = sum & 0xffffffff
    sum = (sum >> 16) + (sum & 0xffff)
    sum = sum + (sum >> 16)
    answer = ~sum
    answer = answer & 0xffff
    answer = answer >> 8 | (answer << 8 & 0xff00)
    return answer

#criar pacote
def create_packet(id):
    header = struct.pack('bbHHh', 8, 0, 0, id, 1)
    data = 192 * 'Q'
    my_checksum = checksum(header + data.encode())
    header = struct.pack('bbHHh', 8, 0, socket.htons(my_checksum), id, 1)
    return header + data.encode()

#definindo o ping(requisição icmp)
def ping(addr, timeout=1):
    try:
        my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
        packet_id = int((id(timeout) * random.random()) % 65535)
        packet = create_packet(packet_id)
        my_socket.connect_ex((addr, 80))
        my_socket.sendall(packet)
        my_socket.close()
    except PermissionError:
        print('[*] Este programa precisa ser iniciado como root')
    except Exception as e:
        print(e)

#enviando os pacotes icmp e salvando
def rotate(addr, file_name, wait, responses):
    print("[*] Enviando pacotes  \n")
    for ip in addr:
        ping(str(ip))
        time.sleep(wait)

    print("[*] Todos os pacotes foram enviados\n")

    print("[*] Esperando por todas as respostas\n")
    time.sleep(2)

    # Parando de esperar
    global SIGNAL
    SIGNAL = False
    ping('127.0.0.1')  # ping falso para parar de esperar

    print(len(responses), "-> Hosts enconctrados\n")
    hosts = []
    if len(arguments.output) > 0:
        file = open(file_name, 'w')
        i = 0
        for response in sorted(responses):
            i += 1
            ip = struct.unpack('BBBB', response)
            ip = f'{ip[0]}.{ip[1]}.{ip[2]}.{ip[3]}'
            hosts.append(ip)
            file.write(f'Host{i}: ' + str(ip) + '\n')
        print('[*] Escrevendo arquivo...\n')
    print("[*] Processo encerrado\n")
    print(f'[*] Horario de encerramento: {time.strftime("%H:%M:%S")}')
    print(Fore.RESET + '-' * 65)


def listener(responses, ip_network):
    global SIGNAL
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
    s.bind(('', 1))
    print(f'[*] Horario de inicio: {time.strftime("%H:%M:%S")}\n')
    print("[*] Listando")
    print('')
    while SIGNAL:
        packet = s.recv(1024)[:20][-8:-4]
        if packet not in responses and ipaddress.ip_address(packet) in ip_network:
            responses.append(packet)
    print("[*] Fim do listamento\n")
    s.close()

def main():
    responses = []

    ips = arguments.hosts

    wait = arguments.wait
    file_name = arguments.output

    ip_network = ipaddress.ip_network(ips, strict=False)

    t_server = Thread(target=listener, args=[responses, ip_network])
    t_ping = Thread(target=rotate, args=[ip_network, file_name, wait, responses])
    t_server.start()
    t_ping.start()
if __name__ == '__main__':
    main()


Scripts recomendados

Cotação do Dólar com requests_html

Verificador de CNPJ para Zope

hcoin - Preço do Dólar, Bitcoin e Euro em Python

Transforma código de barras

Upload gráfico via ftp em GTK


  

Comentários
[1] Comentário enviado por maurixnovatrento em 28/01/2023 - 21:54h


Muito bacana. Gostei do script.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts