Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: ‭lipman en 14 Julio 2010, 10:23 am



Título: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 14 Julio 2010, 10:23 am
Los foros de la gente de simplemachines son de los más usados actualmente. No me extrañaría que fuese por la combinación diseño-características-gratis que reune este tipo de foros. Pero, ¿que hay de la seguridad?

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/3b54cf5e.jpg?t=1279095056)

Actualmente, la gran mayoria de personas asegura que usa la misma contraseña para todo (correo, registros de foros, y otras cuentas de mayor importancia como eBay o Paypal/Alertpay, etc) debido a la dificultad que supone tener que cuidar y guardar las diferentes contraseñas. Sin embargo, a pesar de esta incomodidad, la seguridad siempre debería de ser lo primordial para el usuario, sobre todo para el más inexperto (osease, la inmensa mayoria de usuarios).

Cuando instalamos en un servidor un foro (en este caso del tipo SMF) lo primero que hace es mirar la base de datos, y crear allí un registro, en donde a lo largo de la vida del foro se guardarán los posts, los subforos, las configuraciones, y los datos de los usuarios.

¿Los datos de los usuarios? Si. Esto es, los datos que tenemos en nuestro perfil del foro, como el avatar, el nickname, el nombre, la fecha de nacimiento, la firma, y la contraseña.

El administrador de cualquier foro puede acceder a la base de datos y ver/modificar/eliminar cualquiera de los datos anteriormente citados. Simplemachines piensa en todo (al igual que todos las empresas de ese estilo) y la mejor solución que le pone a esto es, cifrar la “contraseña”. Le pongo comillas, porque en realidad, no se guarda la contraseña, sino que se guarda un hash, generado mediante el nombre de usuario y contraseña. Esto quiere decir que, cuando nos registramos, se guarda en la base de datos la cifrado mediante SHA1 del nombre de usuario junto con la contraseña.

Por ejemplo, si me registro, y pongo de usuario lipman y de contraseña password, en la base de datos se guarda la cifrado de lipmanpassword, de la siguiente simple manera:

Código
  1. sha1($nombreUsuario . $password)

Por lo que, cuando un administrador acceda a la base de datos, le será imposible obtener la contraseña de ese usuario. La única solución seria desencriptarlo mediante fuerza bruta, pero descartamos esta opción debido al inmenso tiempo que se tomaria.

¿Quiere decir esto que nuestra contraseña está a salvo?
Absolutamente no.

Se podrían hacer cientos de métodos distintos e incluso combinarlos, para averiguar las contraseñas de los usuarios que se registren. El más sencillo que se me ocurre es: justo al registrarse un usuario, guardar en la base de datos su contraseña sin cifrar. A continuación describiré cómo se podría realizar.

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/1.jpg?t=1279095127)

Lo primero de todo, tenemos que crear en la base de datos la columna en la que guardaremos estas contraseñas sin cifrar:

Código borrado por el autor

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/2.jpg?t=1279095149)

Queremos que este código se ejecute una sola vez, por eso, este código se encarga de buscar un archivo que no deberia de existir, y si no lo encuentra, realiza esa alteración en la base de datos y posteriormente lo crea (para que lo encuentre y no se ejecute esto nada más que una sola vez)

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/3.jpg?t=1279095179)

Las variables $db_server, $db_user, $db_name y $db_passwd son variables que contienen, como propiamente dan a indicar, el nombre del servidor, de usuario, de la base de datos y la contraseña respectivamente. Ya se encuentran con los valores, ya que estos se guardan en Settings.php

La línea interesante es la sexta: $consulta = “ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;”;

Esto crea en la tabla smf_members una columna llamada pwdlol después de la columna memberName (así tendremos la contraseña al lado del usuario, por comodidad)

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/4.jpg?t=1279095262)

Sigamos…

Código borrado por el autor

Este código simplemente guarda en las variables $contrasenha y $miembrouser la contraseña y el nombre de usuario (todo sin cifrar) y luego, introduce la contraseña en la tabla de pwdlol, en donde el memberName sea el mismo que el miembro registrado.

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/5.jpg?t=1279095284)

Preocupamente tengo que decir: ya está. Así de simple es obtener la contraseña de cada usuario que se registre en tu propio foro SMF.

