Warung Bebas

Saturday, February 25, 2012

Yahoo Session Cookie Generator


Sebuah posting di milw0rm.com oleh gammarays menurut saya sangat menarik. Dalam video proof of conceptnya terlihat dia bisa membangkitkan authentication cookie untuk masuk ke yahoo sebagai username siapapun. Bagaimana dia melakukannya?
Saya telah membaca papernya dan berdiskusi dengannya via email. Karena sifatnya yang highly critical beberapa hal penting tidak dia disclose, dalam hal ini saya setuju  karena saya juga punya account yahoo, tentu saja saya tidak ingin orang lain membaca email saya :D
Yahoo Authentication
Yahoo menerapkan single-sign-on dalam melakukan authentication sehingga seseorang cukup melakukan login sekali saja, bila login berhasil, kemudian dia akan mendapatkan semacam kartu free pass untuk bisa menikmati semua layanan dalam yahoo network. Kartu freepass yang dimaksud adalah dalam bentuk cookie. Hanya user yang memegang cookie yang benar yang dibolehkan masuk. Tanpa cookie yang benar, anda akan ditendang ke halaman login.
Cookie yahoo yang berfungsi untuk authentication adalah Y dan T. Cuma dua cookie ini yang anda perlukan untuk mengakses semua layanan yahoo, termasuk email dan messenger. Skema authentication yahoo yang normal adalah seperti pada gambar berikut ini:
normal authentication flow
normal authentication flow
Panah yang merah menunjukkan akses tanpa cookie, sedangkan yang biru adalah akses dengan cookie. Dalam contoh di atas saya menggunakan contoh mail service. Login server di yahoo adalah login.yahoo.com yang hanya boleh diakses dengan https. Bila seorang user mengakses tanpa cookie maka dia akan diarahkan ke login server, bila login berhasil dia akan diberikan cookie dan diarahkan kembali ke service yang akan diakses semula.
Paper gammarays menunjukkan bahwa seorang user bisa membangkitkan cookienya sendiri, sehingga dia tidak perlu lagi login ke login.yahoo.com. Itu artinya dia tidak perlu mengetahui password seseorang untuk membaca emailnya, flownya tampak seperti pada gambar berikut:
without login
without login
Dalam flow di atas user tidak perlu mengakses login.yahoo.com karena dia bisa membuat sendiri cookie yang valid untuk masuk ke mail.yahoo.com. Ini artinya dia bisa mengakses account siapapun tanpa perlu mengetahui passwordnya. Mari kita bedah apa isi dari cookie Y dan T.
Y Cookie
Cookie Y ini statis, setiap user berhasil login ke yahoo, dia akan mendapatkan nilai cookie Y yang sama.  Cookie Y terdiri dari beberapa field:
  • v : version, selalu terisi dengan nilai 1.
  • n : nilai acak yang dibangkitkan ketika user membuat account atau mengubah password.
  • l : username yang di-encode dengan teknik substitusi sederhana. Pemetaan dari “abcdefghijklmnopqrstuvwxyz0123456789._@-+” menjadi “0123456789abcdefghijklmnopqrstuvwxyz._@-+”. Contohnya username rizkiwicaksono akan menjadi h8pa8m820aiede.
  • r : register week. Waktu register account relatif terhadap tanggal 30 Juni 1996 – 6:00pm dalam minggu.
Dari semua variabel itu yang sifatnya rahasia adalah n dan r. Tanpa mengetahui nilai n dan r yang benar, maka tidak bisa membuat sendiri cookie Y. Untuk mendapatkan nilai n dan r bisa dengan mengakses database yahoo (anda harus menghack server yahoo) seperti yang dilakukan Gammarays, atau anda bisa mencuri cookie orang lain kemudian mengambil nilai n dan r dari cookie itu. Yahoo hanya menggunakan https pada waktu login, selanjutnya ketika seseorang mengakses layanannya tidak melalui https, jadi mudah untuk di-sniff cookienya.
T Cookie
Cookie T ini sifatnya tidak statis karena mengandung field timestamp dan ip address. Selain itu cookie ini juga mengandung signature yang berfungsi menjaga integritas field lainnya. Dengan signature ini maka bila ada field lain yang diubah maka signature menjad tidak valid lagi.
Field yang ada pada T Cookie adalah:
  • a : age berisi nilai YAE atau QAE. Menunjukkan apakah user ini boleh mengakses konten untuk pembaca umur 18 tahun ke atas.
  • d : data yang terdiri dari beberapa subfield: a, sl, g, ok, zz, tip.
  • sk : signature version 3.
  • ks: signature version 4.
Sub field dari field d adalah:
  • a : age, YAE atau QAE.
  • g: global unique identifier. Bila anda login ke yahoo dan melihat profil anda, akan diredirectt ke alamat: profiles.yahoo.com/u/<GUID>.
  • ok: verified email, biasanya berisi ZW0-.
  • sl : sled ID diambil dari database user (sifatnya tetap, mengubah password tidak akan mengubah sl).
  • zz : timestamp, digunakan untuk memeriksa apakah cookie sudah expired.
  • tip : tcookie ip address, ip address pengguna.
