martes, 11 de noviembre de 2008

Meneame es inseguro y facilmente "meneable"

meneame Cuando se verifica la seguridad de la autenticación en un aplicativo web se han de tener en cuenta distintos puntos de control. Llevar a cabo este tipo de pruebas es algo más que ejecutar una herramienta automática y esperar encontrar vulnerabilidades. Esta entrada tratará de contar el proceso, tanto en la detección de debilidades como en la identificación de fortalezas. Puesto que recientemente hemos aparecido en meneame, y meneame goza de fama y poder para mover miles de usuarios diariamente y con ello el dinero que esto implica. Usaremos este portal como ejemplo.

1.- (OWASP 4.5.1) El primer paso es verificar que la información sensible es transmitida por un canal seguro, es decir, tanto usuario y contraseña SIEMPRE ha de ser transmitido por https, así como la sesión si está integra autenticación. En el caso que nos ocupa, podemos verificar rápidamente que meneame NO tiene implantada esta medida, lo que permitiría el robo de credenciales en redes internas mediante técnicas de escucha.

http://meneame.net/login.php
POST /login.php HTTP/1.1
Host: meneame.net
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: http://meneame.net/login.php?return=%2F
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
username=crap1234&password=12345&processlogin=1&return=%2F

 

2.- La política de contraseñas ha de ser robusta, esto quiere decir que se ha de contemplar el uso de números, minúsculas, mayúsculas e incluso caracteres especiales. Obligar únicamente que la contraseña se componga de un número mínimo de caracteres es peligroso, puesto que permite contraseñas tan triviales como por ejemplo "12345" o "meneame". Se muestra el código de la versión 3 del software de meneame donde se identifica la política utilizada.