(http://r.i.elhacker.net/cache?url=http://i476.photobucket.com/albums/rr125/lipmandj/Delanover/6.jpg?t=1279095316)

¿Es esto preocupante? Personalmente, solo espero que cada vez que os registreis en un foro la próxima vez, penseis en ponerle otra contraseña que la de vuestro correo.

Próximo análisis: PhpBB

Fuente: http://delanover.com/2010/07/14/inseguridad-en-los-foros-smf/

Agradezco cualquier opinión, comentario, duda o sugerencia.


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: madpitbull_99 en 14 Julio 2010, 11:33 am
Si quieres ver la seguridad en foros SMF solo mira la auditoria de seguridad que se hizó aqui en elhacker.net : Simple Audit

PD: por que citas como fuente tu proprio blog ? xD


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 14 Julio 2010, 11:37 am
Tal vez porque lo he escrito yo?


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: invisible_hack en 14 Julio 2010, 22:30 pm
En cuanto al tutorial, muy bien hecho, muy currado y bien explicado, se entiende muy fácil  :D

Pero, no creo que esto pudiese considerarse un "bug" de SMF (ya que lo posteaste en esta sección), porque en realidad lo que estás haciendo es modificando el código fuente del SMF para que te de la password del usuario descifrada y tal, pero no es un bug en sí mismo...

No sé si me entiendes...

Aunque quizás, tiene que ver con la seguridad de SMF...pero no sé, yo no lo consideraría bug... :P

Por otra parte, si realmente lo que quieres es ver lo que tiene el usuario en su cuenta, puedes cambiarle su password por otra que tu quieras, y listo...

Pero evidentemente, sin saber su password anterior...

De todos modos, lo único para lo que se me ocurre que podría valer esto es para hacer un "scam", y si queremos sacarle la password en cuestión al usuario, por si usa la misma password en otro sitio...

Pero nah, tendría que ser un usuario muy desprevenido para usar la misma password en varios sitios... :xD


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: Debci en 14 Julio 2010, 22:34 pm
Asi cualquier foro es inseguro xD

Saludos


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: braulio-- en 14 Julio 2010, 22:42 pm
Si esto es una vulnerabilidad, la tienen todos los CMS que existen.


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 14 Julio 2010, 23:18 pm
@invisible_hack

Con respecto lo primero xD en realidad lo posteé en el subforo de Seguridad ^^u me lo movieron a este, ya que como dices, es una modificación del propio código y yo tampoco consideraria bug esto, pero weno ^^

Con respecto lo segundo... no es que "queramos" saber lo que tiene dentro, como los mensajes privados y tal (que entonces, sí que podriamos hacer eso que tu dices de cambiarle la contraseña) El objetivo es averiguar la contraseña con la que nuestro usuario se registra, para poder verla y así, poder usarla en un futuro.

Todos sabemos lo fácil que es rastrear a una persona a partir de nick, correo, nombre-apellido, etc, y una vez rastreada la persona, esta puede tener cuentas de facebook, en foros, en blogs, etc. Y, el problema de la gran mayoria de users, es el uso que le dan a la contraseña, que ponen en todos lados la misma ^^ Simplemente queria demostrar (algo obvio por otra parte) otro modo de ver lo inseguro que es registrarse en un varios sitios con la misma contraseña, porque te la pillan en uno, y se pueden meter en todos =P

@Debci @braulio
Si.. es obvio xD el administrador puede modificar a su antojo absultamente todo, pero mi objetivo con es te (y los posteriores que haga) no es mostrar propiamente la inseguridad de un foro smf sin más, sino el objetivo es concienciar, de lo fácilmente que un administrador de cualquier sistema que requiera un registro, puede obtener la contraseña. De esta manera, nos concienciamos un poco todos en dejar de usar la misma pass para todo ^^


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: braulio-- en 14 Julio 2010, 23:30 pm
Me conformo, está muy bien explicado.
Buen trabajo.


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: Debci en 14 Julio 2010, 23:34 pm
Que conste que en ningun momento he querido ofender a nadie, no me tienes que convencer de que es inseguro, ni de que es un exelentisimo tutorial ;)

Saludos


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 14 Julio 2010, 23:40 pm
Que dices! ^^ nadie se ha ofendido  :)

Gracias por los comentarios!


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: jdc en 15 Julio 2010, 01:33 am
Lipman bastante simpático, pero creo que sería mejor que no hicieras un tutorial xD por último omite el código para que sí algún pelotudo sigue tu idea por lo menos tenga que pensar algo.
 
Ahora, algún tiempo he administrado foros y creo firmemente que la confianza es lo principal y este tipo de cosas hace que se pierda. Mucha gente en sus sistemas guardan la contraseña sin cifrar y sí smf la cifra por defecto, no deberías enseñar como no hacerlo.
 
Ojo te lo digo con harto respeto.
 
Saludos


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ~ Yoya ~ en 15 Julio 2010, 02:11 am

Citar
Por ejemplo, si me registro, y pongo de usuario lipman y de contraseña password, en la base de datos se guarda la cifrado de lipmanpassword, de la siguiente simple manera:


