sábado, 14 de enero de 2017

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

Charter III: LOCALIZANDO AL ISP

Continuando con la saga trabajaremos para localizar IPS: ciudad, país, coordenadas, región y sobre todo el ISP. Para ello necesitaremos manejar json para ello usaremos esta web link para mejorar la perspectiva que se tiene de dicho archivo:


{"as":"AS6147 Telefonica del Peru S.A.A.","city":"Lima","country":"Peru","countryCode":"PE","isp":"Telefonica del Peru","lat":-12.05,"lon":-77.05,"org":"Telefonica del Peru","query":"190.40.128.190","region":"LMA","regionName":"Provincia de Lima","status":"success","timezone":"America/Lima","zip":""}

Esta información será útil recogeremos los siguiente:
print (IP, Country, City, regionName, IPS,Latitud, Longitud)

El resultado sera el siguiente, no olvidaras el archivo logGeo.txt para almacenar errores:

#!/usr/bin/python3.4
from bs4 import BeautifulSoup
import socket, urllib, sys, os, time, json, nmap, os, optparse, MySQLdb, socket, sys
from json import loads
from urllib.request import urlopen
import urllib.request
#Importamos MYSQL
import http.client
from datetime import datetime

from concurrent.futures import ThreadPoolExecutor
from datetime import datetime


THREADS = 512
CONNECTION_TIMEOUT = 1
t1 = datetime.now()
repet = 50000
dormir=int(2)
myhost="localhost"
usuario="root"
password=""
database="dbdata"

     
print("-"*80)
print("---------GEOLICALIZANDO LA DIRECCIONES IP------------------")
print("-"*80)
t1 = datetime.now()
print("TIEMPO INICIO:" +time.strftime('%Y/%m/%d %H:%M:%S'))


def escritura(texto):
    try:
        outfile = open('logGeo.txt', 'a') 
        outfile.write(str(texto))
        outfile.close()
        print ("[DETEC] "+time.strftime('%Y/%m/%d %H:%M:%S')    +" [!] REGISTRADO EN EL LOG INSERT_LOG: ")
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR  ERROR AL MOMENTO DE SER EVALUADO def ESCRITURA()")
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR ESCRITURA: ", sys.exc_info()[0])

def geoIp(IP):
    try:
        return urlopen("http://ip-api.com/json/" + str(IP)).read().decode('utf-8')
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO CONSULTAR IP")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR geoIp " + str(IP)) 
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR INSERT_GEOIP: ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def geoIp(): " + str(IP))
        
def insert_datos_new(IP):
    try:
        ip_cut =IP.split('.')
        data_geoIP = geoIp(IP)
        data_geoIP = json.loads(data_geoIP)
        Country = data_geoIP["country"]
        City = data_geoIP["city"]
        regionName = data_geoIP["regionName"]
        countryCode = data_geoIP["countryCode"]
        ISP = data_geoIP["isp"]
        Latitud = data_geoIP["lat"]
        Longitud = data_geoIP["lon"]
        conn = MySQLdb.connect(host= myhost,
                    user=usuario,
                    passwd=password,
                    db=database)
        cursor1 = conn.cursor()
        cursor1.execute("""UPDATE python SET Country=%s ,City=%s, regionName=%s, ISP=%s, Latitud=%s, Longitud=%s WHERE Country='' AND id=%s""",[Country, City, regionName,ISP,Latitud,Longitud,IP])
        conn.commit()
        conn.close()
        print ("[INFO]   "+time.strftime('%Y/%m/%d %H:%M:%S')   +" [RANGO IP:] " +'\x1b[6;30;44m'+ str((ip_cut[0]+"."+ip_cut[1]+"."+ip_cut[2]+"."+'%')) +" - INSERT GEO NEW"+'\x1b[0m')
        
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EVALUADO def insert_datos_new")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR insert_datos_new"+ str(IP))
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR insert_datos_new: ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def insert_datos_new(IP):"+ str(IP))    

        
def insertar_datos_find(Country, City, regionName,ISP,Latitud,Longitud,IP):
    try:
        ip_cut =IP.split('.')
        conn = MySQLdb.connect(host= myhost,
                    user=usuario,
                    passwd=password,
                    db=database)
        cursor1 = conn.cursor()
        cursor1.execute("""UPDATE python SET Country=%s ,City=%s, regionName=%s, ISP=%s, Latitud=%s, Longitud=%s WHERE Country='' AND id LIKE %s """,[Country, City, regionName,ISP,Latitud,Longitud,(ip_cut[0]+"."+ip_cut[1]+"."+ip_cut[2]+"."+'%')])
        conn.commit()
        conn.close()
        print ("[INFO]   "+time.strftime('%Y/%m/%d %H:%M:%S')   +" [RANGO IP:] " +'\x1b[6;30;43m'+ str((ip_cut[0]+"."+ip_cut[1]+"."+ip_cut[2]+"."+'%')) +" - UPDATE GEO OLD"+'\x1b[0m')     
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EVALUADO def insertar_datos_find")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR def insertar_datos_find"+ str(IP))
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR def insertar_datos_find ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def insertar_datos_find(ip_address,port)"+ str(IP)) 
   

def buscar_geop_insert(IP):
    try:
        ip_cut =IP.split('.')
        
        conn = MySQLdb.connect(host= myhost,
                    user=usuario,
                    passwd=password,
                    db=database)
        cursor1 = conn.cursor()
        cursor1.execute("""SELECT Country, City, regionName,ISP,Latitud,Longitud FROM python WHERE id LIKE %s AND Country!=''""",[ip_cut[0]+"."+ip_cut[1]+"."+ip_cut[2]+"."+'%'])
        result = cursor1.fetchone()
        if result is not None:
            
            insertar_datos_find(result[0],result[1],result[2],result[3],result[4],result[5],IP)
        else:
           
            insert_datos_new(str(IP))
        conn.commit()
        conn.close()
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EVALUADO def buscar_geop_insert")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR def buscar_geop_insert"+ str(IP))
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR def buscar_geop_insert ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def buscar_geop_insert(ip_address,port)"+ str(IP))  
    #result = cur.fetchone()
    
def main():
    try:
        for i in range(repet):
            
            print("ESTA ES LA REPETICION N: "+ str(i) +" de "+str(repet))
            conn = MySQLdb.connect(host= myhost,
                    user=usuario,
                    passwd=password,
                    db=database)
            cursor1 = conn.cursor()
            cursor1.execute("""SELECT nreg,id FROM python WHERE Country="" GROUP BY(id) ORDER BY nreg ASC LIMIT 1""")
            result = cursor1.fetchall()
            for row in result:
                
                buscar_geop_insert(row[1])
            
            conn.close()
            time.sleep(dormir)
        t2 = datetime.now()
        total =  t2 - t1
        print("-------------------------------------------------------")
        print("TIEMPO FINALIZADO: "+time.strftime('%Y/%m/%d %H:%M:%S'))
        print("TIEMPO TOTAL:" + str(total))
    except ValueError:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EVALUADO def MAIN_STATUS")
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR EVALUAR def MAIN_STATUS")
    except:
        print ("[ERROR]  " +time.strftime('%Y/%m/%d %H:%M:%S')  +" [!] ERROR def MAIN_STATUS ", sys.exc_info()[0])
        escritura(time.strftime('\n%Y/%m/%d %H:%M:%S')  +" [!] ERROR AL MOMENTO DE SER EJECUTADO [--->] def MAIN_STATUS(ip_address,port)")  
 
if __name__ == "__main__":
    main()
Continuará......

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á.......!!