[Solucionado] -seguridad en chat simple

Iniciado por elezekiel, 30 Octubre 2014, 07:09 AM

0 Miembros y 1 Visitante están viendo este tema.

elezekiel

hola gente tengo una duda porq estoy haciendo un chat sencillo nomas para que se conecten 3 o 4 a una maquina servidor, tengo todo hecho funciona las pc se conectan bien bla bla. el tema es que quisiera saber a que podria enfrentarme si un usuario malintencionado atacara el servidor ?¿ uso winsock y basicamente es una conexion directa a un puerto e ip que solo el cliente que se repartio conoce, ningun usuario esta conociendo dicha ip ni puerto.

alguna sugerencia antes de liberar este trabajito la semana entrante? graciass

saluddd

engel lex

tu conoces tu código... fuera de tu código el winsock básicamente se limita a una comunicación de paquetes de bajo nivel en protocolos standards contra el winsock hay muy poco que hacer...

tu código es la parte vulnerable normalmente... los programas fallan es por la forma en que el código está hecho... entonces tu eres quien ve las vulnerabilidades...

si el chat no está cifrado, cualquier usuario en las redes va a poder sniffear todo el contenido que salga y llegue a un cliente (a demás de meterse y hacerse pasar por el)


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

elezekiel

a que te referis con cifrado? o sea, cuando envio una peticion o por ejemplo, cuando se conecta un uusuario a la sala, les avisa alos demas que esten, pero ese codigo, o sea, el aviso esta basado en algo que invente yo, o sea, a ver, no descubri america, pero me refiero, toma una especie de prefijo, por ejemplo, cuando el cliente se conecta envia como datos msgeEntrante parametro+ parametro, por decirte algo, entonces a eso el servidor lo parsea y emite el mensaje correspondiente en sala dependiendo lo que recibem cuando alguien sale vendria a ser msgeSaliente parametro+parametro.

Tal vez es algo absurdo pero no encontre otra forma de realizarlo al menos de momento.

graciasss saluddd

engel lex

está bien hecho :P en general así se hace, con prefijos...


pero ahora preguntate... que pasa si se envian prefijos a control del usuario? si un fastidiosos solo los quiere enviar por molestar pasa algo malo?

por otro lado lo del cifrado
Citarsi el chat no está cifrado, cualquier usuario en las redes va a poder sniffear todo el contenido que salga y llegue a un cliente (a demás de meterse y hacerse pasar por el)

cifrado es proteger los paquetes con una contraseña (por resumir) si no estan cifrado un ataque de man in the middle va a tener acceso todo lo que usuario en la misma red ve
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

elezekiel

Cita de: engel lex en 30 Octubre 2014, 14:49 PM
está bien hecho :P en general así se hace, con prefijos...


pero ahora preguntate... que pasa si se envian prefijos a control del usuario? si un fastidiosos solo los quiere enviar por molestar pasa algo malo?

por otro lado lo del cifrado
cifrado es proteger los paquetes con una contraseña (por resumir) si no estan cifrado un ataque de man in the middle va a tener acceso todo lo que usuario en la misma red ve
no entiendo esa parte, a que te referis?

engel lex

Cita de: elezekiel en 30 Octubre 2014, 07:50 AM
cuando el cliente se conecta envia como datos msgeEntrante parametro+ parametro, por decirte algo, entonces a eso el servidor lo parsea y emite el mensaje correspondiente en sala dependiendo lo que recibem cuando alguien sale vendria a ser msgeSaliente parametro+parametro.

si preguntas sobre la seguridad ese parrafo es lo importante... mi pregunta era... que pasa si un usuario manda si el usuario empieza a mandar esos datos a lo loco?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

elezekiel

bueno eso es algo que no tome en cuenta. si el cliente envia muchas peticiones no lo estoy seteando ni limitando, es un buen detalle.

como sugeris manipular las pticiones? estoy abierto a opiniones.

engel lex

has una tabla de mensajes en el servidor, si el usuario se conecta, y se mantiene conectado, si se recibe un mensaje de conexión, revisar si el usuario de ese nombre está vivo (responde a un mensaje de "estás ahí?") si vive, ignora el mensaje, si no, desconectalo y conecta al nuevo usuario...

ve así... puedes por seguridad apartar los primeros x bytes para prefijar todo ej, apartas 4 bytes

"cmmd" significa que lo que viene es un comando
"msag" significa que lo que viene es un mensaje
"conn" significa que lo que viene es una conexion
"ping" el cliente responde con un "pong" para saber que está viva la conexion
"ackn" es un "ok" una confirmacion a lo ultimo recibido

entonces seria algo como (viendo desde el servidor "<" recive, ">"manda)
<connPepito //pide conexion
>cmmdConectado //se indica que fue conectado
<ackn //confirma la conexion
>ping //ping para medir la latencia
<pong //repsuesta a ping
<cmmdEntrarChat //pide entrar al chat
>ackn //confirma
<msagHola a todos //servidor recibe el mensaje "Hola a todos"
>msagPablo: Hola //sertvidor envia mensaje "Pablo: Hola" de otro usuario


y así vas... es util tener las confirmaciones de operacion para saber que todo funciona bien y un ping para saber que el cliente vive... para todo mensaje solo sacas los primeros 4 bytes y decides que hacer (si es comando, mensaje, o que)

siempre verificar los comandos para evitar un ataque
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

elezekiel

excelente ejemplo, en base a lo que decis, podria crear una funcion, que compare la conexion entrante(pendiente de aprobacion), con la lista de conexiones que tengo en una variable de coleccion(activas), con todos los datos de cada uno, si coincide, ignorar solamente, sino agregarla, crees que con eso basta o al menos creo que seria bueno en un inicio, no ?

Despues tendria que ver, como comprobar si las conexiones siguen vivas, a lo que son pocas podria realizar un seteo como decis de ping/pong a los usuarios conectados.

saludd y gracias.

engel lex

lo del cifrado para que las conversaciones no sean "espiables" podrías buscarte en internet algún codigo para cifrar todo el AES, al programa le das una contraseña de conexion inicial (para que la primera peticion sea cifrada) y luego la cambias


por ejemplo... en el codigo de conexion dejas la clave "arena"

(cifrado con "arena")
<connPepito //pide conexion
>cmmdConectado //se indica que fue conectado
>cmmdPass:aslkd92384 //le indica que cambie la contraseña a "aslkd92384" que es aleatoria y generada unicamente para el
(cifrado con "aslkd92384")
<ackn //confirma la conexion


y de resto es igual... claro si analizan bien y son real conocedores de criptografía (o en su defecto le hicieron ingenieria inversa al programa) pueden sacar la clave... pero contra un ataque MItM normal por gente común es una conexión segura :)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.