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