Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: z3nth10n en 26 Julio 2013, 14:37 pm



Título: Cifrar de forma segura una Pass en el Source
Publicado por: z3nth10n en 26 Julio 2013, 14:37 pm
Hola buenas, estoy haciendo un sistema para enviar emails desde un form, y tengo que ceder mi contraseña para que se puedan mandar emails correctamente, tengo una duda, hay alguna forma de cargar externamente un recurso si que de problemas?

Es decir, por ejemplo, en mi hosting meto un htaccess y un txt (el htaccess bloquea el acceso según el user-agent (por si alguien se infiltra) y luego que haya alguna forma de que el WindowsForms si pueda sacar ese TXT)..

Edito: Se me ha ocurrido una idea, que es darle permisos dentro de mi FTP... (Con chmod) Voy a ver si hago algo... ;)

Y por si fuera poco pues añado esto:

Código
  1.    Function SendEmail(ByVal Recipients As List(Of String), _
  2.                  ByVal FromAddress As String, _
  3.                  ByVal Subject As String, _
  4.                  ByVal Body As String, _
  5.                  ByVal UserName As String, _
  6.                  ByVal Password As String, _
  7.                  Optional ByVal Server As String = "smtp.gmail.com", _
  8.                  Optional ByVal Port As Integer = 587, _
  9.                  Optional ByVal Attachments As List(Of String) = Nothing) As String
  10.        Dim Email As New MailMessage()
  11.        Try
  12.            Dim SMTPServer As New SmtpClient
  13.            For Each Attachment As String In Attachments
  14.                Email.Attachments.Add(New Attachment(Attachment))
  15.            Next
  16.            Email.From = New MailAddress(FromAddress)
  17.            For Each Recipient As String In Recipients
  18.                Email.To.Add(Recipient)
  19.            Next
  20.            Email.Subject = Subject
  21.            Email.Body = Body
  22.            SMTPServer.Host = Server
  23.            SMTPServer.Port = Port
  24.            SMTPServer.Credentials = New System.Net.NetworkCredential(UserName, Password)
  25.            SMTPServer.EnableSsl = True
  26.            SMTPServer.Send(Email)
  27.            Email.Dispose()
  28.            Return "Email to " & Recipients(0) & " from " & FromAddress & " was sent."
  29.        Catch ex As SmtpException
  30.            Email.Dispose()
  31.            Return "Sending Email Failed. Smtp Error."
  32.        Catch ex As ArgumentOutOfRangeException
  33.            Email.Dispose()
  34.            Return "Sending Email Failed. Check Port Number."
  35.        Catch Ex As InvalidOperationException
  36.            Email.Dispose()
  37.            Return "Sending Email Failed. Check Port Number."
  38.        End Try
  39.    End Function
  40.  
  41.    Private Function GenerateHash(ByVal SourceText As String) As String
  42.        'Create an encoding object to ensure the encoding standard for the source text
  43.        Dim Ue As New UnicodeEncoding()
  44.        'Retrieve a byte array based on the source text
  45.        Dim ByteSourceText() As Byte = Ue.GetBytes(SourceText)
  46.        'Instantiate an MD5 Provider object
  47.        Dim Md5 As New MD5CryptoServiceProvider()
  48.        'Compute the hash value from the source
  49.        Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)
  50.        'And convert it to String format for return
  51.        Return Convert.ToBase64String(ByteHash)
  52.    End Function
  53.  
  54.  
  55.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  56.        Dim Recipients As New List(Of String)
  57.        Recipients.Add("Email a enviar, es decir, el mío")
  58.        Dim FromEmailAddress As String = Recipients(0)
  59.        Dim Subject As String = "Test From VB."
  60.        Dim Body As String = "email body text, if you are reading this from your gmail account, the program worked."
  61.        Dim UserName As String = "Email sin el @gmail.com"
  62.        Dim Password As String = GenerateHash("Contraseña que se saque de un TXT cifrada en Base64") 'Aquí debería estar la magia del ChMod... Me gustaría saber como resaltar una línea de code... :-\
  63.        Dim Port As Integer = 587
  64.        Dim Server As String = "smtp.gmail.com"
  65.        Dim Attachments As New List(Of String)
  66.        SendEmail(Recipients, FromEmailAddress, Subject, Body, UserName, Password, Server, Port, Attachments)
  67.    End Sub

Un saludo.
PD: Este es mi mensaje 1000! :)

PDS: Todo esto lo hago porque luego puede venir cualquier gracioso y sacarla con el Net Reflector...



Esto no va con .NET, en parte no:

Tengo una duda, con el chmod:

http://www.onlineconversion.com/html_chmod_calculator.htm

