Curiosity is insubordination in its purest form. -Vladimir Nabokov

miércoles, 27 de octubre de 2010

Hablando SMTP AUTH desde la shell y falseando nuestra IP en cabeceras

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.org
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: <xxx.yyy@gmail.com>
250 2.1.0 OK o43sm5440941weq.23
rcpt to: <zzz@vlan7.org>
250 2.1.5 OK o43sm5440941weq.23
data
354  Go ahead o43sm5440941weq.23
From: vlan7 <xxx.yyy@gmail.com>
To: vlan7 <zzz@vlan7.org>
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 que no comienzan con ningun digito 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 /<name>/; 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 :)
Ricemos el rizo, enviemos ahora un mail de forma cifrada tambien, pero saliendo con una IP de TOR. Necesitaremos algo que soporte SOCKS. socat es bello, stunnel tambien pero existe una herramienta minimalista escrita en python que se lleva mejor con TOR: sslredir

¿Para que sirve sslredir? Para redireccionar conexiones no SSL hacia conexiones SSL, todo ello a traves de un proxy SOCKS, en nuestro caso: TOR.

Basicamente lo que haremos sera iniciar un circuito TOR, poner a sslredir a la escucha en un puerto, nos conectaremos por telnet al servidor proxy SOCKS TOR que tenemos en localhost, y sslredir se encargara de reenviarlo a smtp.gmail.com:465

Empecemos mostrando info acerca del certificado SSL de smtp.gmail.com
vlan7@sid7:~$ sslredir -i smtp.gmail.com:465
[Sat Oct 30 01:59:25 2010] Using '/usr/share/ncat/ca-bundle.crt' for certificate verification
[Sat Oct 30 01:59:26 2010] Connection to smtp.gmail.com:465 established
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 14:cb:34:9d:00:03:00:00:12:8e
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=Google Inc, CN=Google Internet Authority
Validity
Not Before: Apr 22 20:02:45 2010 GMT
Not After : Apr 22 20:12:45 2011 GMT
Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=smtp.gmail.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:cf:80:78:e8:d1:b6:97:80:64:0d:d7:1c:75:d0:
2e:b8:eb:2c:43:86:71:08:7a:32:8f:e1:2b:76:51:
2a:66:ea:d5:0a:81:90:cc:09:21:65:39:33:1e:b9:
88:81:89:8c:ea:ba:13:6e:41:7f:cc:46:9a:d9:13:
9e:f6:ce:15:a0:be:0e:81:49:e8:c8:1d:2e:d4:a6:
f0:ac:6e:4f:1c:16:ec:31:d9:34:af:a8:cc:9a:18:
7e:30:e4:45:55:88:10:ac:5c:49:9e:ef:06:9c:78:
86:5b:84:21:98:a5:72:b6:ed:05:72:56:04:f8:5d:
60:38:ec:79:a8:88:13:54:23
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
B5:F8:A2:A6:C1:DC:6D:92:92:A4:26:0B:F0:85:9C:ED:A9:ED:2E:B3
X509v3 Authority Key Identifier:
keyid:BF:C0:30:EB:F5:43:11:3E:67:BA:9E:91:FB:FC:6A:DA:E3:6B:12:24
X509v3 CRL Distribution Points:
URI:http://www.gstatic.com/GoogleInternetAuthority/GoogleInternetAuthority.crl
Authority Information Access:
CA Issuers - URI:http://www.gstatic.com/GoogleInternetAuthority/GoogleInternetAuthority.crt1.3.6.1.4.1.311.20.2:
...W.e.b.S.e.r.v.e.r
Signature Algorithm: sha1WithRSAEncryption
51:cd:fd:63:6d:ae:70:0d:8d:e2:69:83:74:f3:02:f0:32:9b:
ad:11:a5:18:ca:42:db:de:26:7e:1d:f2:0a:42:5a:61:15:a3:
a1:d1:50:4a:00:ad:17:22:a1:4d:9f:6b:a0:5a:52:10:bd:03:
e1:0c:40:b4:b4:b0:b4:2d:1b:49:a4:95:ba:c7:c0:5b:7f:c2:
16:01:bf:0b:26:bb:db:88:9c:f5:4a:04:a2:ca:06:f0:22:be:
78:6a:06:42:e1:2c:67:4c:51:f3:a2:79:8c:eb:36:1f:ee:10:
3c:71:42:9f:9f:78:57:b6:72:4b:37:5e:42:2f:77:61:5d:f5:
44:11
CA Signature Verified: True
Certificate fingerprint: 1a6f488fbe5bfd92d81230f922ce8449b343bd2c
vlan7@sid7:~$
Volvamos a verificarlo pero esta vez a traves de TOR y mostrando solo las dos ultimas lineas, que es lo que nos interesa.
vlan7@sid7:~$ sslredir -i -s 127.0.0.1:9050 smtp.gmail.com:465 |tail -n 2
CA Signature Verified: True
Certificate fingerprint: 1a6f488fbe5bfd92d81230f922ce8449b343bd2c
Parece todo correcto. Para terminar vamos a hacerlo demonio enviandolo al background. Escuchara en el puerto 7777 y reenviara el trafico que reciba por ese puerto a smtp.gmail.com:465 mediante SSL a traves del proxy SOCKS que tenemos gracias a TOR.
vlan7@sid7:~$ sslredir -dnl 7777 -s 127.0.0.1:9050 -f 1a6f488fbe5bfd92d81230f922ce8449b343bd2c smtp.gmail.com:465
Comprobamos que lo tenemos escuchando en el puerto 7777.

