Jump to content
SlicK

[RST] Despre Yahoo!

Recommended Posts

Despre Yahoo!

Autor: SlicK [slick@rstcenter.com]

In primul rand vreau sa-mi cer scuze pentru inevitabilele greseli de ortografie deoarece sunt multe subiecte

pe care vreau sa le acopar in acest articol si nu am timp sa mai si verific ce am scris deja.

Urmatorul articol este rezultatul a vreo doua saptamani de cautari, teste, munca si nervi si va acoperi

cateva aspecte ale Yahoo'ului cred eu destul de interesante pe care poate ca unii dintre voi le cunoasteti deja,

scopul fiind sa clarifice cateva "mituri" despre Yahoo si sa raspunda la unele din intrebarile pe care poate vi

le-ati pus vreodata.

PARTEA I. Algoritmul de codare "yahoo64"

Acest algoritm este folosit de Yahoo oriunde trebuie transformat un sir de caractere neprintabile intr-un

sir de caractere printabil.

Se numeste "codare" si nu "criptare" deoarece nu ofera absolut nici o protectie pentru sirul de caractere de

codat. Fara a intra in aspecte criptografice trebuie metionat ca yahoo64 este foarte asemanator cu base64

insa are un charset extins.

Charsetul yahoo64 este urmatorul "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"

yahoo64 are cateva caracteristici distincte care trebuie mentionate:

> toate caracterele din stringul codat fac parte din charsetul de mai sus

> lungimea stringului este multiplu de 4

> in functie de lungimea stringului initial, la sfarsitul stringului criptat ultimele caractere pot fi "-"

sau "--".

Pentru mai multe detalii studiati cele doua functii php(pentru codare si decodare) de la sfarsitul acestui

articol.

PARTEA II. Analiza tokenului Yahoo

Din cate am observat pana acum tokenul Yahoo este o insumare a userului si parolei de Yahoo, unic pentru

fiecare username in parte dar care se modifica (doar partial) la schimbarea parolei.

In esenta posesia acest token exprima ca posesorul este fie userul fie o entitate care are permisiunea

userului de a actiona in numele acestuia pe serverele Yahoo.

Un user isi poate obtine acest token prin accesarea linkului urmator:


[url]https://login.yahoo.com/config/pwtoken_get?src=ymsgr&login=[/url][USERNAME]&passwd=[PASSWORD]

unde [uSERNAME] si [PASSWORD] sunt o combinatie username/parola Yahoo VALIDE.

Utilitatea acestui token este ca poate oferi oricand un COOKIE valid de Yahoo.


[url]https://login.yahoo.com/config/pwtoken_login?src=ymsgr&token=[/url][TOKEN]

Un exemplu de raspuns la un reqest catre "https://login.yahoo.com/config/pwtoken_get" poate fi acesta:


0
ymsgr=AGG6e0diD9m.3D4YlFPVcdBT1wFXKSBWP0Hl.gyQKd.qec8-
partnerid=KSBWP0Hl.gyQKd.qec8-

"ymsgr" este tokenul despre care am vorbit mai devreme si dupa cum se observa "partnerid" face parte din acest

token (la sfarsit). Acest "partnerid" este unic pentru fiecare utilizator in parte si nu se modifica la schimbarea

parolei, iar lungimea acestuia variaza in functie de lungimea username'ului.

Dupa cum se poate observa lungimea tokenului este de 48 si se termina cu un "-" deci este evindent codat

cu yahoo64. Dupa decodare obtinem urmatorul sir de caractere (unde fiecare 2 caractere reprezinta valoarea

hexadecimala a unui singur caracter din tokenul decodat):


00 61 BA 7B 47 62 0F D9 BE DC 3E 18 94 53 D5 71 D0 53 D7 01 57 29 20 56 3F 41 E5 FA 0C 90 29 DF AA 79 CF

La toate tokenurile pe care le-am vazut pana acum primul caracter este intotdeauna "0x00"

Urmatoarele 4 caractere reprezinta timestampul (numarul de secunde care au trecut din 1-1-1970) la care userul

a fost creeat sau cand parola a fost schimbata, doar ca timestampul este inversat deci pentru exemplul de mai

