Https (http over SSL) sebenarnya adalah protokol yang sangat aman, protokol ini menjamin keamanan data dari browser hingga web server. MITM attack (man in the middle) tidak bisa dilakukan terhadap https karena https memiliki fitur authentication sehingga attacker tidak bisa menyamar sebagai web server. Walaupun mitm attack tidak bisa dilakukan terhadap https, namun attacker tetap bisa menyerang user yang menggunakan http sebagai pintu masuk menuju https. Dalam artikel ini saya akan jelaskan tentang SSLStrip, sebuah tool yang dibuat oleh Moxie Marlinspike untuk melakukan serangan mitm terhadap pengguna situs yang dilindungi dengan https.
SSL is not vulnerable to MITM attack
MITM attack adalah serangan dimana attacker berada di tengah bebas mendengarkan dan mengubah percakapan antara dua pihak. Jadi dengan serangan MITM ini attacker tidak hanya pasif mendengarkan, tetapi juga aktif mengubah komunikasi yang terjadi. Sebagai contoh, pada percakapan antara Alice dan Bob, Charlie menjadi pihak yang ditengah melakukan MITM attack. Charlie tidak hanya bisa mendengarkan percakapan itu, namun juga bisa mengubah percakapannya. Ketika Alice berkata “Besok makan siang jam 7″, Charlie bisa mengubahnya menjadi “Besok makan siang dibatalkan” sehingga Bob mengira makan siang dengan Alice tidak jadi.
Kenapa MITM attack bisa terjadi? MITM attack bisa terjadi karena sebelum berkomunikasi kedua pihak tidak melakukan authentication. Authentication berguna untuk memastikan identitas pihak yang berkomunikasi, apakah saya sedang berbicara dengan orang yang benar, atau orang ke-3 (the person in the middle) ? Tanpa authentication Alice akan mengira sedang berbicara dengan Bob, sedangkan Bob juga mengira sedang berbicara dengan Alice, padahal bisa jadi sebenarnya Alice sedang berbicara dengan Charlie dan Bob juga sedang berbicara dengan Charlie, sehingga Charlie bertindak sebagai “the person in the middle”. Seharusnya sebelum Alice dan Bob berbicara, harus ada authentication, untuk memastikan “Who are you speaking with?”. Alice harus memastikan “Are you really Bob? Prove it!”, sedangkan Bob juga harus memastikan “Are you really Alice? Prove it!”.
SSL adalah protokol yang memiliki tingkat keamanan sangat tinggi. SSL tidak hanya mengatur tentang enkripsi, namun juga mengatur tentang authentication sehingga SSL tidak rentan terhadap serangan man in the middle. SSL menggunakan sertifikat yang memanfaatkan kunci publik dan kunci private sebagai cara untuk melakukan authentication. Dengan menggunakan sertifikat SSL ini, pengunjung web bisa yakin sedang berkomunikasi dengan web server yang benar, bukan attacker in the middle yang menyamar menjadi web server suatu situs.
Attacker yang mencoba menjadi “the person in the middle”, akan dengan mudah ketahuan karena attacker tidak bisa membuktikan identitasnya dengan sertifikat SSL yang sah. Sertifikat SSL yang sah haruslah ditandatangani oleh CA (certificate authority) yang dipercaya dan tersimpan dalam daftar trusted CA browser. Jadi bila attacker mencoba membuat sertifikat SSL sendiri, browser akan memberi peringatan keras pada pengunjung bahwa sertifikat SSL tidak bisa dipercaya dan pengunjung disarankan untuk membatalkan kunjungan karena beresiko terkena serangan mitm. Serangan mitm attack baru bisa berhasil bila pengunjung tetap bandel dan nekat untuk menggunakan sertifikat palsu tersebut. Bila ini yang terjadi, maka kesalahan ada pada pengguna, bukan kelemahan SSL sebagai protokol. Lebih detil tentang https silakan baca Understanding Https.
HTTPS vs HTTP, Trusted vs Untrusted
http adalah protokol yang tidak bisa dipercaya karena rentan terhadap serangan mitm. Sedangan http over SSL (https) adalah protokol yang bisa dipercaya karena protokol ini tidak rentan terhadap serangan mitm. Informasi yang dilihat pengunjung pada browser di sebuah page http sebenarnya tidak bisa dipercaya karena tidak ada jaminan integritas dan keontentikan data. Informasi tersebut kemungkinan sudah diubah di tengah jalan atau berasal dari sumber yang tidak otentik (orang lain). dan pengunjung tidak bisa melakukan verifikasi.
Sedangkan informasi yang dilihat pengunjung pada browser di sebuah halaman https bisa dipercaya karena DIJAMIN informasi yang diterima adalah sama dengan yang dikirim web server dan informasi tersebut juga DIJAMIN dikirim oleh web server yang benar. Dulu saya pernah menulis artikel tentang Trusted vs Untrusted klikBCA, yang menjelaskan tentang adanya dua subdomain yang berbeda, yang trusted menggunakan https dan yang untrusted menggunakan http.
HTTP as Gate to HTTPS
Jarang sekali orang mengunjungi situs dengan mengetikkan
[You must be registered and logged in to see this link.] bahkan
[You must be registered and logged in to see this link.] pun orang sudah malas. Kebanyakan orang langsung mengetikkan alamat situs yang ditujunya tanpa harus diawali dengan
[You must be registered and logged in to see this link.] atau
[You must be registered and logged in to see this link.] Secara default browser akan berasumsi bahwa pengunjung akan menggunakan protokol http, bukan https bila pengunjung tidak menyebutkan protokolnya.
Kebanyakan situs yang harus memakai https, memang dirancang untuk menerima request melalui http (port 80) atau https (port 443). Situs pada port 80 biasanya hanya dijadikan jembatan untuk menuju situs yang sebenarnya pada port 443. Bila pengunjung masuk melalui port 80, maka server akan memberikan link untuk menuju URL https, atau dengan memberikan response Redirect.
Jadi bisa disimpulkan bahwa sebagian besar pengunjung memasuki https dengan melalui http, dengan kata lain http sebagai gerbang menuju https. Metode peralihan dari situs http ke situs https ada beberapa cara, yaitu:
Memberikan link menuju URL https.
Memberikan response redirect ke URL https.
Menggunakan META tag auto refresh ke URL https.
Menggunakan javascript untuk load halaman https.
Attacking HTTP, not HTTPS
Sebelumnya sudah saya jelaskan bahwa https adalah protokol yang sangat secure sehingga tidak bisa diserang dengan serangan mitm. Namun mengingat kenyataan bahwa kebanyakan orang mengakses https melalui http, maka attacker memiliki peluang untuk menyerang ketika pengunjung masih berada dalam protokol http.
SSLStrip adalah tool untuk melakukan mitm attack pada protokol http (bukan HTTPS), dengan maksud untuk menyerang situs-situs yang dilindungi dengan https. SSLStrip sebagai “the person in the middle”, akan mencegah peralihan dari http ke https dengan secara aktif mengubah response dari server sehingga pengunjung akan tetap berada dalam protokol http.
Mari kita lihat beberapa cara peralihan dari http ke https, saya tambahkan cara SSLStrip mencegah peralihan itu:
Memberikan link menuju URL https: SSLStrip akan mengubah link berawalan https menjadi http. Sehingga yang muncul di browser korban bukan link ke https melainkan link ke http.
Memberikan response redirect ke URL https: SSLStrip akan mengubah header Location dari URL berawalan https menjadi http.
Menggunakan META tag auto refresh ke URL https: SSLStrip akan mengubah url https menjadi http.
Menggunakan javascript untuk load halaman https: SSLStrip akan mengubah url https menjadi http.
Untuk lebih jelasnya berikut adalah gambar yang menunjukkan salah satu cara kerja SSLStrip mencegah korban beralih dari http ke https.
[You must be registered and logged in to see this image.]Opening Bank Front Page
Pada gambar di atas korban mengakses web server bank dengan URL
[You must be registered and logged in to see this link.] Request tidak secara langsung dikirim ke web server, namun melalui SSLStrip dulu. SSLStrip meneruskan request tersebut ke web server. Kemudian web server menjawab dengan memberikan html berisi link ke URL
[You must be registered and logged in to see this link.] kepada SSLStrip. Sebelum response html diterima oleh browser, SSLStrip mengubah response tersebut dengan mengubah URL https menjadi http biasa sehingga HTML yang diterima di browser korban berisi link ke URL
[You must be registered and logged in to see this link.] bukan
[You must be registered and logged in to see this link.][You must be registered and logged in to see this image.]Opening login page
Korban mengklik link pada halaman yang muncul browsernya, tentu saja link ini bukan ke
[You must be registered and logged in to see this link.] melainkan ke
[You must be registered and logged in to see this link.] Dengan cara ini browser tetap dalam protokol http bukan dalam protokol https seperti seharusnya, dengan kata lain SSLStrip berhasil mencegah browser beralih ke protokol https. Request ke
[You must be registered and logged in to see this link.] tersebut dikirimkan ke SSLStrip. Kemudian SSLStrip tidak meneruskan request tersebut ke
[You must be registered and logged in to see this link.] melainkan membuat request baru ke
[You must be registered and logged in to see this link.] Kemudian web server mengirimkan response dari response tersebut ke SSLStrip. Seperti biasanya SSLStrip akan mengubah response dari server tersebut untuk mencegah peralihan ke https. Response yang telah diubah ini kemudian dikirimkan ke browser korban sehingga korban tetap melihat halaman yang sama persis seperti ketika dia membuka
[You must be registered and logged in to see this link.] Dengan tampilan yang sama persis ini, korban mengira sedang membuka
[You must be registered and logged in to see this link.] padahal sebenarnya dia sedang membuka
[You must be registered and logged in to see this link.] Perhatikan bahwa koneksi antara browser dengan SSLStrip adalah dalam http biasa, sedangkan dari SSLStrip ke web server dalam https.
[You must be registered and logged in to see this image.]submit username and password
Setelah muncul halaman login dan korban mengira sedang membuka
[You must be registered and logged in to see this link.] kemudian korban memasukkan username dan password dan mengklik tombol Login. Browser akan membuat POST request ke
[You must be registered and logged in to see this link.] yang diterima oleh SSLStrip. Karena protokolnya adalah http, maka SSLStrip dengan mudah bisa membaca username dan password yang dimasukkan korban. SSLStrip kemudian akan mengirimkan username dan password korban degan POST request ke
[You must be registered and logged in to see this link.] Seperti biasa jawaban dari webserver akan dimodifikasi dulu seperlunya oleh SSLStrip sebelum dikirimkan ke browser korban.
Perhatikan bahwa korban sejak awal hingga login mengakses situs dengan http, sedangkan SSLStrip di tengah-tengah membuat koneksi https ke web server yang sebenarnya. Jadi walaupun browser mengakses dengan http, namun response yang diterima browser berasal dari koneksi https yang dibuat oleh SSLStrip.
Case Study: Mandiri Internet Banking
Mari kita coba trik di atas dengan contoh kasus pada situs internet banking Mandiri. Karena ini hanya contoh, saya tidak menggunakan teknik ARP Spoofing untuk melakukan MITM attack yang sesungguhnya. Saya sengaja mengubah setting browser saya agar menggunakan proxy, yaitu SSLStrip. Dalam website SSLStrip, disebutkan seharusnya cara untuk melakukan MITM attack dengan SSLStrip adalah:
Setting komputer agar bisa melakukan forwarding paket
Setting iptables untuk mengarahkan traffic HTTP ke SSLStrip
Jalankan SSLStrip
Gunakan ARPSpoof untuk meyakinkan jaringan bahwa traffic harus dikirimkan melalui komputer yang menjalankan SSLStrip.
Dalam contoh ini saya tidak melakukan ARPSpoofing, namun saya menggunakan SSLStrip sebagai proxy yang saya setting dalam browser saya. Sehingga setiap traffic http yang dilakukan browser saya akan dikirimkan melalui SSLStrip sebagai man in the middle.
Saya menjalankan SSLStrip di linux dengan IP address 192.168.0.10. Cara menjalankannya mudah sekali, cukup jalankan perintah: python sslstrip.py -l portnumber . Kemudian pada browser saya setting untuk menggunakan proxy 192.168.0.10 dan port sesuai dengan port sslstrip. Untuk lebih jelasnya, perhatikan gambar di bawah ini:
[You must be registered and logged in to see this image.]setting up SSLStrip as proxy in IE
Setelah semuanya siap, mari kita coba melakukan serangan mitm. Pada skenario ini, korban akan login ke Mandiri IB tidak dengan mengetikkan
[You must be registered and logged in to see this link.] karena korban hanya hafal bankmandiri.co.id saja maka korban langsung mengetikkan bankmandiri.co.id (tanpa diawali www atau
[You must be registered and logged in to see this link.] Secara default browser akan menganggap korban menghendaki koneksi dengan protokol http, bukan https. Request http tersebut dikirimkan melalui SSLStrip sebagai man in the middle, dan berikut adalah response yang diterima di browser korban. Sebagai pembanding saya juga berikan gambar screenshot halaman depan bank mandiri yang asli (tidak dimodifikasi sslstrip).
[You must be registered and logged in to see this image.]bank mandiri front page modified by sslstrip
[You must be registered and logged in to see this image.]real mandiri front page (not modified)
Login ke Mandiri IB dilakukan dengan mengklik tombol Login di halaman depan bank mandiri. Login tersebut sebenarnya adalah link ke URL https, namun SSLStrip mengubahnya menjadi http agar korban tidak beralih ke modus https. Berikutnya korban akan mengklik tombol Login, sehingga browser akan mengakses URL
[You must be registered and logged in to see this link.] (bukan
[You must be registered and logged in to see this link.] Berikut adalah gambar screenshot halaman login Mandiri IB yang telah dimodifikasi sslstrip dan yang masih asli. Kedua gambar di bawah ini sangat mirip, perbedaannya hanya pada penggunaan awalan
[You must be registered and logged in to see this link.] dan
[You must be registered and logged in to see this link.] Saya yakin kebanyakan orang tidak akan menyadari bahwa dia sedang menggunakan http biasa, bukan https.
[You must be registered and logged in to see this image.]Mandiri IB login page modified by sslstrip
[You must be registered and logged in to see this image.]real login page, https version and not modified
Berikutnya setelah bertemu dengan halaman login, korban akan dengan senang hati memasukkan username dan password. Request tersebut dikirimkan dalam request POST http (bukan https) ke sslstrip. Karena POST dikirim melalui http, maka sslstrip bisa dengan mudah menyimpan username dan password korban.Berikut ini adalah log dari sslstrip yang menangkap username dan password Mandiri IB.
Setelah itu sslstrip akan mengirimkan username dan password korban dalam POST request ke URL https (ini adalah url submit yang asli). Response yang diberikan oleh webserver Mandiri IB akan dimodifikasi seperlunya dan dikembalikan ke browser korban. Bila login berhasil, maka korban akan melihat tampilan seperti gambar dibawah ini, sebagai pembanding saya juga sertakan gambar bila menggunakan protokol https.
[You must be registered and logged in to see this image.]login success page in http mode, modified by sslstrip
[You must be registered and logged in to see this image.]real login success page, https mode, not modified
Seperti pada halaman login, halaman setelah login berhasil juga sama persis walaupun menggunakan protokol http. Korban tidak akan menyadari bahwa dia sedang menggunakan http, bukannya https karena tampilannya memang tidak ada bedanya.
Tips Pencegahan
Serangan mitm dengan sslstrip ini dilakukan dengan memanfaatkan kemalasan pengguna untuk langsung menggunakan https. Pengguna yang malas memilih untuk menggunakan http biasa dan berharap di-redirect ke url https otomatis atau menemukan link ke url https. Padahal pada saat pengguna menggunakan http biasa itulah pengguna berpotensi terkena serangan mitm. Bila pengguna langsung menggunakan https, maka pengguna akan aman dan terbebas dari serangan mitm. Jadi mulai sekarang biasakanlah mengetikkan
[You must be registered and logged in to see this link.] di URL anda bila ingin mengakses situs yang sensitif.
Source: arif wicaksono