Charter I: HOST UP/DOWN
En este entrada se codeara el script, para verificar el estado de la IP sea UP/DOWN de la mano de los Thread,
Crear un CSV con el rango de ip, para ello esta web aloja rango de IP:
countryipblocks.net
El csv debe de ser del siguiente formato:
IP1,IP2 104.223.201.0,104.223.201.63en este caso la ip recorrerá desde:
104.223.201.0 - 104.223.201.63 = en este caso recorrerá 63 direcciones IP
104.223.0.0 - 104.223.255.255 = en este caso recorrerá 65025 direcciones IP
Si deseas recorrer mas direcciones IP se deberá editar el codigo agregando un segundo bucle.
Crear un archivo txt: log.txt
Crear la Base de Datos :
CREATE TABLE `domain` ( `idDomain` int(11) NOT NULL AUTO_INCREMENT, `nreg` int(11) DEFAULT NULL, `domain` varchar(300) DEFAULT NULL, `date_Insert` datetime DEFAULT NULL, PRIMARY KEY (`idDomain`), KEY `nreg` (`nreg`), CONSTRAINT `domain_ibfk_1` FOREIGN KEY (`nreg`) REFERENCES `python` (`nreg`) ) ;--------------------------------------------------------------------------
Ahora el script en python.
Para ello se necesitara importar los siguientes módulos:
- BeautifulSoup (from bs4 import BeautifulSoup)
- import urllib, sys, os, time, json, nmap, os, optparse, MySQLdb, socket, sys, csv, operator,time,datetime
- ThreadPoolExecutor (from concurrent.futures import ThreadPoolExecutor)
si muestra algún error de necesitara instalar pip3.4 install "modulo"
import socket, urllib, sys, os, time, json, nmap, os, optparse, MySQLdb, socket, sys from urllib.request import urlopen import csv, operator from datetime import datetime from concurrent.futures import ThreadPoolExecutor from datetime import datetime #Numero de Archivo numfile = str(1) #el numero de archivo(en caso de ejecutar mas de uno en una sola ventana) #Lista de Puertos portList = [21,22,23,25,80,110,143,161,443,993,995,1433,27017,3306,3389,5000,8080,10000,17518] totalPuertos = len(portList) #Numero de Hilos THREADS = 512 #Timpo de Conexion CONNECTION_TIMEOUT = 1 #Fecha de INICIO t1 = datetime.now() #Numero de Repeticiones que se realizara al csv. repet = 50 print ("exe:"+numfile+" -------------------------------------------------------") print ("exe:"+numfile+" -----------INICIANDO SEARCH HOST-----------------------") print ("exe:"+numfile+" -------------------------------------------------------") #INSERTAR IP SI SE ENCUENTRA UP def insert_db(IP, Port): try: date_Insert = time.strftime('%Y-%m-%d %H:%M:%S') #Fecha-Hora conn = MySQLdb.connect(host= "localhost", user="root", passwd="toor", db="myDB") x = conn.cursor() x.execute("""INSERT INTO python VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",(0,IP,Port,'','','','','','','','',date_Insert,date_Insert,'1','1')) #1 es considerado cuando esta activo y 0 inactivo conn.commit() conn.close() print ("exe:"+numfile+" [INSERT] " +time.strftime('%Y/%m/%d %H:%M:%S')+" [DB] SE INSERTADO CON EXITO") #mensaje de se inserto con exito except ValueError: conn.close() #en caso de error se cierra la conexion print ("exe:"+numfile+" [ERROR] " + time.strftime('%Y/%m/%d %H:%M:%S')+" [!] ERROR AL MOMENTO DE SER INSERTAR DB") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') + " [!] ERROR EVALUAR insert_db " + str(IP)+ ":" + str(Port))#se inserta en un log except: conn.close() print ("exe:"+numfile+" [ERROR] "+ time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR INSERT_DB: ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') + " [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def main(): " + str(IP)+ ":" + str(Port)) #se inserta en un log #Buscaremos la IP se encuentra en la base de datos antes de insertar, si se halla en la base de datos se actualizada con el status 1 en caso no se encuentre se insertara (nos permitirá no duplicar direcciones ip) def verificar_ip(host,port): try: conn = MySQLdb.connect(host= "localhost", user="root", passwd="toor#", db="myDB") cursor1 = conn.cursor() cursor1.execute("""SELECT id,status FROM python WHERE id = %s AND port = %s""",[host,port]) result = cursor1.fetchone() if result is not None:#verificar si la IP y Puero existen en la base de datos if result[1] == 0:#si el status es 0 se actualizara pues se deduce que el host esta caido y como fue hallado se cambiara por 1 timer_up = time.strftime('%Y-%m-%d %H:%M:%S') cursor3 = conn.cursor() cursor3.execute("""UPDATE python SET status=1 ,date_Update=%s WHERE id=%s AND port=%s """,[timer_up,host,port]) conn.commit() conn.close() print ("exe:"+numfile+" [UPDT] " +time.strftime('%Y/%m/%d %H:%M:%S')+" HOST HALLADO: " + host + ":"+ str(port)+" .......!!!")#host actualizado else: print ("exe:"+numfile+" [FIND] " +time.strftime('%Y/%m/%d %H:%M:%S')+" HOST HALLADO: " + host + ":"+ str(port)+" .......!!!")#si ese host ya fue hallado y su status es igual a 1, no hay necesidad de actualizar else:#si no existe se enviara al def insert_db insert_db(host,port) conn.close() except ValueError: conn.close() print ("exe:"+numfile+" [ERROR] " + time.strftime('%Y/%m/%d %H:%M:%S')+" [!] ERROR AL MOMENTO DE SER VERIFICAR_IP") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') + " [!] ERROR EVALUAR insert_db " + str(host)+ ":" + str(port))#insertara en el log el error except: conn.close() print ("exe:"+numfile+" [ERROR] "+ time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR VERIFICAR_IP: ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') + " [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def VERIFICAR_IP(): " + str(host)+ ":" + str(port))#insertara en el log el error #Verificar que el host este UP/DOWN en caso este UP enviara True y contrario False def ping(host, port, results = None): try: socket.socket().connect((host, port)) if results is not None: results.append(port) verificar_ip(host,port) #print ("exe:"+numfile+" [INFO]" +time.strftime('%Y/%m/%d %H:%M:%S')+" "+str(port) + " Open") return True except: return False #Escanear host def scan_ports(host): try: global portList, totalPuertos, ip_address available_ports = [] socket.setdefaulttimeout(CONNECTION_TIMEOUT) #Tiempo de Espera with ThreadPoolExecutor(max_workers = THREADS) as executor: #Numero de hilos print ("exe:"+numfile+" [INFO] " +time.strftime('%Y/%m/%d %H:%M:%S')+" Escaneando PUERTO en " + host + " .......!!!") for port in portList:#recorrer la lista de puertos executor.submit(ping, host, port, available_ports) #enviar al def ping para verificar UP/DOWN except ValueError: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR EVALUAR SCAN_PORT") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR EVALUAR SCAN_PORT " + str(host)) #ERROR escrito en el log except: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def SCAN_PORT(): "+ str(host)) #ERROR escrito en el log #Funcion que nos facilitara insertar los errores en el log def escritura(texto): try: outfile = open('log.txt', 'a') # Indicamos a valor que 'a' para no reemplazar el texto ya escrito outfile.write(str(texto)) #escribimos outfile.close()#cerramos print ("exe:"+numfile+" [DETEC] "+time.strftime('%Y/%m/%d %H:%M:%S') +" [!] REGISTRADO EN EL LOG INSERT_LOG: ") except ValueError: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR ERROR AL MOMENTO DE SER EVALUADO def ESCRITURA()") except: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR ESCRITURA: ", sys.exc_info()[0]) def ori_ayuda(path_csv): try: with open(path_csv) as csvarchivo: entrada = csv.DictReader(csvarchivo) for reg in entrada: listarIP(reg['IP1'],reg['IP2']) except ValueError: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR ERROR AL MOMENTO DE SER EVALUADO def ori_ayuda()") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] ori_ayuda(): ") except: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR ori_ayuda: ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] ori_ayuda: ") def listarIP(IP1,IP2): #lector de csv try: datosIP1 = IP1.split('.') #se separa en una lista cada octeto de IP datosIP2 = IP2.split('.') #se separa en una lista cada octeto de IP for x1 in range(int(datosIP1[2]),(int(datosIP2[2])+1)): #EL rango de IP que se recorreran con el for 192.168.0.1-192.168.255.255 en este caso se necesitara solo del 3er octeto range (o,255) for x2 in range(int(datosIP1[3]),(int(datosIP2[3])+1)): #EL rango de IP que se recorreran con el for 192.168.1.0-192.168.1.255 en este caso se necesitara solo del 4er octeto range (o,255) scan_ports(datosIP1[0]+"."+datosIP1[1]+"."+str(x1)+"."+str(x2)) #se enviara a escaner la IP para verificar UP/DOWN except ValueError: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR ERROR AL MOMENTO DE SER EVALUADO def listarIP()") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] listarIP(): "+str(IP1)+"-"+str(IP2)) #error escritura en el LOG except: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR listarIP: ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] listarIP: "+str(IP1)+"-"+str(IP2)) #error escritura en el LOG def main(): try: global portList, totalPuertos, ip_address, repet for i in range(repet): #Cuantas veces se realiza la repeticion ori_ayuda('lista'+numfile+'.csv') #nombre del csv t2 = datetime.now() #dato de finalizado de for total = t2 - t1 #tiempo total print ("exe:"+numfile+" -------------------------------------------------------") print ("exe:"+numfile+" TIEMPO INICIO: "+str(t1)) print ("exe:"+numfile+" TIEMPO FINALIZADO: "+str(t2)) print ("exe:"+numfile+" TIEMPO TOTAL:" + str(total)) except ValueError: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EVALUADO MAIN()") escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] MAIN(): "+ str(ip_address) + ":" + str(port)) #error escritura en el LOG except: print ("exe:"+numfile+" [ERROR] " +time.strftime('%Y/%m/%d %H:%M:%S') +" [!] ERROR MAIN() ", sys.exc_info()[0]) escritura(time.strftime('\n%Y/%m/%d %H:%M:%S') +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] MAIN(): "+ str(ip_address) + ":" + str(port)) #error escritura en el LOG if __name__ == "__main__": main()
Para ejecutar el script es simplemente:
Python3.4 search1.py
Si los archivos que creaste fueron en la sesion del root deberas ingresar con sudo su. Para no tener inconvenientes al insertar el error en el log.
No hay comentarios. :
Publicar un comentario