sus timestampul va fi 0x477BBA61 (decimal 1199290977) adica "Wed, 2 Jan 2008 16:22:57 GMT"

Daca decodam "partnerid" vom obtine urmatorul string:


29 20 56 3F 41 E5 FA 0C 90 29 DF AA 79 CF

care dupa cum sa observa sunt ultimele 14 caractere de la sfarsitul tokenului.

Daca din token eliminam primul caracter (00) timestampul (61 BA 7B 47) si parnerid'ul decodat vom ramane cu


62 0F D9 BE DC 3E 18 94 53 D5 71 D0 53 D7 01 57

Acest string rezultat are o lungime de 16 caractere ceea ce duce la concluzia ca este un hash MD5 (md5() produce

un hash de 128 de biti adica 16 caractere intre 0x00 si 0xFF, a nu se confunda cu md5_hex() care produce un

string de 32 de caractere reprezentand valorile hexadecimale ale celor 16 caractere produse de md5() )

La schimbarea parolei se modifica doar timestampul si acest hash MD5 ceea ce ma face sa cred ca din stringul

initial (care produce hashul) face parte fie timestampul fie parola fie ambele.

Trebuie sa mentionez pentru cei care vor face teste ca acest token trebuie pastrat SECRET deoarece dupa cum

am spus si mai sus cunoasterea tokenului poate duce la compromiterea contului (parola NU trebuie sa fie cunoscuta

pentru a obtine un set de cookiuri)

PARTEA III. Yahoo! Messenger "Remember my ID & password"

Incepand cu versiunea 7.x.x.x Yahoo! Messnger NU mai memoreaza parola atunci cand optiunea "Remember my ID

& password" este bifata. In schimb este memorat tokenul despre care am vorbit mai sus deoarece dupa cum o sa arat

mai tarziu tokenul este suficient pentru logarea cu succes la serviciul messenger.

Pentru memorare tokenul este criptat si stocat in registrii windows in cheia


HKEY_CURRENT_USER\Software\Yahoo\Pager\ETS

Userul este de asemenea salvat deoarece este necesar pentru decriptare


HKEY_CURRENT_USER\Software\Yahoo\Pager\Yahoo! User ID

Nu voi da un exemplu de astfel de string deoarece desi algoritmul de criptare imi este deocamdata necunoscut poate

fi totusi decriptat si extras un token folosind functii din "YahooMessenger.exe".

Analiza pe care am facut-o unui string ETS este destul de sumara: tokenul este criptat folosind o cheie formata

din "MBCS sucks"+USERNAME. Stringul rezultat fiind apoi codat cu yahoo64 si stocat in registrii la cheia ETS.

Pentru crackeri decriptarea se face in "YahooMessenger.exe" (8.1.0.421) la offsetul 0x004862AA unde functia

locala de la offsetul 0x006FCEC0 primeste urmatorii 9 parametrii

1. Stringul ETS

2. Lungimea stringului ETS

3. Pointer catre tokenul decriptat

4. Pointer catre lungimea tokenului

5. Cheia de decriptare "MBCS sucks[uSERNAME]"

6. Lungimea cheii de decriptare

7. 0x00

8. 0x00

9. 0x00

PARTEA IV. Autentificarea YMSGR v15

In continuare voi presupune ca sunteti deja familiarizati cu protocolul Yahoo! Messenger(formarea pachetelor si

parametrii unui pachet)

Este de mentionat ca din motive de compatibilitate YMSGR15 accepta si logarea clasica user/password dar mult mai

important este ca Yahoo! Messnger foloseste si logarea cu COOKIE.

Pentru o logare cu succes Yahoo! Messnger face urmatorii pasi:

-Daca optiunea "Remember my ID & password" este bifata decripteaza stringul ETS si obtine un token, daca nu

va folosi userul si parola introduse pentru a face un request la "https://login.yahoo.com/config/pwtoken_get"

pentru a obtine tokenul

-Dupa conectarea la unul din serverele yahoo trimite un pachet VERIFY (0x4C)

-Daca primeste un raspuns valid VERIFY de la server incepe procedura de autentificare

-Trimite un pachet AUTH (0x57) cu parametrii:

"1" - USERNAME

-Primeste un pachet AUTHRESP (0x54) din care extrage valoarea parametrului "94" (CHALLENGE)

-Avand un token valid al userului va face un request catre "https://login.yahoo.com/config/pwtoken_login"

pentru a obtine valorile "Y" si "T" ale cookieului precum si valorea "crumb" (CRUMB)

-Creeaza un string (STRING307) astfel yahoo64(md5(CRUMB+CHALLENGE))

-Trimite un pachet AUTHRESP (0x54) cu parametrii:

"277" - parametrul Y

"278" - parametrul T

"307" - STRING307

"0" - USERNAME

"2" - USRNAME

"2" - "1"

"1" - USERNAME

"244" - un numar random (ex. "2097087")

"98" - "us"

"135" - versiunea clientului (ex. "8.1.0.421")

"148" - "-120"

-Daca totul e in regula userul este autentificat iar serverul trimite buddy listul si alte informatii cum ar

mailuri noi, add buddy request etc.

PARTEA V. Analiza si explicatia cookiurilor Yahoo

Odata cu autentificarea la un serviciu Yahoo userul primeste cookiurile "Y" si "T" deci analiza mea a fost

concentrata doar asupra acestor 2 cookiuri.

Cookieul Y poate fi configurat sa expire dupa o valoare intre 15 minute si 24 de ore dar cookieul T expira de

obicei la inchiderea browserului sau la logout. Pentru serviciile cu securitate scazuta cum ar fi pagina "My Yahoo"

cookiul Y este suficient dar pentru cele mai importante cum ar fi mail,calendar etc.. cookieul T este obligatoriu.

Dupa cum probabil ati observat un cookie Yahoo este format din perechi "parametru=valoare". In continuare voi

analiza parametrii care formeaza fiecare cookie si voi incercat sa prezent o explicatie pentru prezenta sau scopul lor.

-Cookieul Y:

Exemplu:


Y=v=1&n=9mioklmar8tku&l=glagla/o&p=m2509oh012000000&r=in&lg=en-US&intl=us&np=1

Contine usernameul,un ID unic si cateva informatii demografice. De obicei acesta ramane neschimbat pentru

un anumit user modificandu-se doar ID'ul unic (la schimbarea parolei) si informatiile demografice (la schimbarea

adresei, limba utilizata, etc...)

Dupa cum se observa este format din parametrii v,n,l,p,r,lg,intl si np dar nu toti sunt necesari pentru

autentificarea cu succes al unui user.

Parametrul "n" este un ID unic intern al utilizatorului (se modifica doar la schimbarea parolei) care este

comparat cu o valoare interna yahoo la anumite requesturi pentru obtinerea de informatii sau pentru expirarea

automata a tuturor cookiurilor vechi odata cu schimbarea parolei.

Parametrul "l" este usernameul codat cu un algoritm simplu de substitutie unde fiecare caracter din user are un

corespondent intr-un alt string dupa cum urmeaza:


PLAINTXT=klmnopqrstuvwxyz0123457896abcdefghij._
ENCODED=abcdefghijklmnopqrstuvxyzw0123456789._

Astfel pentru cookiul de mai sus username'ul este "qvkqvk"

Parametrul "p" contine diverse informatii despre utilizator cum ar fi sex, data nasterii, tara, etc.

Restul parametrilor contin de asemenea diverse informatii despre limba, anumite setari, etc.

-Cookieul T:

Exemplu:


T=z=Cr7eHBCxQfHBJkF/Bqb4dnUMzIwBjVPNDQzNDFOME8-&a=QAE&sk=DAAk3Lb2EiyEEM&ks=EAA3i37q0zwFhuCnF6cflaKHg--~A&d=c2wBTkRVM0FUSTRNek0wTXpZNU56Zy0BYQFRQUUBenoBQ3I3ZUhCZ1dBAXRpcAFzNkpUZEM-

Contine un timestamp si o semnatura digitala simetrica. Acesta se modifica la modificarea timpului(oricate cookiuri

generate intr-o singura secunda sunt identice)

Este format din parametrii z,a,sk,ks si d dar pentru autentificare la serviciile web sunt necesari doar

parametrii sk,ks si d. Pentru autentificare Yahoo! Messenger "z" este insa obligatoriu.

Parametrul "z" exista pentru compatibilitate cu servicii mai vechi dar este de asemenea in stransa legatura cu

valoarea CRUMB obtinuta pentru autentificarea Yahoo! Messenger. Acesta este un string criptat cu yahoo64 dar

decodarea acestuia nu prezinta nici o informatie evidenta)

Parametrul "a" (de obicei are valoarea "QAE") contine diverse flaguri pentru expirare si protectia minorilor.

Parametrul "sk" reprezinta sesiunea (session key) si este calculat din username, ID unic si timestamp precum

si dintr-un string cunoscut doar pe serverele Yahoo (Yahoo shared secret)

Parametrul "ks" reprezinta (din observatiile mele) un hash al parolei utilizatorului sau un alt string care

inlocuieste parola deoarece lipsa acestui este urmata de obligatia introducerii parolei(pe serverele web Yahoo).

Daca ignoram primele 3 caractere care nu se schimba ("DAA") si ultimele 2 caractere care de asemenea nu se

schimba ("~A") obtinem un string codat yahoo64 reprezentand cel mai probabil un hash MD5 (stringul decodat are

16 caractere) cel mai probabil de asemenea generat folosind un shared secret.

Parametrul "d" contine sesiunea utilizatorului si cateva informatii pentru compatibilitate.

Acesta este un string codat yahoo64. Dupa decodarea valorii "d" din exemplul de mai sus obtinem urmatorul string:

(unde [sEP] este caracterul hexadecimal 0x01)


sl[SEP]NDU3ATI4MzM0MzY5Nzg-[SEP]a[SEP]QAE[SEP]zz[SEP]Cr7eHBgWA[SEP]tip[SEP]s6JTdC

Se poate observa ca acest string este de asemenea o insiruire de perechi "parametru=valoare" astfel:


sl=NDU3ATI4MzM0MzY5Nzg-&a=QAE&zz=Cr7eHBgWA&tip=s6JTdC

Valoarea parametrului "sl" este de asemenea un string criptat yahoo64:


457[SEP]2833436978 (sau 457=2833436978)

Acest numar este unic pentru fiecare username si nu se modifica la schimbarea parolei

Parametrul "a" este acelasi cu parametrul "a" din cookiul "T"

Parametrul "zz" reprezinta in esenta un contor de timp. Valorile pe care le poate lua un caracter facand parte din

charsetul yahoo64 cu singura diferenta ca "_" este inlocuit de "/".

Cea mai buna analogie pe care o pot face incercand sa explic acest parametru este aceea cu un kilometraj de masina,

Adica fiecare caracter(de la stanga la dreapta) poate fi asemanata cu o rotita cu valorile din charset. atunci cand

primul caracter termina o rotatie completa prin toate pozitiile, al doilea caracter creste cu o pozitie continuand

in aclasi mod pana la al 6-lea caracter. Stiind ca primul caracter creste cu o pozitie pe secunda se poate afla

timestampul la care un anumit cookie a fost generat. (cand userul s-a logat serviciul respectiv)

Parametrul "tip" este acelasi pentru toti utilizatorii Yahoo dar se schimba periodic (nu stiu intervalul exact)

Cam atat cu acest articol si felicitari pentru cei care au avut rabdarea sa-l citeasca pana la capat.

Astept pareri sau adaugiri cu privire la aceste subiecte.

Algoritmul de codare yahoo64:


<?php
//yahoo64 encode/decode functions by SlicK [slick@rstcenter.com]

function yahoo64_encode($source)
{
$yahoo64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
$limit=strlen($source)-(strlen($source)%3);
$dest="";
for($i=0;$i<$limit;$i+=3)
{
$dest.=$yahoo64[ord($source[$i])>>2];
$dest.=$yahoo64[((ord($source[$i])<<4)&0x30) | (ord($source[$i+1])>>4)];
$dest.=$yahoo64[((ord($source[$i+1])<<2)&0x3C) | (ord($source[$i+2])>>6)];
$dest.=$yahoo64[ord($source[$i+2])&0x3F];
}

switch(strlen($source)-$limit)
{
case 1:
{
$dest.=$yahoo64[ord($source[$i])>>2];
$dest.=$yahoo64[(ord($source[$i])<<4)&0x30];
$dest.='--';
} break;

case 2:
{
$dest.=$yahoo64[ord($source[$i])>>2];
$dest.=$yahoo64[((ord($source[$i])<<4)&0x30) | (ord($source[$i+1])>>4)];
$dest.=$yahoo64[((ord($source[$i+1])<<2)&0x3c)];
$dest.='-';
} break;
}
return($dest);
}

function Index($string,$chr)
{
for($i=0;$i<64;$i++) { if($string[$i]==$chr) { return($i); } } return(-1);
}

function yahoo64_decode($source)
{
$yahoo64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
$len=strlen($source);
if($source[$len-1]=='-') { $plus=2; }
if($source[$len-2]=='-') { $plus=1; }
if($plus>0) { $len-=4; };

$dest="";
for($i=0;$i<$len;$i+=4)
{
$chr1=Index($yahoo64,$source[$i]);
$chr2=Index($yahoo64,$source[$i+1]);
$chr3=Index($yahoo64,$source[$i+2]);
$chr4=Index($yahoo64,$source[$i+3]);
$dest.=chr(($chr1<<2)|($chr2>>4));
$dest.=chr((($chr2&0xF)<<4)|($chr3>>2));
$dest.=chr((($chr3&0x3)<<6)|($chr4&0x3F));
}
switch($plus)
{
case 1:
{
$chr1=Index($yahoo64,$source[$i]);
$chr2=Index($yahoo64,$source[$i+1]);
$dest.=chr(($chr1<<2)|($chr2>>4));
} break;

case 2:
{
$chr1=Index($yahoo64,$source[$i]);
$chr2=Index($yahoo64,$source[$i+1]);
$chr3=Index($yahoo64,$source[$i+2]);
$dest.=chr(($chr1<<2)|($chr2>>4));
$dest.=chr((($chr2&0xF)<<4)|($chr3>>2));
} break;
}
return($dest);
}

//usage example