vlan7@sid7:~$ netstat -tunlp |grep :7777
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:7777          0.0.0.0:*
LISTEN      19618/python
OK, enviemos ahora un correo de la misma forma que vimos en la primera parte, pero esta vez a traves de sslredir
vlan7@sid7:~$ telnet 127.0.0.1 7777
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mx.google.com ESMTP x65sm1999579weq.1
ehlo vlan7.org
250-mx.google.com at your service, [83.170.92.9]
250-SIZE 35651584
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 PIPELINING
AUTH PLAIN AFhYWC5ZWVlAZ21haWwuY29tAHBhc3N3b3Jk
235 2.7.0 Accepted
mail from: <XXX.YYY@gmail.com>
250 2.1.0 OK x65sm1999579weq.1
rcpt to: <ZZZ@vlan7.org>
250 2.1.5 OK x65sm1999579weq.1
data
354  Go ahead x65sm1999579weq.1
From: vlan7 <XXX.YYY@gmail.com>
To: vlan7 <ZZZ@vlan7.org>
Subject: This is a test
hola vlan7 que tal
.
250 2.0.0 OK 1288395385 x65sm1999579weq.1
quit
221 2.0.0 closing connection x65sm1999579weq.1
Connection closed by foreign host.
vlan7@sid7:~$
Destaquemos la linea siguiente, donde google se nos presenta de forma muy educada y nos llama por nuestra IP.

250-mx.google.com at your service, [83.170.92.9]

Si examinamos las cabeceras completas de nuestro correo, podremos ver que el correo se ha recibido desde la IP 83.170.92.9 , que deberia ser nuestro nodo TOR de salida. Comprobemoslo.
[cut]
Received: from vlan7 (server51262.uk2net.com [83.170.92.9])
by mx.google.com with ESMTPS id x65sm1999579weq.1.2010.10.29.16.35.27
(version=SSLv3 cipher=OTHER);
Fri, 29 Oct 2010 16:36:24 -0700 (PDT)
Message-ID: <4ccb5a78.57edd80a.1dfc.ffff827a@mx.google.com>
Date: Fri, 29 Oct 2010 16:36:24 -0700 (PDT)
From: vlan7 <xxx.yyy@gmail.com><>xxx.yyy@gmail.com<
To: vlan7 <zzz@vlan7.org><zzz@vlan7.org>
[cut]
Ahi esta. Hagamos una ultima comprobacion. Mostremos nuestra IP publica "torificando" a curl mediante torsocks
vlan7@sid7:~$ sudo torsocks curl ifconfig.me
83.170.92.9
vlan7@sid7:~$
Ahi esta el resultado esperado, ambas IPs coinciden :)

Have fun!
Referencias:

Related Posts by Categories