Se necesita ejecutarse para que Form lo pueda leer, o con la propiedad Read ya basta? Mejor dicho, Execute que hará? Voy a buscar... xD

===========

http://es.wikipedia.org/wiki/Chmod

Citar
EjecuciónEjecutar el archivo.Recorrer su árbol para acceder archivos y subdirectorios, pero no ver los archivos dentro del directorio (excepto que se le de el permiso de lectura)

Es decir, que si pongo permisos 111, VB.NET va a poder hacer algo? :huh: Creo que no... :-\

PD: Efectivamente, después de leer 3 veces esa cita, finalmente no va a leer nada.. Pero como le digo a la app que es el Owner (con Chmod a 400) y no cualquier otro grupo  o visitante? :-\


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Novlucker en 26 Julio 2013, 14:55 pm
¿Y todo eso que propones lo consideras seguro? :P

Saludos


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: z3nth10n en 26 Julio 2013, 14:59 pm
Hombre no mucho, pero por lo menos a los noobs que estén empezando a crackear no les va a resultar muy fácil, o eso creo... :P

Por lo menos, dime como lo puedo hacer :-\, o si quieres alguna recomendación o algo más seguro que se te ocurra :P

Gracias. ::)


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Novlucker en 26 Julio 2013, 16:52 pm
¿Por qué debes de proporcionar tus credenciales? ¿Por qué no pides que lo ingresen los usuarios?

Saludos


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: kub0x en 26 Julio 2013, 16:54 pm
¿Por qué debes de proporcionar tus credenciales? ¿Por qué no pides que lo ingresen los usuarios?


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: z3nth10n en 26 Julio 2013, 19:01 pm
Es para registrar las cosas que hagan los usuarios, y por eso necesitan ser mis credenciales... :-\



No se usar MySQL en VB.NET xD Y ademáas, si me borran el hosting pues por lo menos, tengo el respaldo de los emails.. :)


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Eleкtro en 26 Julio 2013, 19:19 pm
De alguna forma todo lo que se compila se debe poder descompilar para ser procesado por el engine del framework, sinó la app no se podría leer/ejecutar.
PD: Iba a pasarte un enlace sobre esto, era muy interesante, pero hace ya tiempo que me documenté y no recuerdo el enlace.

Lo que comentas del .NET Reflector, es inevitable, .NET Reflector no es un super programa que craquea las aplicaciones, no, es solo es una GUI para el reflector, otro ejemplo será el "simple assembly Explorer", deberías leer sobre el término "Reflection" para entenderlo mejor.

Con esto te quiero decir que... como es inevitable yo no perdería mucho el tiempo a la hora de buscar la protección perfecta, porque no existe, el mejor cracker siempre va a poder averiguar tus credenciales si se propone el reto.

No soy un experto en el tema de la ingenieria inversa, pero aquí va mi consejo:

Si estás tán convencido de querer usar tus credenciales pues, lo que te recomiendo es que añadas una protección mínima dentro del proyecto para las credenciales, por ejemplo usar algún tipo de hash como MD5 para tu contraseña, y luego, después de esa protección mínima, usar algún software profesional para proteger tu proyecto como por ejemplo "Crypto Obfuscator" o "Smart Assembly", por más códigos que encuentres con intención de hacer copy&paste para proteger tu app ninguno va a ser tán eficaz como este tipo de aplicaciones profesionales, que además de ofuscar, encriptan y comprimen, todo a niveles extremos ...tanto que si no lo usas bien podrías corromper el executable (pero siempre puedes volver a intentarlo usando niveles más bajos de protección :P).

Saludos...


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: ~ en 26 Julio 2013, 19:32 pm
Resultaría más práctico hacer un hash sobre los valores concatenados de usuario y contraseña y almacenar solamente eso.

Así, cuando se ingrese el usuario y contraseña, se calcularía, por ejemplo, el hash MD5 de esos valores con el hash MD5 almacenado en el código fuente.

Aunque todo esto podría no servir de nada si alguien más tiene acceso a la aplicación y si ese alguien es capaz de eliminar ese paso de seguridad, a menos que todos los datos estén cifrados también usando ese valor MD5 como "semilla" de cifrado, como mínimo por ejemplo, de una combinación alterada del "alfabeto" de Base64.

Así que si los caracteres de Base64 son originalmente:

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

que se determine dinámicamente un orden diferente con algún algoritmo, que resultaría en una cadena como:

"CDEFGHopIJKLMPtuQRST34UVWXABYZabcdefghijklNOmnqrsvwxyz01256789+/="

Aunque esto seguiría sin servir de nada tan pronto alguien más tuviera acceso al programa, y a los valores de nombre de usuario y contraseña.


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: El Benjo en 26 Julio 2013, 20:41 pm
Es decir, por ejemplo, en mi hosting meto un htaccess y un txt (el htaccess bloquea el acceso según el user-agent (por si alguien se infiltra) y luego que haya alguna forma de que el WindowsForms si pueda sacar ese TXT)..