$string="any string";
print("Original string=$string
\n");

$encoded=yahoo64_encode($string);
print("Encoded string=$encoded
\n");

$decoded=yahoo64_decode($encoded);
print("Decoded string=$decoded
\n");
?>

  • Downvote 8
Link to comment
Share on other sites

Guest Nemessis

Cu toate ca deja stiam din discutiile noastre despre toate astea tot ce pot sa spun este... m-ai lasat fara cuvinte :)

Bravo. Zilele astea vei avea si traducerea in limba engleza ca sa il poti trimite mai departe la celelalte site-uri de securitate.

Link to comment
Share on other sites

Guest BanKai

felicitari pentru munca timpul si efortul psihic depuse ... dar, faptul ca ai facut publice aceste descoperiri si momentul cand le'ai facut le vor face total inutile , ceea ce erau oricum momentan ... in cel mai bun caz se vroiau a fi o piatra de temelie pentru altele mai utile si cu un impact mai mare dar facerea lor publica nu face decat sa le aduca la urechile celor de la yahoo fapt ce va duce la inevitabila intarire a algoritmilor de codare si a securitatii, pe plan lung acest post va face mai mult rau decat bine pentru 'noi'.

a hacker with no common sense is just ... a programer :/, it's not personal ... it's just the truth.

Link to comment
Share on other sites

felicitari pentru munca timpul si efortul psihic depuse ... dar, faptul ca ai facut publice aceste descoperiri si momentul cand le'ai facut le vor face total inutile , ceea ce erau oricum momentan ... in cel mai bun caz se vroiau a fi o piatra de temelie pentru altele mai utile si cu un impact mai mare dar facerea lor publica nu face decat sa le aduca la urechile celor de la yahoo fapt ce va duce la inevitabila intarire a algoritmilor de codare si a securitatii, pe plan lung acest post va face mai mult rau decat bine pentru 'noi'.

a hacker with no common sense is just ... a programer :/, it's not personal ... it's just the truth.

Vorbeste zgarcenia din el :lol: .

Link to comment
Share on other sites

Guest BanKai
Interesant, dar unele informatii erau postate de Rajesh Sethumadhavan, insa dateaza din 2006. Inclusiv un soi de decoder, probabil bazat pe acelasi algoritm de codare, pe care il are urcat pe site-ul lui si poti online sa introduci un cookie ca sa il decodezi.

algoritmul de decodare al cookie nu are treaba cu algoritmul gasit de slick

Link to comment
Share on other sites

Interesant, dar unele informatii erau postate de Rajesh Sethumadhavan, insa dateaza din 2006. Inclusiv un soi de decoder, probabil bazat pe acelasi algoritm de codare, pe care il are urcat pe site-ul lui si poti online sa introduci un cookie ca sa il decodezi.

algoritmul de decodare al cookie nu are treaba cu algoritmul gasit de slick

Evident, insa deobicei cand scrii un articol, la sfarsit treci si bibliografia, nu?

Link to comment
Share on other sites

Guest Nemessis

Ce a scris Rajesh Sethumadhavan in articolul lui era deja public de 3 ani de zile (mai putin xss-urile din Yahoo! mail beta). Cookie decoderul il stiam de cand ma jucam cu putza in tarana pe IRC.

http://sec.drorshalev.com/dev/yahoo/vbs.asp (verifica cand a fost creeat cookieul din decoderul respectiv si vei vedea si cat de veche e metoda).

Link to comment
Share on other sites

Pai asta zic si eu, sunt chestii vechi. La momentul aparitiei articolului lui Rajah asta, pusese spre exemplificare exact ce ati facut voi acum, autentificare directa cu un cookie. Puteai da click pe un link din articolul lui si te ducea direct intr-un mail facut de el pentru teste. Eu n-am zis decat ca fiind lucruri atat de vechi, deobicei cand scrii un nou articol, pui si bibliografia, adica aia ai luat-o de acolo, aialalta ai citit-o dincolo, le-ai pus cap la cap, ai testat si ai scos articolul, ca doar nu pretinzi ca ai redescoperit roata.

Link to comment
Share on other sites

Cine dracu e Rajesh Sethumadhavan asta ca nici macar nu am auzit de el da sa-i mai fur si ideile fara sa dau credite :evil: (poate imi da si mie cineva linkul cu situ lui)

catalyne inainte sa-ti dai cu parearea te sfatuiesc sa te mai documentezi putin, "soiul ala" de decoder pe care il stii tu nu are absolut nici o legatura cu algorimul yahoo64.

In alta ordine de iei tu, in totala necunostinta de cauza, ma acuzi pe mine ca as fi copiat informatiile din diverse locuri si "le-am pus cap la cap" intr-un articol? fuck this! Incearca sa nu-ti mai bagi nasul unde nu-ti fierbe oala ca ti-l arzi, mai bine du-te si joaca-te in liniste cu proxomicacaturile tale.

Link to comment
Share on other sites

Guest Nemessis

:))

Cataline ai citit articolul lui Slick si cel al lui Rajesh? Rajesh a zis de acel session binding folosit in grabberul nostru. Slick a explicat cu totul altceva si anume cum se creeaza cookie nu cum te loghezi automat cu el. DOUA CHESTII TOTAL DIFERITE.

http://xdisclose.com/ sau http://sec.drorshalev.com/dev/yahoo/yahooxss.htm ia citeste tu aici si gaseste asemanarile dintre ce a zis Rajesh si ce a zis Slick. In afara de explicatia data la ce inseamna fiecare parametru din cookie, Rajesh a venit cu niste dude publice sau niste xss-uri care dupa cum vezi nu sunt greu de gasit.

Link to comment
Share on other sites

aoleu ce tare!!! abia acum am citit articolul asta.

Pai pe adresa asta

https://login.yahoo.com/config/pwtoken_get?src=ymsgr&login=[user]&passwd=[parola]

se poate face lejer un brute force atack, chiar intr-un amarat de php (Vedeti diferenta intre parola corecta si gresita) avand in vedere ca pe paginile de login ale yahoolui iti baga coduri de securitate la a N-a incercare.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...