viernes, 13 de enero de 2017

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

Charter II: BANNER GRABBING
Después de tantas semanas de vacaciones el segundo capítulo estaremos en búsqueda de banner, es la forma recopilar información con estos datos se podría listar los exploits aplicables y conocer el sistema o infraestructura que se encuentra detrás siendo parte del la Fase de Enumeración o Reconocimiento link  (Footprinting), al momento de la obtención de información podemos llegar incluso a conocer la versión del servicio no siempre sera obtenida debido a que se podría estar filtrada.

La obtención del banner se podría realizar con diferentes herramientas, incluso con telnet
Algo un poco mas explicativo.

Volviendo al script en este caso usamos la ayuda de Nmap pero con hilos y consultando a la db, para iniciar y nos salte el error de modulo, instalaremos nmap para python.

pip install python-nmap


#!/usr/bin/python3.4
import socket, urllib, sys, time, json, nmap, os, optparse, MySQLdb, socket, sys
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
numfile = str(1)
THREADS = 10
repet = 300
t1 = datetime.now()

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

print(bcolors.HEADER+"exe:"+numfile+" -"*80+ bcolors.ENDC)
print(bcolors.HEADER+"exe:"+numfile+" --------------INICIANDO SCRIPT BANNER-----------------------------"+ bcolors.ENDC)
print(bcolors.HEADER+"exe:"+numfile+" -"*80+ bcolors.ENDC)
t1 = datetime.now()
print(bcolors.HEADER+"exe:"+numfile+" TIEMPO INICIO:" +time.strftime('%Y/%m/%d %H:%M:%S')+ bcolors.ENDC)

def update_db(ip_address,port,servicio,version,nreg,sms):
    try:

        connx = MySQLdb.connect(host= "localhost",
                    user="root",
                    passwd="",
                    db="BDDATA")
        
        cursor2 = connx.cursor()
        cursor2.execute("""UPDATE python SET servicio=%s, producto=%s WHERE nreg=%s """,(servicio,version,nreg))
        connx.commit()
        connx.close()
        print("exe:"+numfile+" [UPDATE] " +time.strftime('%Y/%m/%d %H:%M:%S')  +sms+str(ip_address)+":"+str(port)+bcolors.ENDC)
              
    except ValueError:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR UPDATE_DB")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR BANNER " + str(ip)+":"+str(puerto))
    except:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO UPDATE_DB: ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def UPDATE_DB(): "+ str(ip)+":"+str(puerto))    
def ban_general(ip,puerto,nreg):
    try:
        with ThreadPoolExecutor(max_workers = THREADS) as executor:
            executor.submit(banner_nmap,ip,puerto,nreg)
    except ValueError:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR BANNER")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR BANNER " + str(ip)+":"+str(puerto))
    except:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO BANNER: ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def BANNER(): "+ str(ip)+":"+str(puerto))
        
def banner_nmap(ip_address,port,nreg):
    try:
        #print("exe:"+numfile+" [INFO]   " +time.strftime('%Y/%m/%d %H:%M:%S')+" HOST "+ str(ip_address) + ":" + str(port))
        nm = nmap.PortScanner()
        nm.scan(hosts=str(ip_address), arguments='-sS -sV -p '+str(port)+' -n -Pn --script banner --max-retries 0')
        name = [(x, nm[x]['tcp'][int(port)]['name']) for x in nm.all_hosts()]
        version = [(x, nm[x]['tcp'][int(port)]['version']) for x in nm.all_hosts()]
        producto = [(x, nm[x]['tcp'][int(port)]['product']) for x in nm.all_hosts()]
        for host, status in (name):
            nam=('{1}'.format(host, status))
        for host, status in producto:
            pro=('{1}'.format(host, status))
        for host, status in version:
            ver=('{1}'.format(host, status))
        tipoServicio = nam
        namServicoVer = pro + " " + ver
        

        if tipoServicio.replace(' ', '')=="":
            
            update_db(ip_address,port,'unknown',namServicoVer,nreg,bcolors.OKBLUE+' [DB] SE INSERTADO CON EXITO UNKNOWN    : ')
            
        else:
            
            if namServicoVer.replace(' ', '')== "":
                
                update_db(ip_address,port,'',namServicoVer,nreg       ,bcolors.OKBLUE+' [DB] SE INSERTADO CON EXITO PRODUC NULL: ')
            else:
                
                update_db(ip_address,port,tipoServicio,namServicoVer,nreg,bcolors.OKGREEN+' [DB] SE INSERTADO CON EXITO SERV-PROD  : ')

    except ValueError:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR BANNER")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR BANNER " + str(ip_address)+":"+str(port))
    except:
        print("exe:"+numfile+" [ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO BANNER: ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def BANNER(): "+ str(ip_address)+":"+str(port))
        
def escritura(texto):
    try:
        outfile = open('banner.txt', 'a') # Indicamos el valor 'w'.
        outfile.write(str(texto))
        outfile.close()
        
    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 main():
    try:
        global repet
        for i in range(repet):
            print("exe:"+numfile+" "+time.strftime('%Y/%m/%d %H:%M:%S')+" BANNER() --->> INICIO LA REPETICIÓN: "+ str(i)+" DE "+str(repet))
            conn = MySQLdb.connect(host= "localhost",
                    user="root",
                    passwd="",
                    db="BDDATA")
            cursor1 = conn.cursor()
            cursor1.execute('SELECT STATUS, id, PORT, nreg  FROM python WHERE servicio = "" AND status=1  ORDER BY nreg DESC LIMIT 30 OFFSET '+numfile+'00')
            result = cursor1.fetchall()
            for row in result:
                if row[0] == 1:
                    ip = row[1]
                    port = row[2]
                    nreg = row[3]                
                    banner_nmap(ip,port,nreg)
            conn.close()
        t2 = datetime.now()
        total =  t2 - t1
        print("exe:"+numfile+" -------------------------------------------------------")
        print("exe:"+numfile+"TIEMPO FINALIZADO: "+time.strftime('%Y/%m/%d %H:%M:%S'))
        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(): ")   
    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(): ")  
        
if __name__ == "__main__":
    main()
Continuará.......!!

No hay comentarios. :

Publicar un comentario