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
- Enviar un correo sin usar directamente un servidor
- Utilidades que permiten spoofear un email
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:
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.
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:
- Kali Linux:
- Telnet: http://www.wikihow.com/Send-Email-Using-Telnet
- WordPress: teoricamente nos podemos valer de la infrastructura de WordPress para enviar un mail spoofeado ya que wordpress utiliza sendmail(). Por ejemplo podriamos usar el típico formulario de contacto con tal fin.
- Online email spoofer:
- Aplicaciones: