Enviando emails usando JAVA e PHP, pasando o no por un SMPT intermedio.

En este artículo hablamos de como enviar correos usando PHP o JAVA. Para ello existen muchas maneras, y aquí relatamos unas pocas. Del mismo modo como existen muchos tipos de protocolos para el envío y recepción de correos (SMTP, POP3, IMAP…) nosotros solo nos codearemos con SMTP. Por otro lado, veremos también como intentar saltarnos el servidor SMTP llamado servidor intermedio (“SMTP relay server”) para hacer un “email spoofing”, es decir, enviar un correo y que llegue des de una dirección de correo falsa. E aquí el índice del artículo:

Enviar un correo usando un servidor smtp :

Cuando enviamos un correo de este modo, estamos utilizando un servidor de correo smtp para que realice la gestión del envío. El esquema es el siguiente:

send_with_relay

Fuente: http://www.afterlogic.com/mailbee-net/docs/direct_send.html

Como vemos el cliente SMTP se autentica con el “SMTP relay server”. Este, consulta en un servidor DNS que IP tiene el servidor MX (Mail Exchange) que corresponde al destinatario del correo. Los servidores SMTP MX, son  los encargados de recibir el correo y entregarlo a la bandeja de entrada del usuario que le corresponde.

Hay muchas API en muchos lenguajes de programación preparadas para hacer esto, veremos, muy por encima las siguientes:

  • Javax.mail de JAVA.
  • Phpmailer de PHP.
  • Usando un SMTP sin username.

–  Usando Java, con la librería Javax.mail.* podemos fácilmente crear una conexión SMTP y, después de la posterior identificación, enviar un correo a  través de nuestro servidor. Aquí un simple ejemplo:

http://www.tutorialspoint.com/java/java_sending_email.htm

Cabe decir que normalmente tenemos que configurar en nuestro proveedor de correo  para que acepte conexiones remotas SMTP, pudiendo incluso desactivar la necesidad de autentificarse si fuera necesario! Eso provocaría que podríamos enviar a través de nuestro correo sin necesidad de escribir el password.  Aquí un ejemplo: http://stackoverflow.com/questions/19115732/send-mail-in-javax-mail-without-authentication

Usando PHP. Existen diferentes funciones para esto. Si queremos, como en Java, enviar un correo utilizando un servidor SMTP nos podremos valer de la clase phpmailer, aquí un ejemplo.

http://phpmailer.worxware.com/index.php?pg=examplebsmtp

De este modo también deberemos autenticarnos contra un SMTP, así como podremos activar en el servidor las conexiones remotas SMTP y activar o no la función de necesidad de autentificación.

Usando un SMTP sin username. De otra manera podemos usar un servidor SMPT que no requiera autentificación. Ya sea instalándonos nuestro propio servidor SMPT en el ordenador o buscando uno que lo permita de esta lista: http://www.werockyourweb.com/list-outgoing-smtp-mail-servers/
http://www.e-eeasy.com/SMTPServerList.aspx

Enviar un correo sin usar directamente un servidor smtp:

Pero y si queremos saltarnos a nuestro “SMTP relay server”? En cierto modo esto nos permitirá realizar directamente el envío al servidor MX y a su vez podríamos decir que el correo viene de un correo ficticio que nos hemos inventado.

send_directly

Fuente: http://www.afterlogic.com/mailbee-net/docs/direct_send.html

Sin embargo existen problemas que puede acarrear este método:

  • Es posible que tu ISP bloquee esta clase de envíos debido a que no responden de un servidor SMTP conocido o que directamente bloquee el puerto SMTP, teniendo que utilizar el propio SMTP relay del ISP.
  • Por otro lado, tu email puede ser considerado SPAM por el SMTP MX server ya que no responde a un servidor conocido.
  • También solo podrás enviar correos de uno en uno a un servidor SMTP, es decir, si envías correos al SMPT de Gmail los destinatarios deben ser de Gmail, para Hotmail necesitarías otra consulta.
  • Lentitud a la hora de realizar la consulta