if(strlen($_POST["password"]) < 5 ) {

 

3.- (OWASP 4.5.2) La enumeración de usuarios es importante, ya que si se lleva a cabo, se puede generar un diccionario de usuarios, y realizar fuerza bruta inversa, es decir, programar una pequeña utilidad que pruebe todos los usuarios identificados con una contraseña "típica" y como hemos visto en el punto anterior, "12345" o "meneame", son contraseñas que posiblemente existan en el sistema. La enumeración de usuarios en meneame es posible por un error inicial, el nombre de usuario es el mismo que el usado para autenticarse, cuando realmente el nombre de usuario y el usuario de acceso deberían ser distintos, debiendo ser este segundo, por ejemplo, el correo electrónico. El siguiente ejemplo mostraría una lista de los usuarios de meneame y por lo tanto de "logins" validos.

for i in `seq 1 2243`; do curl "http://meneame.net/?page=$i" | perl -ne 'print $1."\n" if /\/user\/(\w+)/'; done | sort | uniq > meneame.users

Usando este pequeño script (que genera 2243 peticiones web) se obtienen usuarios que hayan llegado a portada, lo que significa que probablemente tengan un karma alto.Otra forma usando el "topusers.php" (a tener en cuenta que después del sed hay un \n):

for i in `seq 1 3000`; do curl -s "http://meneame.net/topusers.php?page=$i"| sed -e 's//\
/g' | perl -ne 'print $1."\n" if /\/user\/(.*?)\"/'; done

Además (OWASP 4.5.3), se permite la consulta de usuarios en la url: http://meneame.net/user/'usuario', por lo tanto también se podría llevar a cabo una enumeración de usuarios utilizando un diccionario y realizando peticiones al servidor para comprobar si existe o no.

 

hacker 4.- (OWASP 4.5.4) El portal de meneame tiene un sistema de CAPTCHA, para evitar ataques de fuerza bruta, esto quiere decir que la aplicación detecta que desde una misma dirección IP se prueban usuarios y contraseñas incorrectos y solicita que se introduzca el texto de una imagen para asegurar que no se realiza de forma automática. El uso de este sistema es una fortaleza, al igual que "los contadores", que no son reiniciados cuando se produce una autenticación válida. El problema viene dado con las limitaciones, que son algo generosas. Tras dos accesos erróneos aparece el captcha, pero tras 90 segundos, se permite volver a probar sin necesidad de introducirlo. Aunque apriori este tiempo es alto, el uso de unas decenas de proxys, permitiría probar unos miles de usuarios (conocidos) contra una contraseña en un par de horas. En otro artículo comentaremos como hacer esta búsqueda de forma trivial para comprender el alcance de este problema.

function do_login() {
global $current_user, $globals;
$previous_login_failed = log_get_date('login_failed', $globals['original_user_ip_int'], 0, 90);

Para realizar fuerza bruta de una forma sencilla comprobando usuarios que tengan por contraseña su propio usuario y una longitud superior a 5 caracteres:

for user in `cat meneame.users`; do if [ `echo $user|wc -c` -gt 4 ]; then echo -n $user:;curl -b cook.tmp -c cook.tmp -m 3 -S -L -s -d "username=$user&password=$user&processlogin=1&return=%2F" http://meneame.net/login.php | grep -c "cerrar sesi"; sleep 91; fi; done

A tener en cuenta que no se utilizan proxys, por lo tanto es necesario añadir 91 segundo de espera entre petición y petición para evitar el captcha comentado anteriormente. E incluso con esta demora, en apenas unos minutos han sido identificados más de 5 usuarios válidos. Con 40 o 50 usuarios con buen karma, podríamos poner en portada un artículo de forma fraudulenta.

5.- (OWASP 4.5.5) Otra fortaleza de meneame, es la comprobación de privilegios de usuario. En todas las páginas que he mirado, se comprueba si la sesión es correcta y si ese usuario tiene accesos especiales: "god" o "admin".

6.- (OWASP 4.5.6) El "recordar contraseña" y "contraseña olvidada" en meneame se genera con un md5 partir de una cadena de texto de la que no tenemos suficientes datos como para reproducir. Por ejemplo el uso de la fecha y hora en la que se genera la sesión, o una clave configurada del sistema denominada "site_key".

$now = time();
$key = md5($user->id.$user->pass.$now.$site_key.get_server_name());
key = md5($dbuser->user_email.$site_key.$dbusername.$dbuser->user_id.$cookietime);

 

boy-sad-face-abused-poem 7.- (OWASP 4.5.7) La falta de cifrado en la autenticación y resto de la aplicación facilita que una sesión http sea escuchada y con ello sus sesiones, se recomienda para todos los casos establecer las sesiones con el atributo "Secure", este tema es amplio y dedicaremos un artículo íntegramente a el, se puede ampliar información en: profsandhu.com/journals/ic/ieeeic00.pdf

8.-(OWASP 4.5.8) El servicio de CAPTCHA de la web está externalizado a un tercero: recaptcha, aunque es una opción, todos los mecanismos de seguridad no deberían depender de otras partes, ya que se aumentan las posibilidades de ser comprometidos si se descubren nuevas vulnerabilidades para ese sitio. Para finalizar, las conclusiones son las mismas que siempre: "Un dedo no hace mano, pero sí con sus hermanos", aunque no hay debilidades importantes y el sistema presenta fortalezas destacables, el elevado número de "problemillas" (o vulnerabilidades de criticidad baja-media), podrían provocar un ataque de fuerza bruta exitoso, permitiendo el control temporal sobre las noticias publicadas. Aunque esto parezca algo tonto, el poder redirigir unas 7.000-9.000 peticiones únicas a una página puede estar bien pagado o puede ser utilizado para un fraude de "clicks".
Las recomendaciones son simples:

  1. Los usuarios deben de utilizar contraseñas fuertes para evitar que su cuenta sea robada
  2. El sitio web debería implantar una política de contraseñas fuerte. Obligando el uso de números y mayúsculas, así como comprobar que no se puede introducir una contraseña igual al usuario.
  3. También debería ampliarse el tiempo de "bloqueo", de 90 segundos a un número mayor y molesto, como 15 minutos
  4. Meneame debería implantar un servidor http seguro por el que transmitir credenciales y sesiones.
  5. El sistema debería contemplar que el usuario introducido para registrarse en la aplicación tiene que ser distinto al nombre de usuario (apodo) que aparece interactuando con las noticias, evitando numeración de "logins" válidos.

Espero que este ladrillo haya sido constructivo.

El presente artículo NO ha sido modificado en su contenido pero si se le han agregado enlaces para complementar la información. Eventualmente también se han agregado imágenes o modificado las existentes, y en algunos casos variado la diagramación así como prescindir de algunas o todas las imagenes originales (no siempre). También puede haberse resaltado algunos segmentos que considero importantes o interesantes a criterio personal. Para ver el artículo original por favor hacer uso del apartado Fuentes que se incluye al final de este post.

____________________________
Artículo Fuente : Meneame: insecure by default
Autor / Publicado por : Alejandro Ramos
Web Site / Blog : Security by Default

2 comentarios:

  1. Vale, aceptamos menéame como un sitio inseguro por defecto. Un atacante malicioso podría llegar a conseguir:
    ¡publicar un enlace a otra página!

    XD

    Es pasarse. Que no hablamos de un banco, por ejemplo.

    Un saludo. Antonio.

    ResponderEliminar
  2. Pues si, quién lo hubiera pensado, ¿verdad?

    Un saludo desde Lima, Perú

    ResponderEliminar

AVISO:
Muchas gracias por considerar dejar un comentario. Te pido por favor que tengas en cuenta las siguientes pautas:
1. Evita usar lenguaje prosaico u ofensivo, y mantener siempre el respeto por todos.
2. Respeta las opiniones de los demás y no cometas el error de atacarlos de manera insultante o prosaica.
3. Si no estas de acuerdo con el tema publicado, ambos sabemos que hay forma de realizar una crítica sin ofender ni agredir.
4. También queda prohibida los enlaces de promoción o publicidad descarada.
5. Finalmente te pido que no utilices abreviaturas en tus respuestas para poder mantener una armonía en la lectura de los mensajes y una mejor comprensión de la lectura.

Y como muestra de mi gratitud por tu visita y comentario, si tienes sitio web o blog y has ingresado ese dato u OpenID, agregaré tu web o blog en mi sección Blogs de amistades y/o que me gusta visitar seguido.

En caso contrario tu comentario podría ser eliminado. Aprecio mucho que consideres esta petición de mi parte. Muchas gracias por tu comprensión.

Nota: sólo los miembros de este blog pueden publicar comentarios.

Una marmota en el barrio de Lima

Historias de una cocina

El cine que compartí

El Alquimista del Diseño Web