miércoles, 26 de octubre de 2016

Análisis de Servicios dentro de un Rango de IP visualizados Gráfico Real-Time(II)


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.63
 en 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)
Para verificar que los módulos se encuentran instalados se verificada en la consola:
 si muestra algún error de necesitara instalar pip3.4 install "modulo"

En este caso se usaran hilos para aumentar la velocidad del escaneo, creamos el script con el nombre de search1.py

 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.

lunes, 26 de septiembre de 2016

Análisis de Servicios dentro de un Rango de IP visualizados Gráfico Real-Time(I)

Tener el número de usuarios conectados en Real-Time, desde el punto de vista de un sysAdmin es de vital importancia para determinar acciones a tomar en diferentes ocasiones.
Se requiere:
  • BD: MYSQL  (será recomendable usar NoSQL) 
  • Apache
  • Python3.4 (requerido pip3.4)
  • Nmap-Python (también podra usar MasScan)
****** (complementario)
  • Notepad++ (cualquier editor de txt)
  • Ubuntu Server
  •  Webmin
  • OpenSSH
Windows:

Linux:
  •  Webmin:
    •  sudo nano /etc/apt/sources.list
    • deb http://download.webmin.com/download/repository sarge contrib
      deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib
    • sudo wget http://www.webmin.com/jcameron-key.asc
      sudo apt-key add jcameron-key.asc
    • apt-get update
      apt-get install webmin -y
    • sudo ufw allow 10000
  •  OpenSSH
    •  sudo apt install openssh-server
  •  Python3.4
    • sudo apt-get install build-essential libncursesw5-dev libreadline5-dev libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev
    • sudo add-apt-repository ppa:fkrull/deadsnakes
    • sudo apt-get update; sudo apt-get install python3.4
    • sudo apt-get install python3-pip
  • Nmap-Python
    •  wget http://xael.org/pages/python-nmap-0.6.1.tar.gz
    • sudo tar xvzf python-nmap-0.6.1.tar.gz
    • cd python-nmap-0.6.1
    • python setup.py install
    • Si existe algún error de module verifica el error y si es necesario instala el module faltante(pip3.4 install "nodule faltante)
  • Apache
    • sudo apt-get update
    • sudo apt-get install apache2
  • MySQL
    •  sudo apt-get install mysql-server
  • PHP
    •  sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql
En la siguiente entrada segiremos con el codeo en python.

.......Después de un largo periodo de estar BreakPoint , decidí retomar el blog que paso por muchos cambios desde el 2010.