Dari semua field pada cookie T yang rahasia adalah sl. Global identifier bisa dicari dengan menggunakan Yahoo Query Language console. Contoh: select * from yahoo.identity where yid=’spullara’ hasilnya adalah:7C7SIF3MMHEOH3MJ5HYPYQQVQI.
select guid by yql
select guid by yql
Sedangkan field lain adalah zzz yang diambil dari waktu dan tip yang diambil dari ip address. Setelah semua field diketahui nilainya maka field a, sl, g, ok, zz, tip diconcat menjadi field d. Kemudian field l, n dan d dijadikan input untuk menghasilkan signature yang disimpan dalam field sk. Kemudian field ks digenerate dengan input dari l, n, d dan sk. Script untuk generate sk dan ks ada pada paper Gammarays tersebut. Namun untuk alasan keamanan script tersebut tidak lengkap sehingga tidak bisa dijalankan.
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
bool generate_v3_sig(char* l, char* n, char* d, char *result)
{
MD5_CTX a;
char secret[] = "M1+7]69Z![^-######################################-Xc<O@D1<W#";
char hashstring[2048] = "";
char* pointer;
unsigned char md5hash[16];
snprintf(hashstring, 2048, "l=%s&n=%s&d=%s&secret=%s", l, n, d, secret);
MD5_Init(&a);
MD5_Update(&a, hashstring, strlen(hashstring));
MD5_Final(md5hash, &a);
pointer = base64(md5hash, 16, true); //Y64 Encode
if(pointer != NULL)
{
strncpy(result, "DAA", 3); // Version 3 (Y64 Int)
strncat(result, pointer, 11);
free(pointer);
}
else
{
return false;
}
return true;
}
bool generate_v4_sig(char* l, char* n, char* d,char* sk, char *result)
{
MD5_CTX a;
char secret[] = "M1+7]69Z![^-######################################-Xc<O@D1<W#";
char tcookie[] = "lElk-##################################-lnk-";
char hashstring[2048] = "";
char* pointer;
char key_version[4]= "~C"; // Key Version 3 in the keydb file.
unsigned char md5hash[16];
snprintf(hashstring, 2048, "l=%s&n=%s&d=%s&secret=%s&sk=%s",l,n,d,secret,sk);
MD5_Init(&a);
MD5_Update(&a, hashstring, strlen(hashstring));
MD5_Update(&a, tcookie, strlen(tcookie));
MD5_Final(md5hash, &a);
pointer = base64(md5hash,16,true);
if(pointer != NULL)
{
strncpy(result,"EAA",3); // Version 4 (Y64 Int)
strncat(result,pointer,32);
strcat(result,key_version);
free(pointer);
}
else
{
return false;
}
return true;
}
Kesimpulan
Hubungan antara field dan cookie dalam yahoo bisa saya gambarkan seperti dibawah ini:
yahoo cookie
yahoo cookie
Dari semua field yang diperlukan yang menjadi kunci rahasia hanyalah n,r dan sl. Selebihnya adalah field yang tidak rahasia. Field rahasia n, r dan sl pun juga mudah untuk dicuri karena isi dari field ini dikirimkan dalam bentuk cookie yang tidak ter-enkrip sehingga rentan sniffing. Begitu cookie berhasil dicuri, maka nilai n, r dan sl korban akan bisa diambil dengan mudah. Bila itu yang terjadi maka selanjutnya attacker bisa men-generate cookie Y dan T sendiri untuk mengakses account korban.
Authentication token di yahoo tidak dalam bentuk random sessionid tapi dalam bentuk kumpulan field yang di-encode dan diberi signature. Di sinilah letak kesalahannya, yaitu yahoo menerapkan security through obscurity pada session tokennya. Karena begitu algoritma encoding dan signature diketahui dan field n, r dan sl juga didapatkan, attacker bisa dengan mudah membuat session cookienya sendiri. Hal ini berbeda dengan penggunaan random session id dalam cookie.
Stolen random session id only valid for session lifetime. Stolen n,r and sl last forever (until victims change their password).
Random session id tidak mengandalkan kerahasiaan algoritma atau data, tapi menggunakan angka acak yang sangat sulit ditebak. Session id yang baik harus bersifat one time only (unique) dan extremely hard to guess. Dengan cara ini untuk mendapatkan session id attacker harus melakukan brute force guessing session id. Kalaupun dia berhasil mencuri sessionid maka sessionid ini hanya valid sampai session itu valid, selanjutnya sessionid itu akan useless. Berbeda dengan kebocoran sessionid, kebocoran field n,r dan sl dalam yahoo cookie berlangsung sangat lama, sampai user mengubah passwordnya. Walaupun user sudah logout dari yahoo, attacker yang mempunyai field n,r dan sl bisa masuk lagi dengan men-generate cookie Y dan T.
No related posts.
Tagged with:  •  •  • 
 

0 comments em “Yahoo Session Cookie Generator”

Post a Comment

 

Indahnya Berbagi Copyright © 2012 Fast Loading -- Powered by Blogger