in How to

Sending Email via Gmail SMTP Server using OpenSSL

gmail-logo2

Artikel ini bukan tentang bagaimana memakai Outlook, Thunderbird dan email client lainnya, bukan itu. Di sini saya akan menjelaskan bagaimana email dikirimkan ke tujuan melalui SMTP server Gmail secara anonymous maupun authenticated dengan menggunakan OpenSSL. Ini adalah penjelasan apa yang sebenarnya terjadi dibalik layar ketika outlook dan email client lainnya mengirim email melalui smtp server gmail.

Anonymous vs Authenticated Sending

Email bisa dikirimkan melalui smtp server secara anonymous maupun authenticated. Kalau kita mengirim email secara anonymous memakai smtp server milik gmail, maka email tujuan tidak bisa dari domain lain, harus dari domain yang sama atau domain lain yang masuk dalam jaringan google apps. Bila smtp server gmail mengijinkan pengiriman email ke lain domain secara anonymous itu berarti smtp server gmail bersifat open relay, karena dia bersedia menjadi titik relay pengiriman email ke domain lain. Saat ini jarang sekali ada smtp server yang open relay karena dia akan menjadi sasaran spammer mengirimkan email spamnya ke domain lain.

Jadi bila kita ingin mengirim email ke domain lain (di luar google network), mau tidak mau harus secara authenticated yaitu dengan memasukkan username dan password terlebih dahulu. Dengan memasukkan username dan password, kini gmail bersedia menjadi titik relay pengiriman email ke manapun. Mirip dengan ketika kita login ke webmail gmail dengan sebelumnya memasukkan username dan password. Setelah login, selanjutnya kita bisa mengirimkan email ke manapun juga.

Sending Anonymously

Sebelum masuk ke pembahasan pengiriman email authenticated dengan SSL (smtps), saya akan memulai dengan mengirim email secara anonymous dengan smtp biasa. Pertama saya harus tahu dulu smtp server yang akan saya gunakan. Untuk itu saya harus mencari MX record dari domain gmail.com. Dengan perintah dig saya bisa mengetahui bahwa MX record untuk gmail.com adalah:

Ada banyak mail server untuk domain gmail.com, silakan pilih yang mana saja. Dalam contoh ini saya memakai gmail-smtp-in.l.google.com. Selanjutnya saya akan mengirim email dari dan ke rizki.wicaksono a.t. gmail.com. Saya akan membuat koneksi ke smtp server tersebut pada port 25 dan mengirimkan perintah smtp. Maaf alamat email saya ubah menjadi rizki.wicaksono .a.t. gmail.com agar tidak jadi sasaran spam, seharusnya dalam format email yang benar dengan karakter @.

Perintah SMTP yang saya kirimkan sederhana sekali, diawali dengan EHLO sebagai salam pembuka. Kemudian diikuti dengan MAIL FROM, untuk mengisi alamat email asal yang harus diapit dengan karakter < dan >. Setelah itu baru masukkan email tujuan dengan perintah RCPT TO (juga harus diapit dengan karater < dan >). Setelah itu perintah berikutnya adalah DATA. Dengan mengirimkan perintah data ini, maka saya bisa mulai menuliskan Subject dan body email, hingga diakhiri dengan karakter DOT dalam satu baris sendiri.

Mari kita lihat email yang diterima dalam format header lengkap berikut ini:

Pada header Received terlihat bahwa email pertama diterima oleh smtp server mx.google.com (ini hostname alias dari gmail-smtp-in.l.google.com). Kemudian smtp server ini merelay email ini ke smtp server lain, yaitu 10.110.92.8, dan akhirnya dari sana di-relay lagi ke smtp server terakhir yaitu 10.115.106.13. Smtp server 10.115.106.13 tersebut adalah smtp server yang terdekat dengan inbox user sehingga tidak perlu lagi di-relay.

Sending via SMTP-Secure (SMTP over SSL)

