Cómo ser un malvado ‘hacker’ roba contraseñas (1)

2
24373
Matrix
Me da que esto es lo que la mayoría imagina cuando digo la palabra ‘hacker’.

[Advertencia: Todo lo que hay en el presente texto tiene el objetivo de crear más conciencia sobre este tema, para que cada uno/a tome sus propias medidas de seguridad; de ninguna manera el objetivo es hacer mal a la gente o crear el caos, sino hacer más público el problema de las contraseñas. Ya que dando consejos sobre claves buenas queda uno muy bien, pero si no se da un porqué está visto que nadie hace caso. Y sí, yo también prefiero el termino cracker para esto, pero como la gente lo conoce como hacker, pues usaré ‘hacker’. Personalmente no soy hacker, ni cracker, ni lamer,… porque ni tengo tiempo para ello, ni pasión para ese arte, pero procuro mantenerme informado para hacer programas seguros.]

Hoy vamos a aprender a ser malos. Eso sí, para no extenderme demasiado, dejaré el sniffing y el snooping para otra ocasión, y por ello nuestros famosos ‘amigos’ troyanos y spyware no aparecerán en este texto, como tampoco lo hará el Wireshark. De ahí que ésta sea una primera entrega.

Las formas en las que como un ‘hacker’ puedes atacar, para robar una contraseña, las podemos dividir en dos tipos principales simples, según el tipo de web: web no segura, web segura. De entre los ataques a web no seguras para obtener contraseñas, el que más se usa es la Inyección SQL. También hay otra forma en el caso de webs no seguras, pero se deja para la siguiente entrega. En ésta sólo me centraré en atacar la clave, engañar al usuario o sacarla directamente del servidor. Insisto, no verás nada de ataques a comunicaciones, ni software espía, ni conexiones remotas en esta entrega, eso para la siguiente.

¿Pero qué es SQL? SQL es un lenguaje de programación de bases de datos, es decir sirve para manejar tablas y relaciones entre tablas. Lo normal en una web es que todos los datos de los usuarios estén clasificados en tablas. Los nombres de las tablas los pone el programador. Voy a usar para toda la parte de Inyección SQL un ejemplo muy simple con una única tabla. El ejemplo es el siguiente: supongamos que tengo una web de compras, y una tabla SQL que guarda la siguiente información de los usuarios, con contraseñas que parecen gritar ‘¡Robame!’:

email nombre completo contraseña número de tarjeta de crédito edad
Pepito58@gmail.com Pepe José Rojas Martinez Contraseña 6842234986452468 54
Josefa73@gmail.com Josefa Cruz Romero 123456 9632884976422753 39

 

Puede parecer algo arcaica y poco segura si guarda el número de tarjeta de crédito, pero ojo que esto lo hace también iTunes al comprar, cierto que desde un programa (y no una web) que parece seguro, pero lo mismo parecía con Stream y no veas lo que pasó hace poco más de un año. Pero bueno para nosotros, los malos de los medios de información, nos viene fenomenal.

En la tabla he colocado sólo dos filas porque sólo necesito una, poner una segunda fila quedaba bien, y una tercera ya era excesivo para mí, pero en la vida real habría miles de filas. No me negaréis que las contraseñas no son de lo más reales. A esta tabla la llamaré ‘Usuarios’. Para entrar/loguearse en la web se necesitan los campos email y contraseña (lo que suele ser lo más común).

Dicho esto ¿cómo puedo conseguir mediante SQL el campo ‘contraseña’ junto con su campo ‘email’ de todos los usuarios de la tabla ‘Usuarios’? Con la simple sentencia select de SQL.

SELECT email, contraseña FROM Usuarios;

No necesito más. Esto me devolverá una tabla que tendrá sólo las columnas ‘email’ y ‘contraseña’. ¿A qué es sencillo? Si quiero la tabla completa, es más fácil:

SELECT * FROM Usuarios;

Aprovecho para decir que cuando entras con tu email y contraseña en una web, se ejecuta una sentencia SQL para extraer la contraseña de la tabla, usando tu email. En el ejemplo, en el caso que Pepe entre en la web, la web leerá ‘Pepito58@gmail.com’ del campo ‘Introduce tu email’ y se ejecutaría, por tanto:

SELECT contraseña FROM Usuarios WHERE email=’Pepito58@gmail.com’;

Esto devolverá sólo la contraseña de dicho usuario, la cual la web comparará con la contraseña que ha escrito Pepe, y si son iguales le dejará entrar. Fácil, ¿no? Pues comencemos:

  • Se dice que una web no segura permite Inyección SQL, cuando puedes escribir código SQL dentro del campo usuario y/o contraseña. Si es así y si logramos encontrar el nombre de la tabla de usuarios (en nuestro caso ‘Usuarios’), en el ejemplo podremos introducir en el campo ‘Introduce tu email’ lo siguiente:
    ‘;SELECT * FROM Usuarios;
    Incluso podemos poner la sentencia para averiguar el email de Pepe (la sentencia select de la palabra where que puse pero siempre con la comilla y el punto y coma delante de la palabra ‘SELECT’), o, si además de malvados nos gusta que nos dediquen un espacio en las noticias (“han hackeado la web tal”), podemos también borrar la tabla con una sentencia SQL de borrado (‘;DROP TABLE Usuarios), aunque tengan resguardos de las tablas notarán que alguien ha entrado porque las tablas no se borran así por las buenas. El único problema es averiguar el nombre de la tabla, aunque no suele ser tan difícil.
    Lo mejor para nosotros, los tipos malos, sería que, en los casos de Inyección SQL, tanto las contraseñas como los números de tarjeta de crédito no estén cifradas en las tablas, tal y como en el ejemplo. En dicho caso tendremos más datos. ¿Imagina que además esté el número de PIN de la tarjeta de crédito guardado en la tabla o el número de cuenta bancaria, y sin cifrar? Te forras.
    Esto de la Inyección SQL y los datos sin cifrar fue el problemón que le pasó al Playstation Network de Sony en el 2011. También le pasó a Yahoo, el 12 de julio de este año, y se hicieron públicas 453.000 claves de Yahoo.
    En caso de que estén cifrados todos los datos, tendremos que actuar como si la web no permitiese Inyección SQL. Porque es probable que jamás seamos capaces de descifrar esa contraseña cifrada, y más si ha sido cifrada con los métodos actuales. Más sobre el cifrado, en la siguiente entrega.
  • Cuando la web sea una web segura y no sea posible de realizar el ataque por Inyección SQL, algo, en principio, normal si la web y el sistema, que hay debajo de la misma, está bien hecho. Tenemos varias opciones, a cual más o menos efectiva, pero todas dependerán de lo difícil que sea la contraseña o de lo crédulo que sea la persona que tiene esa contraseña:
    • Ataque a fuerza bruta: Se trata de probar todas las posibles contraseñas una a una. Seguramente pensarás en usar letras y números, y en dicho caso vas bien encaminado, aunque deberías de añadir el punto y la barra ‘/’, por si acaso. ¿Cuántas combinaciones habrá que probar? Bueno, teniendo en cuenta sólo esos símbolos, para una contraseña de un sólo carácter tendríamos 27 letras minúsculas + 10 números + 1 punto + 1 barra = 39 caracteres. Así, si la contraseña son dos caracteres, 39×39 = 1.521 combinaciones, si es de tres cifras 39x39x39 = 59.319 combinaciones,… siendo ‘n’ el número de caracteres nos daría que tendrías que probar 39 elevado a ‘n’ combinaciones, algo difícil para un humano. Por ello las personas que realizan este tipo de ataques suelen usar un programa que lo hace por su cuenta, de este tipo de programas hay montones por Internet, además que son fáciles de hacer incluso para alguien que sepa muy poco de programación. Además, para mayor rapidez, podemos usar varios ordenadores y que cada uno compruebe unas contraseñas diferentes (por ejemplo, si tenemos 2 ordenadores, que uno compruebe las contraseñas con las teclas pares y el otro con las impares). Lo malo es que, aún así, puede tardar demasiado en averiguar una contraseña de 6 caracteres (3.518.743.761 combinaciones, un poco más de tres mil millones y medio de combinaciones). Así una contraseña de 12 caracteres (4,738381338×10¹⁸ combinaciones) es la más segura. Y, como podrás imaginar, si la clave combina también letras en mayúsculas y otros símbolos, ya ni os cuento. Éste método es bueno pero demasiado inútil por lento.
    • Ataque a fuerza bruta con diccionario de claves: El anterior método era bueno, pero tenía un fallo muy gordo para nosotros, así que lo mejoramos. Esto sería lo mismo que antes, pero en vez de probar las letras, número y símbolos uno por uno, probamos palabras de un idioma y las combinaciones de éstas. Para ello necesitamos un diccionario, es decir una colección de palabras, que pueden ser desde palabras de un idioma, nombres de deportistas/actores/escritores/músicos/famosos, nombres de marcas,… Es un ataque más común que el de fuerza bruta simple, ya que hay montones de diccionarios de claves por Internet y programas que los usen, incluso puedes crearte un diccionario a tu medida con las distintas aficiones de la persona a la que atacar. Las formas de contrarrestarlo son usando en la contraseña palabras que no existen, o añadiendo diversos símbolos en alguna parte de cada palabra. Pero como la mayoría de personas no hacen eso, tú tranquilo este método suele funcionar muy bien.
    • Ataque por ‘fórmula matemática’[1]: Éste se suele usar para descifrar contraseñas automáticas, como las que te dan las páginas cuando olvidas tu contraseña o, más común, las que tienen las redes WiFi. Se trata de buscar la ‘fórmula matemática’ que genera automáticamente las contraseñas, a partir de unos datos dados (que pueden tener que ver con los datos de la cuenta de tu contraseña olvidada), y una vez que la tengas hacer un programa que use dicha fórmula para averiguar contraseñas. Una vez que tenemos dicho programa, podemos averiguar cualquier contraseña en muy poco tiempo[2].
    • Phishing: Otro ataque común y bastante efectivo pero para este tipo de ataque es necesario saber algo de programación web. Se suele usar en páginas bancarias, aunque hotmail lo sufrió en el 2009. Se trata de hacer una web idéntica a la original, y asignarle una url parecida a la original. Por ejemplo, supongamos que en vez de ‘hotmail.es’, colocamos la web idéntica a hotmail en ‘hootmail.es’. Pero nuestra web cuando el usuario introduce su email y su contraseña y pulsa en enviar, la web nos manda, a nuestro correo electrónico, su email y contraseña.
      Si sabes programación web y quieres conseguir claves de Facebook, y no quieres hacer una replica de la página principal de Facebook, puedes hacer una página (no importa lo cutre que sea, ni la publicidad que tenga) que se llame ‘Quién me ha eliminado de Facebook’ y pedir siempre el email y la clave de acceso de Facebook. Cuando le dé a entrar, tú tendrás la clave, y puedes mostrar simplemente un texto diciendo que ‘nadie le ha eliminado hoy’. No me lo estoy inventando, esto se hizo ya hace unos años (en el 2007) para atrapar contraseñas de hotmail, aunque usando la API de msn para mostrar a gente que supuestamente nos habían eliminado (una API es un montón de herramientas de programación que sirven para hacer cosas, por ejemplo la API de msn permite, mediante código de programación, conectar a un usuario al msn, enviar un mensaje instantáneo, ver la lista de contactos,… ). Si quieres hacer algo ‘más creíble’ y te atreves con la API de Facebook, puedes hacer una página que se llame ‘Mi top 10 de amigos de Facebook ‘, que también pida el email y la clave, pero, en vez de mostrar un texto, muestre 10 amigos de Facebook al azar. Te sorprenderá la cantidad de crédulos que caerán en tu trampa.
    • Averiguar la respuesta a la pregunta de seguridad: Muchos emails permiten una respuesta de seguridad si no te acuerdas de tu contraseña, y si la contestas correctamente te permiten cambiar tu contraseña por otra nueva (sin preguntarte la antigua, claro). Tenemos que tener cuidado que la respuesta no sea fácil, es más, que no la conozca nadie. Sin embargo las preguntas de seguridad suelen ser muy fáciles de responder para aquel que te conoce un poco. Porque cosas como el nombre de un primo, o, como a mí me paso, de dónde es tu madre son muy fáciles de averiguar. La forma de fortalecer esto es responder algo que no tenga nada que ver con la pregunta, pero que te acuerdes, o mejor, usar otra contraseña que resista ataques de fuerza bruta con diccionario de claves. Pero eso no lo hace nadie, la mayoría de las personas ponen algo muy fácil.
    • Ingeniería social: Convence o engaña a la persona para que te diga la clave. Todos nos reímos cuando nos lo cuentan, pero ésta es la forma más efectiva de conseguir una clave. Puedes inventarte una excusa de que le tienes que ayudar a configurar su correo para protegerlo de los ‘virus’, pero que para ello necesitas su contraseña, y que tiene que hacerse en tu ordenador porque ahí tienes muchas ‘herramientas informáticas’ que instalar en su correo; que no hace falta que venga a tu casa, que con sólo decirte la clave por teléfono o en un email ya está. Sí, es una falsedad y si sabes mucho de manejo del correo electrónico, pero por suerte, mucha gente sólo sabe que el correo electrónico tiene una ‘bandeja de entrada’, el ‘sparm’ y una ‘papelera’, así que te creerán.
      Puedes visitar su casa y mirar si la tiene escrita en un post-it o en un cajón de su escritorio guardada. Existe la teoría de que la mayoría de las claves están cerca del escritorio donde está el ordenador. También, si tienes una relación más cercana con la persona, puedes sonsacarle su clave. ¿No hay mucha gente que saben las claves de su pareja y cuando se separan se la lían virtualmente a su ex-pareja (si no cambian sus contraseñas antes de que pase algo así)?