Para esto te recomiendo que lo hagas mediante un script en tu servidor que lea el contenido de ese TXT cuando se llame con una contraseña exclusiva para ese propósito como parametro. Después llamas al script desde tu aplicación con un HTTPRequest y pasando la contraseña como parámetro para eso (Contraseña que no escribirías como constante en tu aplicación para evitar que sea vista con ingeniería inversa). El script te devolverá el contenido del TXT cuando le pases la contraseña correcta.


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Novlucker en 26 Julio 2013, 20:55 pm
"Hostearía" código servidor que reciba las información por query string y lo guardaría en una base de datos.


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: raul338 en 27 Julio 2013, 05:26 am
No se usar MySQL en VB.NET xD Y ademáas, si me borran el hosting pues por lo menos, tengo el respaldo de los emails.. :)
Y porque no guardarlo en el hosting en simples txt y descargarlo periodicamente los cambios (o los archivos nuevos) en tu pc?



Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: z3nth10n en 27 Julio 2013, 11:59 am
No se... Además tengo ganas de aprender a cifrar una contra, y creo que ya se como lo voy a hacer :laugh:


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Keyen Night en 28 Julio 2013, 00:50 am
No hay nada más inseguro que tener código de comprobación de credenciales del lado del cliente, imagínate que las operaciones de transacciones bancarias se realizaran del lado del cliente :xD

Lo mejor es el "hostear" el código de comprobación en un server.

Existen 3 tipos de cifrado: simétrico, asimétrico y de resumen.

Cada uno tiene sus fines, el cifrado mal practicado puede ser más inseguro que no cifrar la información.

Puedes buscar información al respecto, .Net Framework ya posee clases prediseñadas para los tipos de cifrados más comunes.


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: 1mpuls0 en 1 Agosto 2013, 17:22 pm
De alguna forma todo lo que se compila se debe poder descompilar para ser procesado por el engine del framework, sinó la app no se podría leer/ejecutar.
...
Con esto te quiero decir que... como es inevitable yo no perdería mucho el tiempo a la hora de buscar la protección perfecta, porque no existe, el mejor cracker siempre va a poder averiguar tus credenciales si se propone el reto.
+1

Resultaría más práctico hacer un hash sobre los valores concatenados de usuario y contraseña y almacenar solamente eso.

Así, cuando se ingrese el usuario y contraseña, se calcularía, por ejemplo, el hash MD5 de esos valores con el hash MD5 almacenado en el código fuente.

Aunque todo esto podría no servir de nada si alguien más tiene acceso a la aplicación y si ese alguien es capaz de eliminar ese paso de seguridad, a menos que todos los datos estén cifrados también usando ese valor MD5 como "semilla" de cifrado, como mínimo por ejemplo, de una combinación alterada del "alfabeto" de Base64.

yo utilizao md5(base64())

No se... Además tengo ganas de aprender a cifrar una contra, y creo que ya se como lo voy a hacer :laugh:

Exacto, sería bueno crear un propio método de encrypt.
Aunque obviamente tendrías que incluir en tu código el método para decrypt xD

Saludos.


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Novlucker en 1 Agosto 2013, 17:27 pm
~ y Darhius, en este caso un algoritmo de hashing como MD5 no es válido, ya que necesita la contraseña en plano para utilizarla en el SMTP

Saludos


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: 1mpuls0 en 1 Agosto 2013, 17:35 pm
Sí perdón, olvidé que especificar que lo hago para php (100% offtopic  :xD)

Lo pregunto porque de hecho hice una aplicación de escritorio en java y sería más o menos el mismo caso.
Lo que yo hice y con un cierto grado de desconfianza  :¬¬ tengo algo como lo siguiente.

config.INI
Código:
[CONFIGURACION]
Server=+XvgPolgoovks5qeNUx/Pw==
Port=9ppw+LDslXQ=
Database=+XvgPclgoasbO/mmPjmXiA==
User=+XvgPclgoosbO/mmÑjmXiA==
Password=FbH5C59nUJQeVXZI/+sDzw==

Leo el archivo y sus respectivos valores para descifrarlo con métodos.
Aunado a todo esto y inexperiencia para tratar este tema lo que hice fue ofuscar el código.

Pero entonces para .net que sugieren los expertos?  :rolleyes:


Título: Re: Cifrar de forma segura una Pass en el Source
Publicado por: Novlucker en 1 Agosto 2013, 19:17 pm
En este caso puntual ...

"Hostearía" código servidor que reciba las información por query string y lo guardaría en una base de datos.