Kelemahan dari pengiriman email secara anonymous yang saya tunjukkan di atas adalah tidak bisa dipakai untuk mengirim email ke lain domain. Karena smtp server gmail tidak rela dijadikan titik relay pengiriman email ke domain lain. Yang dimaksud dengan domain lain adalah domain selain gmail.com dan domain lain yang tergabung dalam google apps network. Jadi kalau anda mempunyai email dengan domain sendiri di google apps, anda bisa memakai smtp server ini.

Saya akan mencoba mengirim email ke rizki.a.t.ilmuhacking.com dengan menggunakan smtp server gmail. Perhatikan bahwa saya bisa saja langsung menggunakan smtp server ilmuhacking.com untuk mengirim email ke ilmuhacking.com, namun dalam artikel ini saya akan menunjukkan pengiriman email dari smtp server gmail. Gmail mempunyai smtp server sendiri yang berbeda dengan smtp server dalam daftar MX record DNS. SMTP server ini berlokasi di smtp.gmail.com. Pengiriman email dengan smtp server ini harus dengan smtp secure, yaitu smtp over SSL pada port 465. Mirip dengan http secure (http over SSL), pengiriman email dengan smtps aman dari sniffing password dan serangan man-in-the-middle.

Oke, langsung saja ya. Saya gunakan perintah openssl command line berikut di Linux:

Perintah tersebut adalah untuk membuka koneksi SSL ke smtp.gmail.com pada port 465. Opsi -crlf ini sangat penting karena tanpa opsi ini gmail akan diam seribu bahasa ketika kita selesai menulis body email dengan perintah DOT sebab ternyata gmail hanya mau menerima line feed dalam bentuk CRLF (0x0D+0x0A). Opsi -CAfile menunjukkan lokasi trusted Certificate Authority yang kita miliki untuk memverfifikasi sertifikat yang dimiliki server apakah valid atau tidak.

Setelah perintah ini dijalankan, maka openSSL akan menangani segala komunikasi yang terjadi di layer SSL, mulai dari negosiasi hubungan sampai mengakhiri hubungan. Berikut ini adalah tampilan setelah perintah itu dijalankan.

Dari situ terlihat bahwa gmail menggunakan sertifikat yang diterbitkan oleh Thawte, algoritma cipher yang dipakai adalah RC4 128 bit, yang merupakan algoritma stream cipher. Pada baris terakhir terlihat “220 mx.google.com ESMTP” yang menunjukkan bahwa itu adalah pesan yang dikirim dari layer smtp dan pengguna kini siap berkomunikasi di layer SMTP. Selanjutnya saya harus memasukkan perintah smtp seperti biasa, tidak ada bedanya dengan perintah smtp pada pengiriman email secara anonymous sebelumnya karena ini adalah pada layer SMTP, layer SSL semua sudah ditangani oleh OpenSSL. Namun tidak seperti sebelumnya, kali ini saya harus memasukkan perintah untuk authentication dengan perintah AUTH LOGIN. Berikut adalah perintah smtp yang dikirimkan untuk melakukan authentication.

Seperti biasa saya mengawali dengan mengucapkan salam, dengan perintah EHLO. Setelah itu saya mengirimkan perintah AUTH LOGIN. Jawaban dari perintah AUTH LOGIN adalah “VXNlcm5hbWU6” yang merupakan format base64 dari “Username:”. Kemudian saya menjawab dengan mengirimkan “cml6a2kud2ljYWtzb25vQGdtYWlsLmNvbQ==” yang merupakan format base64 dari username saya yaitu rizki.wicaksono.a.t.gmail.com (karakter @ saya ganti .a.t.). Gmail menjawab dengan “UGFzc3dvcmQ6” yang merupakan format base64 dari “Password:”. Saya harus menjawab dengan password saya dalam format base64 encoded. Bila authentication berhasil maka gmail akan menjawab dengan “235 2.7.0 Accepted”.

Setelah authentication berhasil saya bisa mulai mengirimkan email asal dan tujuan dengan perintah mail from dan rcpt to, sama seperti pada contoh pengiriman secara anonymous. Email tujuan saya kirim ke rizki.a.t.ilmuhacking.com.