Como habéis podido ver, todos los métodos actuales (y hay más) para obtener una clave se basan en obtenerla no cifrada. Hay gente que cree que los ‘hackers’ pueden averiguar cualquier contraseña con un simple programa de desencriptación, esto no es cierto. Lo más que se puede hacer es usar un ataque de fuerza bruta con diccionario de claves, pero para probar cada candidata a clave, cifrarla, y luego comparar si la clave candidata es igual que la clave cifrada real, aunque esto tarda más tiempo, además hay métodos actuales de cifrado para los que hacer esto no es efectivo.

Notas:
La imagen del inicio del texto pertenece al artículo de la wikipedia de la película “Matrix”.
[1] Mensaje para que expertos en el tema no me partan las piernas: Lo sé, lo sé. La palabra correcta sería algoritmo, pero como, por formulas recursivas, está demostrado que podemos expresar cualquier algoritmo en una fórmula matemática, y, en este caso, se trata de calcular un resultado, a partir de unos datos (una función de toda la vida). Y como es más sencillo para una persona común digerir la palabra ‘formula matemática’ que ‘algoritmo’, y actúa como tal, pues adopto el termino para la explicación. En caso de ser un procedimiento, en vez de una función, habría usado el termino de ‘algoritmo’ y habría aprovechado un espacio para explicarlo.
[2] Por eso cuando te dan una contraseña generada automáticamente, te dicen que tienes que cambiarla. Una vez que la cambias este tipo de ataque no te afecta, siempre y cuando uses un cifrado adecuado en tu router, y no el WEP que viene de fabrica, en caso de que lo hagas, cambia tu cifrado a WPA2-AES. Si quieres informarte más sobre este tema puedes leer más en este enlace. Lo suyo es que, si no quieres complicarte la vida, será que busques por Google tu modelo de router, seguido de una frase como “cambiar contraseña WiFi y seguridad”, por ejemplo. Hay varios tutoriales por las webs, incluso adecuados a tu modelo de router. Lo de usar el cifrado WEP es peligroso, más que nada porque hay muchos programas por Internet que averiguan claves WEP. Gracias a eso mucha gente puede conseguir conectarse a la ‘WiFi del vecino’.

2 Comentarios

Dejar respuesta

Please enter your comment!
Please enter your name here

Límite de tiempo se agote. Por favor, recargar el CAPTCHA por favor.