Código
  1. sha1($nombreUsuario . $password)

Por lo que, cuando un administrador acceda a la base de datos, le será imposible obtener la contraseña de ese usuario.

Y que pasa si otro usuario accede a la DB, quisieras que tenga todas las contraseñas, asi de facir?


Citar
Se podrían hacer cientos de métodos distintos e incluso combinarlos, para averiguar las contraseñas de los usuarios que se registren. El más sencillo que se me ocurre es: justo al registrarse un usuario, guardar en la base de datos su contraseña sin cifrar
No funcionara ya que lo que hace es comparar el dato con el que esta en la DB...
Osea, se ingresa el password a la DB sin cifrar y cuando el usuario digita su password se pasa a md5 y se verifica si los dos datos son iguales, si tienes tu password registrado en la DB sin cifrar, al comprobarlo no seran lo mismo, salvo que no use ningun tipo de encriptacion xD...
Ej:
Código
  1. <?php
  2. $valordelusuario = md5(123456);
  3. $valor_sin_sifrar_de_la_db = 123456;
  4. if($valordelusuario == $valor_sin_sifrar_de_la_db){
  5. echo "Password Correcto";
  6. }
  7. echo "Password Incorrecto";
  8.  
  9. ?>

Siempre los password serán incorrecto...


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: jdc en 15 Julio 2010, 06:40 am
Claro, la idea sería agregar un nuevo campo a la db y guardar en ese la clave, asi se tendría en la db el usuario, el pass cifrado y el pass sin cifrar, pero como dijeron por ahí esto se puede hacer en cualquier cms abierto en el cual el usuario tenga acceso a la db y a los archivos fuente del sistema.
 
Insisto en que es mejor no facilitar el trabajo a gente sin ética, lo mejor es que sí quieren hacer pelotudeses que se quiebren el coco


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: madpitbull_99 en 15 Julio 2010, 10:32 am
Tal vez porque lo he escrito yo?

Da igual , no lo has entendido...


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 15 Julio 2010, 10:34 am
@Yoya
El código funciona perfectamente, he hecho muchísimas pruebas y es indiscutible su funcionamiento xD

Fíjate, que hago 2 cosas:
-La primera, creo en la base de datos una fila nueva (para meter ahí la contraseña sin cifrar)
-La segunda, hago que se guarde (junto con la contraseña cifrada) la contraseña sin cifrar.

Si no hiciera esto, tendría que cambiar el método que usa SMF para loguearse también, y esto es más complicado (pero se podría hacer)

@Janito
Tienes toda la razón, me hiciste recapacitar un poco, y he decidido quitar los códigos el lunes que viene (para que así vean aunque sea el trabajo que hice durante unos dias) y lo mismo haré cuando postee los siguientes  :D

Un saludo y gracias!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

@madpitbull_99
Es fácil de entender, al ser el autor del post, lo pongo de primeras en mi página y luego aquí. Por otro lado, está el tema de la "responsabilidad" y prefiero que caiga la responsabilidad de este post en mi, que en este foro. No te lo digo con mala intención ^^

Saludos!


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: madpitbull_99 en 15 Julio 2010, 13:02 pm
La fuente se suele poner cuando un post no es tuyo y asi citar la fuente, pero ya que lo has publicado tu se da a entender que lo has escrito tu ...


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ~ Yoya ~ en 15 Julio 2010, 16:43 pm
Código:
Fíjate, que hago 2 cosas:
-La primera, creo en la base de datos una fila nueva (para meter ahí la contraseña sin cifrar)
-La segunda, hago que se guarde (junto con la contraseña cifrada) la contraseña sin cifrar.

Si no hiciera esto, tendría que cambiar el método que usa SMF para loguearse también, y esto es más complicado (pero se podría hacer)
Si exacto, tendrias que cambiar el metodo que usa SMF para loguearse pero por algo las contraseñas se guardan cifradas en la DB, porque pueda ser que alguien copie la DB y luego la este vendiendo xD...

Eso es solo una medida de seguridad, no hay nada malo en eso....


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: kisk en 15 Julio 2010, 17:25 pm
Citar
Código:
$contrasenha = $_POST['passwrd1'];
$miembrouser = $_POST['user'];
 
$consulta = "UPDATE smf_members SET pwdlol = '$contrasenha' WHERE memberName = '$miembrouser'";
$resultado = mysql_query($consulta) or die("Error realizando la consulta");