perintah RCPT harus dikirim dalam huruf kecil “rcpt” sebab huruf kapital “R” dalam openSSL adalah perintah khusus untuk melakukan RENEGOTIATION.

Setelah memasukkan email asal dan tujuan, saya harus mengirimkan perintah DATA untuk mulai menulis isi emailnya. Kemudian gmail menjawab dengan “354 Go ahead a14sm120617tia.27”, itu artinya lampu hijau buat saya untuk memasukkan isi pesannya.

Perintah DATA harus diakhiri dengan sebuah karakter dot pada satu baris sendiri. Kalau dalam binary hexa: 0x0D0A2E0D0A, atau dengan kata lain karakter DOT (hex 2E), diapit dengan CRLF. Inilah gunanya opsi -crlf, tanpa ada opsi -crlf, maka openSSL hanya akan mengirim 0x0A2E0A, atau karakter DOT diapi dengan LF. Pada beberapa smtp server LF saja tidak masalah, namun untuk server lain seperti gmail harus lengkap yaitu CRLF. Tanpa opsi -crlf gmail tidak akan bereaksi apa-apa walaupun sudah diberikan perintah DOT karena gmail menganggap perintah DATA belum selesai karena gmail merasa belum menemukan “[CR][LF][.][CR][LF]” .

Setelah mengirim “CRLF.CRLF”, gmail membalas dengan “250 2.0.0 OK 1236757718 a14sm120617tia.27”. Itu artinya email kita telah diterima oleh smtp server untuk disampaikan pada yang berhak menerima. String “a14sm120617tia.27” adalah ESMTP ID yang akan muncul pada header “Received” nantinya. Setelah itu koneksi SSL harus diputus dengan perintah QUIT.

Email Full Header

Sekarang saya akan tunjukkan email yang diterima oleh rizki.a.t.ilmuhacking.com beserta header lengkapnya.

Untuk menelusuri email selalu dimulai dari header Received paling bawah kemudian naik ke atas. Header Received yang paling bawah menunjukkan bahwa email dikirimkan oleh IP 202.43.x.x melalui smtp server mx.google.com. Informasi lain dari header itu adalah email dikirimkan dengan SSL versi 3 dan cipher RC4-MD5. ESMTP id adalah gabungan dari id yang didapatkan wahtu saya terkoneksi ke smtp server gmail “a14sm120617tia” dengan tanggal dan jam.

Setelah itu email direlay ke smtp server 10.110.3.15. Dari situ masih di-relay lagi ke smtp server ti-out-0910.google.com, yang merupakan smtp server yang berada di ujung luar jaringan google. Smtp ini seperti sebuah gateway untuk email yang ditujukan ke domain di luar jaringan google. Dari smtp itu email direlay ke luar jaringan google melalui smtp server gator669.hostgator.com. Google mengetahui alamat smtp ilmuhacking dengan cara query MX record dari DNS. Berdasarkan MX record DNS, smtp server untuk domain ilmuhacking.com ada di ilmuhacking.com. Kalau MX servernya adalah ilmuhacking.com, kenapa kok disebut di header sebagai gator669.hostgator.com? Perhatikan apa yang dikirimkan oleh server ketika saya telnet ke MX server untuk ilmuhacking port 25.

Dari jawaban server, terlihat jelas bahwa server menyebut dirinya dengan gator669.hostgator.com. Dari header email tidak ada lagi Received header setelah email direlay melalui gator669 ini. Artinya smtp server itu adalah yang paling dekat dengan email tujuan (memang smtp server itu berada di host yang sama dengan ilmuhacking, jadi email account berada di localhost).

Sending via Gmail Webmail

Mengirim email dengan webmail gmail lebih anonoymous daripada dengan email client karena IP address pengirim email akan tersembunyi

