jueves, 28 de octubre de 2010

~Unix & Cisco & Hacks~ - Enviar un mail desde la shell usando nuestra cuenta gmail como relay


Para usar el comando AUTH, el cliente (nosotros) debe enviar al servidor la siguiente cadena codificada en Base64:

\000user@host.com\000password

\000 actua como separador.

Podemos conseguirlo con la siguiente linea de perl:

vlan7@sid7:~$ perl -MMIME::Base64 -e 'print encode_base64("\000XXX.YYY\@gmail.com\000password")'
AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk

Ahi tenemos nuestra cadena codificada en Base64. La necesitaremos mas adelante.

Diferencias entre TLS y SSL:

La principal diferencia es que en una comunicacion con un servidor SSL, la conexion SSL se establece antes incluso de que empiece la conversacion SMTP. No ocurre esto con TLS, en el cual openssl se conecta primero en texto plano, manda el comando STARTTLS, negocia el cifrado SSL y entonces es cuando realmente comienza la sesion cifrada.

En nuestro caso google usa SSL en smtp.gmail.com:465, por lo que nos comunicamos con el asi:

vlan7@sid7:~$ /usr/bin/openssl s_client -crlf -connect smtp.gmail.com:465
CONNECTED(00000003)
depth=1 /C=US/O=Google Inc/CN=Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
i:/C=US/O=Google Inc/CN=Google Internet Authority
1 s:/C=US/O=Google Inc/CN=Google Internet Authority
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDWzCCAsSgAwIBAgIKFMs0nQADAAASjjANBgkqhkiG9w0BAQUFADBGMQswCQYD
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
dGVybmV0IEF1dGhvcml0eTAeFw0xMDA0MjIyMDAyNDVaFw0xMTA0MjIyMDEyNDVa
MGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRcwFQYDVQQDEw5zbXRw
LmdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAz4B46NG2l4Bk
DdccddAuuOssQ4ZxCHoyj+ErdlEqZurVCoGQzAkhZTkzHrmIgYmM6roTbkF/zEaa
2ROe9s4VoL4OgUnoyB0u1KbwrG5PHBbsMdk0r6jMmhh+MORFVYgQrFxJnu8GnHiG
W4QhmKVytu0FclYE+F1gOOx5qIgTVCMCAwEAAaOCASwwggEoMB0GA1UdDgQWBBS1
+KKmwdxtkpKkJgvwhZztqe0uszAfBgNVHSMEGDAWgBS/wDDr9UMRPme6npH7/Gra
42sSJDBbBgNVHR8EVDBSMFCgTqBMhkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dv
b2dsZUludGVybmV0QXV0aG9yaXR5L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNy
bDBmBggrBgEFBQcBAQRaMFgwVgYIKwYBBQUHMAKGSmh0dHA6Ly93d3cuZ3N0YXRp
Yy5jb20vR29vZ2xlSW50ZXJuZXRBdXRob3JpdHkvR29vZ2xlSW50ZXJuZXRBdXRo
b3JpdHkuY3J0MCEGCSsGAQQBgjcUAgQUHhIAVwBlAGIAUwBlAHIAdgBlAHIwDQYJ
KoZIhvcNAQEFBQADgYEAUc39Y22ucA2N4mmDdPMC8DKbrRGlGMpC294mfh3yCkJa
YRWjodFQSgCtFyKhTZ9roFpSEL0D4QxAtLSwtC0bSaSVusfAW3/CFgG/Cya724ic
9UoEosoG8CK+eGoGQuEsZ0xR86J5jOs2H+4QPHFCn594V7ZySzdeQi93YV31RBE=
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority
---
No client certificate CA names sent
---
SSL handshake has read 1711 bytes and written 303 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: 6B1A39E3D377B24D4A123D2E5AE320A9E21DC976131C5FEB8E7318E74CA5E573
Session-ID-ctx:
Master-Key: FF0082173AEA36C9CB330B63DC9503F7D0031FD60203056C926A98B08B1DBAE517B8417A3958E8A5E0E9C3376D36D49F
Key-Arg : None
Start Time: 1288131594
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
220 mx.google.com ESMTP o43sm5440941weq.23
ehlo vlan7
250-mx.google.com at your service, [X.Y.Z.A]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250 ENHANCEDSTATUSCODES

Aqui vemos como acepta el comando AUTH PLAIN. Usemos la cadena codificada en Base64 que generamos al principio del texto:

AUTH PLAIN AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk
235 2.7.0 Accepted

Y a partir de aqui mantenemos una conversacion SMTP estandar.

mail from:
250 2.1.0 OK o43sm5440941weq.23
rcpt to:
250 2.1.5 OK o43sm5440941weq.23
data
354 Go ahead o43sm5440941weq.23
From: vlan7
To: vlan7
Subject: this is a test!

hola vlan7, como estas?
.
250 2.0.0 OK 1288131795 o43sm5440941weq.23
quit
221 2.0.0 closing connection o43sm5440941weq.23
read:errno=0
vlan7@sid7:~$

Las lineas en negrita son los comandos que enviamos al servidor, las respuestas del servidor, como es habitual comienzan con un numero que indica su codigo de respuesta.

Comprobamos desde la shell el correo no leido de gmail:

vlan7@sid7:~$ curl -u ZZZ@vlan7.org --silent "https://mail.google.com/mail/feed/atom" |perl -ne 'print "\t" if //; print "$2\n" if /<(title|name)>(.*)<\/\1>/;'
Enter host password for user 'ZZZ@vlan7.org':
Gmail - Inbox for ZZZ@vlan7.org
this is a test!
vlan7

[cut]

Como podemos observar ahi lo tenemos :)

Suerte,

Referencias:

No hay comentarios:

Publicar un comentario