Eso se ve como una bonita inyeccion sql :D xD


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: jdc en 15 Julio 2010, 17:41 pm
Que se guardará en un campo y jamás se mostrará xD


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: braulio-- en 15 Julio 2010, 18:55 pm
Que se guardará en un campo y jamás se mostrará xD
Si con eso quieres decir que no es explotable estás equivocado.
Si $contrasenha contiene "blablabla' , password=md5('hola') WHERE memberName='admin' --" le puedes reventar.


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: jdc en 15 Julio 2010, 19:43 pm
Pues el campo de la contraseña sin cifrar no se compara, lo único que hace es ingresarlo a la db en el sistema luego no se compara sino que se sigue tratando el hash cifrado. Asi que insisto, no es explotable sin acceso a la db.


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: jdc en 15 Julio 2010, 19:51 pm
Auch tienes razón, no me había fijado claro que la consulta para ser universal podría ser where id = 1 por sí no tienes el usuario del admin


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: evillcs en 10 Abril 2011, 21:42 pm
Aver si alguien me ayuda con esto..

Yo pongo el codigo

Código:
$contrasenha = $_POST['passwrd1'];
$miembrouser = $_POST['user'];
 
$consulta = "UPDATE smf_members SET pwdlol = '$contrasenha' WHERE memberName = '$miembrouser'";
$resultado = mysql_query($consulta) or die("Error realizando la consulta");

(Ya se que aqui lo borraron pero lo pueden ver en http://delanover.com/2010/07/14/inseguridad-en-los-foros-smf/)

Lo pongo en la linea 304 de register.php, pero al registrarse alguien, la tabla pwdlol, sigue NULL, es decir, nada se escribe alli..

Ya verifique que mi register.php use en el POST passwrd1 y user, y asi es, esta todo bien, pero no se escribe nada en el campo pwdlol..

Alguna ayuda?


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 11 Abril 2011, 17:05 pm
Como autor del post y de la entrada en el blog te cuento:

Mi objetivo no era que cualquiera pudiera hacer la simulación que yo hice, sino dar conciencia de la cierta peligrosidad que conlleva usar la misma combinación de usuario-contraseña al registrarse en un foro se podian grabar sus datos íntimos en texto plano (podria ser usado junto con la ingenieria inversa). Si quieres indagar también en eso, busca el porqué pasa eso y la solución, no en un foro de hacking ni de exploits, sino en uno de programación web e investiga acerca de MySQL.

Por otra parte, te digo que tal como escribí en el post, a mi me funcionó bien, y no tuve problemas, simplemente preocupate de cambiar el contenido de lo que intentas meter, igual el problema radica en la creación de la tabla, así que cambia cosas y toquetea.

Por otra parte, para la próxima vez, en vez de revivir un post, preguntar en los comentarios del blog.

Un saludo =)


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: PanConMantequilla en 11 Abril 2011, 17:55 pm
ya que revivieron el post y lei el contenido... noto ques esto no es ninguna INseguridad en SMF, esta bien claro que cualquiera podria modificar/agregar el codigo fuente de SMF para que haga lo que le plazca en cada acción del usuario/visitante, nisiquiera tengo que leer el tutorial para comprobar que es posible hacerlo, porque la idea desde ya es 100% posible de multiples formas, y es muy generico el titulo del post haciendo alusión a SMF, de forma similar se puede hacer lo mismo a wordpress, joomla, drupal (por eso se llaman Open Source)... hasta a cualquier framework desde codigniter hasta symphony, entendiendo esto... aqui no hay ninguna inseguridad mas bien una acción malevola del mismo dueño del sitio y abuso de confianza hacia sus usuarios, y si otra persona tiene acceso a la DB ?? estarias con la soga al cuello


Título: Re: (In)seguridad en los foros [SMF]
Publicado por: ‭lipman en 11 Abril 2011, 19:10 pm
Relee mi post anterior para recordar cual era el objetivo de la creación de este post.

Por otra parte en particular, el objetivo ha sido siempre el de analizar el funcionamiento y tal, y te puedo asegurar que he analizado más paquetes de foros preconstruidos (phpbb sin ir mas lejos) y el cuidado que tiene con la contraseña este último es infinitamente superior al de SMF.

SMF simplemente hashea una contraseña a partir del user y password como puse, sin embargo PHPBB va más allá, de hecho, os animo a que veais el códifo fuente.

El hash de SMF se puede crackear facilmente buscando colisiones, ya que el nombre de usuario es público y el otro parámetro es la contraseña, la cual atacando por fuerza bruta (a partir del hash de la base de datos) se podría sacar "facilmente".

Y si, realmente cualquiera que tenga acceso a la base de datos y a los scripts, y sepa, puede sacar la contraseña de cualquier sistema de registro-logueo.

Un saludo