Sebagai pembanding saya ingin menunjukkan bedanya mengirim email menggunakan email client seperti outlook dengan mengirim email menggunakan webmail gmail.com. Mengirim email dengan webmail gmail lebih anonymous sebab ip address pengirim email akan tersembunyi dan tidak akan muncul di header email penerima. Jadi ketika penerima membaca headernya tidak akan bisa mengetahui pengirim email berasal dari IP berapa.

Baiklah mari kita coba mengirim email ke rizki.a.t.ilmuhacking.com dari gmail saya. Berikut adalah header email yang saya dapatkan di email saya @ilmuhacking.com.

Perhtaikan bahwa header Received yang paling bawah tidak menunjukkan ip address pengirimnya. Email pertama kali diterima oleh smtp server yang ip addressnya 10.220.46.147. Itu adalah ip adderss private, di jaringan internal gmail. Karena email dikirim dari webmail gmail sehingga email langsung diterima oleh server internal gmail. Dengan begini ip address pengirim tidak akan bisa diketahui oleh penerima email.

Comparison Regular SMTP vs SMTP over SSL vs Webmail

Oke, saya sudah tunjukkan 3 cara mengirim email melalui Gmail. Masing-masing ada kelemahan dan kelebihannya. Di bawah ini adalah tabel yang menunjukkan perbedaan dari ketiga cara tersebut dari sisi: ip address pengirim, apakah tersembunyi? apakah ada header DKIM-Signature? apakah untuk mengirim email harus login dulu? dan apakah bisa mengirim email ke domain di luar gmail.com?

  Sender Ip Address Hidden? Header DomainKey/DKIM-Signature? Must be Authenticated? Send to non-gmail domain?
Regular SMTP No No No No
SMTP over SSL No Yes Yes Yes
Webmail Yes Yes Yes Yes

Write a Comment

Comment

This site is using OpenAvatar based on

