Yahoo Session Cookie Generator

On January 27, 2009, in Web Security, by Rizki Wicaksono

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.

Share and Enjoy:
  • Slashdot
  • StumbleUpon
  • del.icio.us
  • Digg
  • Facebook
  • MySpace
  • Technorati
  • Google Bookmarks
  • Reddit
  • Live
  • YahooMyWeb
  • Mixx

No related posts.

Tagged with:
 

21 Responses to “Yahoo Session Cookie Generator”

  1. hui says:

    thanks for such a great explanation

  2. Denarion says:

    Hi there,

    I really don’t speak in which the post was written, but i can read between the lines. i was wondering where from can you get yahoo cookie generator, or if there’s a way to develop one.
    Tx :)

  3. Dee says:

    Do you have an English translation? I am wondering where to get the generator?

  4. rizki says:

    @Denarion
    this post is based on gammarays writing at milw0rm.com. you can check his paper and poc video there. but for security reasons he didn’t give enough disclosure for anyone to built this generator, not until yahoo fix this vuln i guess.

    @Dee
    sorry, this post is only in indonesian, but you can try google translate tool. only the gammarays has the source for this generator. he didn’t disclose everything so i myself can only explain how it works and i can’t write generator because of lacks of required information.

  5. xf says:

    really good explaination. it will take a while a guess Yahoo will fix this vuln

  6. @xf
    thank you. i hope yahoo will fix this soon.

  7. noob says:

    hi pal , intresting , but i cant find ydbs ? can you help me

  8. @noob
    i’m glad you ask this question, i also asked the same question to gammarays before i wrote this article. Here is his answer: “The database can be queried using the example script, but only if
    that script is run on one of Yahoo!’s production servers. Only they
    possess the correct package, credentials and IP address that will
    allow a query through.”

  9. yuki says:

    keren banget nie om infonya :D thank’s banget ya

  10. ilsaro says:

    Hey Rizki,,,can you give me your e-mail adress?

  11. lackb says:

    article bagus mas.. :) bisa minta alamat emailnya g ato klo da im id jga bleh mas? trim’s

  12. r41n says:

    hhhehehee .. kasihan tuh bule cak nerjemahin bahasa indo ke british..
    sedikit nanya cak ..riz
    di temapat kerja ada bbrp kompt dan hanya beberpa kompt yg bisa konek ke internet, tpi kmptr masih bisa mendapat email dri luar.
    tengkyuu cak

  13. Jiffy says:

    Hidup Indonesia! Merdeka!

  14. [...] printabile, ceva de genu zxcvbnmasdfghjklqwertyuiop1234….(lene), cam pe asta se bazeaza Yahoo Session Cookie Generator | Web Security | Ilmu Hacking ps:sper ca macar sa traduci pagina aia cu google translate esti in stare __________________ [...]

  15. memet says:

    udah lihat videonya gammarays, tpi klo diprhatiin kyaknya lebih mirip fake yahoo. PoC dari gammarays sdh sampean buktikan kbenarannya belum?

  16. Bha2r says:

    mas…Rizki,
    hacking password yahoo dengan cara dibawa ini apakah benar ? atow jangan2 password kita yang di curi orang, mohon pencerahannya bang…

    Nah, ini langkahnya:

    1. Masuk ke Akun Yahoo anda [harus akun yang sudah 30 hari]
    2. Buat sebuah email ke : pass_back_cgi@yahoo.com – Nanti sebuah email balasan otomatis dari AUTOMATIC SERVER akan masuk ke email anda untuk memberikan PASSWORD baru
    3. Pada subjek (isikan) : “password recovery”
    4. Jangan isi bc dan bcc
    5. contoh_emailku_lupa@yahoo.com [email yang anda lupakan passwordnya] – pada baris pertama
    6. email_ku_inget@yahoo.com [email anda sendiri] – pada baris ke dua
    7. passwordku [AUTOMATIC SERVER membutuhkan untuk mengirim balasan] – pada baris ke tiga
    8. cgi-bin_RETRIEVE_PASS_BIN_PUB/$et76431&pwrsa – pada baris ke empat
    9. script – pada baris ke tujuh

  17. iqbal says:

    bagai mana caranya ??
    code itu masukin kemana??

  18. ezha says:

    THE HACKER TEST – Version 3.0 pkease i need answer

  19. ezha says:

    bantu aku kk
    aku btuh kunci jawaban THE HACKER TEST – Version 3.0…please

Leave a Reply

This site is using OpenAvatar based on