lunes, septiembre 15, 2008

A lo Brutus

En una reciente auditoría me encontré con una web en una intranet mala, mala, mala. De esas que no me dejaba ponerla ninguna injección. Ni por arriba, ni por abajo, ni por LDAP, ni por SQL, ni por XPath, ni la del tetanos.

Sin embargo, el sistema de login tenía un formulario muy gracioso. Cuanod observas el código HTML te daba la longitud de la contraseña máxima de la cuenta.

Contraseña máxima de 10

Lógicamente eso fue al informe como una debilidad del sistema de autentificación porque limitar a 10 es limitar bastante las contraseñas en caso de que alguien accediese a la base de datos y pudiera lanzar un ataque de crackeo [siempre pensando que estén cifradas en la base de datos].

Después, probando un usuario de esos que se escriben golpeando el teclado el mensaje que me dio la aplicación fue de:

Usuario Incorrecto

Así que me dio por probar lo siguiente que probaría cualquiera. Es decir, con un usuario que se sepa que existe, como por ejemplo: Administrador, root, admin, administrator, etc... El mensaje de respuesta fue, con uno de ellos:

Contraseña Inválida

Pues... nada, si tenemos un usuario válido y sabemos que la contraseña es de máximo 10 digitos y no se come ninguna inyección...es una buena idea darle caña con un programa de fuerza bruta. Así que, tirando del baúl de los recuerdos y para no tener que hacer un script con el curl o programárte tú algo, tiré del viejo Brutus32 AET.

Brutus32 AET

Este programita está pensado para hacer fuerza bruta a aplicaciones web protegidas por autenticación básica, por formularios HTML, servidores FTP, POP3, Telnet, SMB e incluso el Netbus. Es del año 2000, pero tiene una utilidad muy chula para configurar los ataques a formularios HTML, ya que se lee el form, carga los campos, los macheas a usuario y password y le das cera.

Cargando campos del formulario

Bruteforcear sistemas de login suele ser lento, pero ante tantas facilidades a veces es recomendable. En este ejemplo en concreto se podían probar 3 contraseñas por segundo desde Internet y 8 (más o menos) por segundo desde la Intranet, es decir, desde la red interna.

Al final, en un día dio con la dichosa password... que era de 6 letritas. No está mal, si la longitud era entre 0 y 10, eligió una de más del 50 %.......

Saludos Malignos!

14 comentarios:

  1. Si yo de vez en cuando lo he usado. Un clásico.

    ResponderEliminar
  2. Ah, se me olvidaba.

    Ha salido la nueva versión de nuestra vieja amiga Nmap, la 4.75, cuya mayor novedad es poder mostrar la topología de la red gráficamente.

    Aunque sé que a muchos os gusta más los entornos meramente alfanúmericos. ;-)

    ResponderEliminar
  3. El otro dia le mostre a mi pseudo-jefe (el que me cae bien) como mi ex- jefe (el que me cae mal) le había hecho una página vulnerable en la que cualquiera con 2 neuronas podía entrar.

    De hecho, pasaban dos cosas:

    1) Mostraba el error en pantalla (y eso que esta hecha en .NET, con lo fácil que es no mostrar un error en .NET...)
    2) El campo contraseña era de infinita longitud

    Entonces utilicé el raiserror del sql, mandandole un parametro definido anteriormente que tomaba el nombre de usuario. En 5 minutos había entrado a la página como administrador

    Jaja, todo gracias a leer tu blog! Estoy pensando que en una de esas en un futuro muy muy lejano voy a poder pasar un nivel de algun retohacking

    Un Saludo (no dos)

    ResponderEliminar
  4. Nota: El atributo size de un input indica el tamaño VISIBLE del campo. No el tamaño máximo de carácteres que admite (maxlength)

    http://www.w3schools.com/TAGS/tag_input.asp

    Pero vamos poca gente suele tener claves choriceras de más de 6-8 carácteres.

    Dicha app tiene dos fallos:
    - El mensaje de error de login no debe decir si es fallo de usuario o de clave.
    - Le falta algún tipo de control de número de claves incorrectas para bloquear temporalmente la cuenta evitando un brute force.

    ResponderEliminar
  5. Estaria bien que uno de estos dias nos hablaras de oscommerce, son miles los negocios que hay basados en esa plataforma y me da a mi que debe de ser vulnerable.

    ResponderEliminar
  6. Olé, muy instructivo. Esta genial, pero me gustaría saber si existe alguno del estilo que no procese solo un formulario (si no que interprete el html de una web y lea una parte especifica) algunos ya deduciréis porque XD

    Por otro lado como bien comenta net el atributo size es distinto del maxlenght pero muchos programadores suelen confundirlos y poner uno por el otro, asi que es bastante indicativo o útil como primera pista.

    ResponderEliminar
  7. Por cierto, no puedo acceder a la configuración de mi router vía http porque he olvidado la contraseña que le puse.

    Nada más que entro en ella sale un recuadro pidiéndome la contraseña, no hay usuario o sea que mas fácil.

    ¿Podría usar el Brutus en este escenario, verdad?

    ResponderEliminar
  8. @Dr. Falken (el malo o el falso)

    En tiempo te saldrá más rentable resetear el router de fábrica por hardware.
    Un saludo.

    ResponderEliminar
  9. Pero es que tengo un mogollón de reglas establecidas que no salve en su momento y muchas de ellas no me acuerdo bien de ellas.

    Por eso lo del reset hardware de momento lo descarto.

    ResponderEliminar
  10. Si bien net tiene razon en que son dos campos distintos, el hecho de que el máximo permitido en el campo del formulario sean 10 caracteres nos indica que ningun usuario va a poder acceder vía este formulario si tiene un password más largo, por lo que se deduce que probando con longitudes de 0 a 10 daremos con el acceso...

    Saludos

    ResponderEliminar
  11. jp, el size indica el ancho visible, puedes escribir todo lo que quieras :X

    ResponderEliminar
  12. Esta es la cosa de un menos mal, que si no, ¿pa qué íbamos a estar nosotros?

    ResponderEliminar
  13. @net: que se pueda bloquear la cuenta de otro usuario por hacer varios intentos de adivinar la password, consiguiendo por tanto una denegación de servicio, también es un error de diseño ;)

    ResponderEliminar
  14. La verdad es que es lamentable (o afortunado, según se mire xD) la cantidad de empresas que ponen passwords triviales a sus logins, usuario SA de las bases de datos, ...

    Si la empresa se llama xxxx, nunca está de más mirar si han puesto passwords como xxxx01 y otros similares. Y también viene bien añadir a nuestras wordlist los nombres de pila de los administradores, por si acaso.

    A veces, bastantes veces, funciona.

    Saludos,

    ResponderEliminar