16 Comments

  1. kakak saya newbie masih anget nich ada banyak pertanyaan buat kakak
    1. apa perbedaan SLL dengan SMTP ?
    2. Apa dan kenapa kita harus tau MX record ?
    3. apa arti section 2 pd saat perintah dig dijalan kan ;;question ;;answer ;;authority ;;aditional saction
    4. kenapa saat telnet kita membuka port 25, apakah port 25 untuk service telnet kalau ya bnagaimana kalau service telnet nya di tutup
    5. apakah pada baris ;;answer section berikut “gmail.com. 2878 IN MX 5 gmail-smtp-in.l.google.com” yg mengandung unsur mx adalah merupakan server domian dari google?
    6. “-CAfile /etc/pki/tls/certs/ca-bu” apakah tempat penyimpanan file verifikasi untuk semua smtp server sama (misl:yahoo.com, plasa.com, dll)? jika tidak bagaimana kita mengetahuinya?
    7. dari mana kita tahu “Thawte” menggunakan algoritma cipher = RC4 128 bit, untuk server lain bagaimana?
    8. trus bagaimana saya tahu format base64 username n password saya tool apa yg harus gunakan?
    9. apakah saya dapat mengirim pesan tersebut lebih dari satu atau dengan kata lain bomb e-mail? kalau bisa tolong command nya apa?
    btw artikel disini keren2 maju terus kakak rizki trimakasih sekian dulu pertanyaan nya kebanyakan maklum newbie πŸ™‚

  2. @vmwmx
    banyak jg ya pertanyaannya πŸ˜€
    1. SSL (secure socket layer) dan SMTP (simple mail transport protocol). SSL protokol untuk menjamin keamanan pertukaran data dengan enkripsi. SMTP protokol untuk mengirim email.
    2. mx record adalah petunjuk smtp server untuk suatu domain. kalau kita mau kirim ke domain xxx.com, maka kita harus tahu dulu smtp server untuk xxx.com di mana? nah itulah guna mx record dalam dns.
    3.additional section menunjukkan IP address dari jawaban yg diberikan dns. perhatikan pada section lain jawabannya bukan berupa ip address. pada additional section inilah kita temukan ip addressnya.
    4. telnet itu nama program untuk membuka koneksi tcp seperti halnya netcat, port 25 adalah port standar utk smtp. kalau port 25 ditutup ya tidak bisa konek ke sana.
    5. iya, itu adalah MX server (smtp server) untuk domain gmail.com.
    6. CAfile adalah file berisi daftar trusted CA, berupa sertifikat yang mengandung public key masing-masing CA.
    7. di dalam sertifikat disebutkan algoritme cipher yang dipakai. coba klik gambar gembok yang biasanya di pojok kanan bawah, lalu lihat detil sertifikatnya.
    8. banyak base64 encoder online, silakan googling saja.
    9. kalau bisa kirim satu, tentu bisa juga kirim 1000 dengan cara mengulang prosedur yang sama sebanyak 1000x.
    kalau masih tdk mengerti japri saja ke rizki.a.t.ilmuhacking.com di sini spacenya terbatas, tdk bisa panjang2 ceritanya.

  3. kok ga bisa ya??
    pencerahannya dong..
    220 mx.google.com ESMTP y5si2478tia.17
    ehlo
    250-mx.google.com at your service, [125.160.108.148]
    250-SIZE 35651584
    250-8BITMIME
    250-ENHANCEDSTATUSCODES
    250 PIPELINING
    mail from:
    250 2.1.0 OK y5si2478tia.17
    rcpt to:
    502 5.5.1 Unrecognized command. y5si2478tia.17
    rcpt to:
    555 5.5.2 Syntax error. y5si2478tia.17
    rcpt to:
    250 2.1.5 OK y5si2478tia.17
    data
    354 Go ahead y5si2478tia.17
    testing..
    .
    550-5.7.1 [125.160.108.xxx] The IP you’re using to send mail is not authorized
    550-5.7.1 to send email directly to our servers. Please use the SMTP relay at
    550-5.7.1 your service provider instead. Learn more at http://mail.g
    550 5.7.1 oogle.com/support/bin/answer.py?answer=10336 y5si2478tia.17

  4. saya udah pake alamat gmail,, apa mungkin errornya disini..
    “The IP you’re using to send mail is not authorized”
    bukan itu yah? ato bgmna?

  5. salam kenal,
    sya ingin bertanya,
    apakah dengan cara ini FFsniff dapat digunakan?
    setahu saya FFsniff butuh open relay smtp server.
    tengkyu beri much atas jawabannya

  6. Salam kenal mas, artikelnya menarik sekali n sudah hampir cukup jelas, tapi berhubung saya masih newbie jadinya masih ada beberapa yang kurang paham,… πŸ™‚

    Yang mau saya tanyakan :
    “Opsi -CAfile menunjukkan lokasi trusted Certificate Authority yang kita miliki untuk memverfifikasi sertifikat yang dimiliki server apakah valid atau tidak.”
    Dimana kita bisa mendapatkan sertifikat ini, apakah tiap smtp server berbeda(misal : gmail, yahoo, aol, hotmail, dll) ?

    Untuk penggunaan openssl pada saat mau login seperti dibawah ini :

    auth login
    334 VXNlcm5hbWU6
    cml6a2kud2ljYWtzb25vQGdtYWlsLmNvbQ==
    334 UGFzc3dvcmQ6
    aW5pcGFzc3dvcmQ=
    235 2.7.0 Accepted

    Disini kita harus mengencode dulu username dan passwd kita, akan tetapi saya tidak bisa untuk mengcopy dari hasil encode ke dalam command console ini (untuk mempermudah penulisan), mungkinsaya yang tidak tau caranya, mungkin bisa dijelaskan ?
    Dengan openssl apa kita tidak bisa memberi parameter diawal untuk username dan passwordnya ?

    Sekian dulu. terima kasih banyak atas ilmu yang telah diberikan. πŸ™‚

  7. kk

    kan kita punya email dari yahoo.
    trus kita mau cari smtp kita dan pop3.
    trus host.

    tuh gmna si mohon pencerahannya maklum masih newbie panas