Existen diferentes métodos para hacer esto, veremos:

  • PHP
  • JAVA
  • C#
  • Exploiting SMTP Vulnerability

1 – PHP

Existen diferentes maneras de enviar un mail des de PHP, la más conocida y extendida es mail(). Pero cómo funciona? Si bien nosotros podemos usar el “FROM” (correo de origen) que nosotros queramos, tenemos que tener un par de cosas configuradas y sabidas:

Si usamos Windows tenemos que asegurarnos que ciertas directivas están cubiertas, directivas que, en definitiva, dirigen el correo a un SMTP relay. Aun así nos valdría para un spoofing.

Si usamos Linux solo tenemos que hacer que nuestro PHP.ini apunte a la aplicación sendmail, y ya podremos hacer el envío. A recordar que sendmail se debe configurar también para realizar las búsquedas MX. Aquí una MUY  breve explicación (sendmail necesita una fuerte configuración):  http://www.tutorialspoint.com/php/php_sending_emails.htm

Podemos ver distintos ejemplos de código en http://phpmailer.worxware.com/?pg=examples

2 – JAVA

Utilizando este lenguaje hemos encontrado una librería que realiza las búsquedas y realiza el envío de forma automática:

http://www.example-code.com/java/send_email_without_mail_server.asp

Si quisiéramos realizar las búsquedas por nosotros mismos nos podemos valer también de este código: http://www.eyeasme.com/Shayne/MAILHOSTS/mailHostsLookup.html.

También en  http://www.coderanch.com/t/274456/java/java/java-mail-SMTP-server (mensaje de Dipak Bava) veremos cómo hacerlo:

//Now prepare your message.
MailMessage mail = new MailMessage();
mail.To.Add(“someone@somedomail.com”);
mail.From = new MailAddress(“tome@somedomain.com”);
mail.Subject = “Send email without SMTP server”;
mail.Body = “Yep, its workin!!!”;

//Send message
string domain = mail.To[0].Address.Substring(mail.To[0].Address.IndexOf(‘@’) + 1);
//To Do :need to check for MX record existance before you send. Left intentionally for you.
string mxRecord = SendSMTP.DnsLookUp.GetMXRecords(domain)[0];
SmtpClient client = new SmtpClient(mxRecord);
client.Send(mail);

También podemos instalar nuestro propio SMTP server http://james.apache.org/ .

3 – C#

Solo nos remitiremos al tutorial: http://www.afterlogic.com/mailbee-net/docs/direct_send.html 

4 – Exploiting SMTP vulnerability

Podemos estar atentos de algún exploit que se aproveche de alguna vulnerabilidad del SMTP a bajo o alto nivel para poder enviar correos… Por ejemplo en este articulo se relata:

http://searchsecurity.techtarget.com/definition/email-spoofing

E-mail spoofing is possible because Simple Mail Transfer Protocol (SMTP), the main protocol used in sending e-mail, does not include anauthentication mechanism. [….]

Anyone with the requisite knowledge can connect to the server and use it to send messages. To send spoofed e-mail, senders insert commands in headers that will alter message information. It is possible to send a message that appears to be from anyone, anywhere, saying whatever the sender wants it to say.

Podemos ver un lijero ejemplo aquí:

http://abcdba.com/abcdbamailhowtospoofemailusingsmtp
http://www.dummies.com/how-to/content/smtp-hacks-and-how-to-guard-against-them.html

En el siguiente articulo vemos que ni  la NSA está a salvo:

http://www.ehackingnews.com/2013/12/nsa-server-vulnerable-to-smtp-spoofing.html

Utilidades que permiten spoofear un email:

https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=how%20to%20program%20an%20email%20spoofer

 

 

 

 

 

This entry was posted in General, Hacking, Seguridad, Tutorial. Bookmark the permalink.