Propagacion Basica Mediante Motor Smtp: ---------------------------------------- En Visual Basic 6.0 Hasta hace un tiempo, era comun ver en worms, por ejemplo hechos en vbs, vb y js que la propagación por correo se hacia llamando al Microsoft Outlook (el del Office) o al Outlook Express, pero esto tenia sus inconvenientes ya que podia ser que el outlook no estuviera configurado. En la actualidad tambien los antivirus le han puesto el ojo al outlook con su "Proteccion Email" y ademas en las ultimas versiones los outlook avisan al momento de enviar un mail desde un programa. Ya que no estamos en los tiempos en que el Loveletter se propago por 5 continentes usando el outlook, una opcion seria usar el protocolo SMTP (Simple Mail Transfer Protocol). El smtp es un protocolo que se usa para el envio de correo entre cliente y servidor, el outlook es un cliente que se conecta al server smtp para enviar los correos, entonces nuestro worm debera actuar como cliente y conectar al servidor por el puerto 25(puerto smtp) y enviarse en mensajes de correo, el smtp usa TCP. Ahora vamos a ver la sintaxis basica del smtp que nesecitaremos para enviar un mail, para ello hacemos una conexion por telnet al puerto 25 de mx1.hotmail.com ,abrimos nuestro telnet activamos eco local en menu Terminal->Preferencias->Eco Local (para ver lo que escribimos, en caso de que el server no tenga eco remoto). Vamos a menu Conectar->Sistema Remoto y en 'Nombre del host' colocamos mx1.hotmail.com ,en 'Puerto' ponemos 25 ,lo demas lo dejamos asi, damos a Conectar, y enviando un mail seria más o menos asi: <Server>220 mc9-f28.hotmail.com Microsoft ESMTP MAIL Service, Version: 5.0.2195.6824 ready at Fri, 3 Dec 2004 16:32:49 -0800 <Cliente>HELO GEDZAC <Server>250 mc9-f28.hotmail.com Hello [200.60.220.160] <Cliente>MAIL FROM:<remitente@hotmail.com> <Server>250 remitente@hotmail.com....Sender OK <Cliente>RCPT TO:<destinatario@hotmail.com> <Server>250 remitente@hotmail.com <Cliente>DATA <Server>354 Start mail input; end with <CRLF>.<CRLF> <Cliente>Contenido Del Mail <Cliente>. <Server>250 <MC9-F285D4ZI06wfpEl00019476@mc9-f28.hotmail.com> Queued mail for delivery <Cliente>QUIT <Server>221 mc9-f28.hotmail.com Service closing transmission channel Ahora vamos a explicar más o menos lo que significa esto, observese que lo que nos interesa de las respuestas del Server son los 3 primeros numeros que representan diferentes mensajes, lo demas se obvia. Al conectar el <Server> debe dar un 220 que indica que el servicio de correo esta disponible. Luego <Cliente> osea nosotros o nuestro worm envia el comando HELO a forma de saludo y de inicio de las operaciones, la sintaxis es: HELO Cualquier-Cosa Y <Server> debe responder un 250 que significa operacion completada con exito. Luego <Cliente> envia el comando Mail From que indica el remitente del correo que se va a enviar (Ver Nota 1) ,cuya sintaxis es: Mail From:<remitente@dominio.com> Y <Server> debe enviar un 250 Luego <Cliente> envia el comando Rcpt To que indica el destinatario del correo que se va a enviar (Ver Nota 1) ,cuya sintaxis es: Rcpt to:<destinatario@dominio.com> Si hay varios destinatarios se puede enviar rcpt to: con las direcciones separadas por comas: Rcpt to:destinatario1@dominio.com, destinatario2@dominio.com, destinatario3@dominio.com Pero por ejemplo el server de hotmail no me deja usar esa sintaxis y hay que pasarle varios campos rcpt to: Rcpt to:<destinatario1@dominio.com> -250 OK Rcpt to:<destinatario2@dominio.com> -250 OK Rcpt to:<destinatario3@dominio.com> -250 OK Osea que seria cosa de ver que acepta el server al que te vas a conectar. Y <Server> debe enviar un 250 Nota 1: -------------- Varios server smtp comprueban que la direccion en campo mail from: sea valida osea que si ponemos mail from:<noexiste@dominio.com> dara error y tambien comprueban que la direccion del campo rcpt to: sea valida Otra cosa es que la gran mayoria de servers no dejaran enviar un correo fuera de su dominio osea que si conecto al smtp de hotmail: Mail from:<remitente@hotmail.com> -250 OK Rcpt to:<destinatario@OtroDominio.com> -501 invalid address El server da error porque el dominio del destinatario no es hotmail.com aun hay servers que no comprueban ambos o uno de estos campos y que permiten enviar mails fuera de su dominio, a eso se le llama permitir relay y son buenos pa los virus y el spam ya se imaginaran porque. Porque de un server que permita relay podemos enviar el virus a cualquier dominio sin estar restringidos al dominio del server que conectamos. ----------------- Fin Nota 1 Luego el <Cliente> envia el comando Data el cual le dice al server que todo lo que se envie a continuacion seran datos del contenido del correo. <Server> responde 354 para indicar que acepta el comando Luego <Cliente> envia todos los datos que forman el contenido del correo que va a llegar a destinatario y para indicar al server que termino de enviar datos, envia en una linea sola un . (Punto) Y <Server> envia 250 para indicar exito en la operacion. Luego si vamos a enviar más correos, repetimos los pasos a partir de mail from o sino <Cliente> envia el comando Quit para indicar que termina conexion. Y <Server> envia 221 para indicar que la conexion se cerro con exito. vale decir que cualquier mensage que empice con 5?? o 4?? es error. Para otros comandos smtp y cosas más tecnicas, consultar: http://www.google.com ->Buscar "Protocolo Smtp" http://www.septeto.com/documentos/smtp.html http://usuarios.lycos.es/nachos/8_3.htm http://www.windowstimag.com/atrasados/1998/23_sept98/suplemento/smtp_1.htm http://www.osmosislatina.com/soporte/servidor_mail.htm Ahora que entendemos más o menos el protocolo smtp, pos ya podemos enviar un mensage de texto desde telnet, pero para enviar el worm tenemos que enviar un adjunto, pa eso el mensage que vamos a enviar debe ir en Formato MIME y el adjunto codificado en Base 64. Que ser MIME?: http://www.zator.com/Internet/N_16.htm Que ser base64?: http://foro.elhacker.net/index.php/topic,9039.0.html Base64 es un tipo de codificacion que utiliza una tabla de 64 caracteres ASCII permitiendo 6 bits para cada caracter. Para pasar un binario a b64 en este caso nuestro virus, se lee el binario de 6 en 6 bits y segun el valor de esos 6 bits se asigna un caracter de la tabla b64 Valor Caracter Tabla equivalente B64 en tabla B64 Valor ASCII 0 A 65 1 B 66 2 C 67 3 D 68 4 E 69 5 F 70 6 G 71 7 H 72 8 I 73 9 J 74 10 K 75 11 L 76 12 M 77 13 N 78 14 O 79 15 P 80 16 Q 81 17 R 82 18 S 83 19 T 84 20 U 85 21 V 86 22 W 87 23 X 88 24 Y 89 25 Z 90 26 a 97 27 b 98 28 c 99 29 d 100 30 e 101 31 f 102 32 g 103 33 h 104 34 i 105 35 j 106 36 k 107 37 l 108 38 m 109 39 n 110 40 o 111 41 p 112 42 q 113 43 r 114 44 s 115 45 t 116 46 u 117 47 v 118 48 w 119 49 x 120 50 y 121 51 z 122 52 0 48 53 1 49 54 2 50 55 3 51 56 4 52 57 5 53 58 6 54 59 7 55 60 8 56 61 9 57 62 + 43 63 / 47 Para ver un mensaje en formato MIME(Multipurpose Internet Mail Extensions) abrimos nuestro Outlook Express y procedemos a dar los pasos para enviar un mail, colocamos un destinatario, asunto, texto del mensage, y adjuntamos un exe o zip cualquiera. Pero en vez de enviarlo vamos a Archivo->Guardar Como y lo guardamos con algun nombre, vemos que se a guardado un archivo con extencion .eml ahora a ese archivo le ponemos extencion .txt y lo miramos, vemos el msg formateado de una forma parecida a Propiedad: Valor Cada una de esas partes es una cabecera, vamos a explicar las que salen aqui: 'From: indica el remitente del mail, donde la parte entre comillas indica 'el nombre del remitente y lo que esta entre < > su correo, lo que veremos 'en nuestro cliente de correo o en la bandeja de entrada sera 'NombreRemitente, en el campo from se puede poner cualquier cosa valida 'ya sea Osama@Al-Qaida.com o Bush@MalditoAsesino.com o lo que se nos de la 'gana From: "NombreRemitente" <Remitente@dominio.com> 'En la cabecera To: va entre comillas el correo a quien va dirigido el mail To: "Destinatario@dominio.com" 'Aqui va el Asunto Subject: Asunto 'Fecha DATE: Sáb, 04 Dic 2004 12:53:22 'Version Mime que tamos usando MIME-Version: 1.0 'Naturaleza del cuerpo del mensaje (Tipo/Subtipo) 'multipart/mixed -> mensaje formado por varias partes independientes en el 'orden especificado 'lo especificado en la parte boundary actua como un delimitador de las 'partes del msg, y puede ser "Mi_Limite" o cualquier cadena de caracteres Content-Type: multipart/mixed; boundary="----=_NextPart_000_0002_01BD22EE.C1291DA0" 'Identifican la prioridad del correo donde 1 es alta, 3 normal, 5 baja X-Priority: 3 X-MSMail - Priority: Normal 'El programa desde el que se envio el correo, en este caso outlook 'express (OE), cabecera bastante opcional, se le podria dar el valor de: 'Produced By My Worm v1.0 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 'Esto lo incluye el OE en el msg Esto es un mensaje multiparte en formato MIME 'delimitador ------=_NextPart_000_0002_01BD22EE.C1291DA0 'Esto indica que el msg esta en texto plano, si queremos enviar en html 'ponemos text/html 'la parte de charset es para indicar el tipo de codificacion para mostrar 'caracteres "raros", osea raros al idioma ingles como la ń o los acentos 'x-user-defined indica usar la codificacion definida por el user o se 'puede usar iso-8859-1 o iso-8859-3 ,pero esto no es importante para nuestro 'fin Content-Type: text/plain; charset="x-user-defined" 'El tipo de codificacion del msg es de 8bit (lineas cortas) 'aqui tambien podria ser: quoted-printable(mayoria de caracteres son 'imprimibles) Content-Transfer-Encoding: 8bit bla bla bla......12345 Contenido del Mensaje bla bla...... 'delimitador ------=_NextPart_000_0002_01BD22EE.C1291DA0 'Indica el tipo Mime del adjunto para un .jpg sera: image/jpeg 'para un .htm: text/html ,etc para enviar un .exe .scr .pif .bat .com o .zip 'colocamos application/octet-stream ,en el OE 5.5 era donde sucedia algo 'interesante cuando se adjuntaba un .exe y se indicaba un tipo mime de un '.wav, el OE ejecutaba el exe al ver el msg. 'en la parte Name= va entre comillas el nombre del adjunto Content-Type: application/octet-stream; Name="Adjunto.zip" 'indica que el archivo va como 'attachment' osea adjunto, en otros casos, 'como el protocolo http esta propiedad podria ponerse a inline, para 'ver el contenido en linea. 'En la parte filename= va otra vez entre comillas el nombre del adjunto Content-Disposition: attachment; filename="Adjunto.zip" 'Indica que el adjunto esta codificado en Base64 Content-Transfer-Encoding: base64 'El archivo adjunto codificado en base64 UEsDBBQAAAAIAHK1ZjDlylNM0ggAAN8hAAALAAAATW9kdWxlMS5iYXPVWf9v2sgS/z1S /odV9BSZ99wKaHOvispJBEiLjkAENLmTnmQZewH3jE29BkL/+pvZL95dYxLS093pWVFi z87OfHZ2dr5s2nmeRbNNTsnDjTf0V5S0yMVdGm5i2rg4P7vfzOIoIF0axH5Gye0mCfIo TUg/yWmW0PwTzTtpktAgp+Ek90HMIJqRi12URDD6NozjC+Lc7Md0TvrrcHcb+wtG2owM ...................Adjunto en Base 64............................... OqwBAACuAgAADQAAAAAAAAABACAAtoHlJAAAUHJveWVjdG8xLnZicFBLBQYAAAAAAwAD AKsAAAC8JgAAAAA= 'delimitador ------=_NextPart_000_0002_01BD22EE.C1291DA0-- Entonces lo que debe hacer el worm es conectar al puerto 25 del server poder responder segun las respuestas del servidor, y crear un mensage en mime con el virus, para enviarlo. El code explicado esta en smtp.zip (C) GEDZAC LABS - Mitosis Ezine 3