Jump to content
SlicK

[RST] Despre Yahoo!

Recommended Posts

m-am apucat s? codez un script PHP care s? se autentifice la re?eaua Yahoo Messenger. Am c?utat prin multe surse dar pot spune c? acest tutorial este cel mai elaborat ?i m-a ajutat. Totu?i, la un moment dat m-am blocat ?i nu am reu?it s? finalizez cu succes autentificarea (autentificare bazat? pe stringul 307 nu pe vechea metod? cu hashurile 6 ?i 96). Am c?utat de nebun pe internet ?i am dat de o surs? C de la protocolul Yahoo folosit? la messengerul Miranda. Folosesc ?i ei noua metod? de autentificare ins? am v?zut ceva diferen?e. Am s? prezint succint ce am realizat pan? acum, poate ajut? pe cineva ?i primesc ?i eu la randul meu rezolvarea final? a problemei de conectare. S? incepem deci:

- ini?ial clientul trimite un pachet "verify". Pachetul are rolul de a stabili identitatea Yahoo a serverului ?i dac? acesta ar putea s? realizeze o strangere de man? in vederea autentific?rii. Pachetul nu are con?inut. Structura este urm?toarea (pentru cine este curios): 4 bytes pentru protocol ?i anume YMSG, 4 bytes pentru versiune (folosesc versiunea 15) care inseamn? in hex 000f0000, lungime pachet pe 2 bytes (cum pachetul nu con?ine con?inut el area lungimea egal? cu 0), serviciul 76 (pentru verificare) care in hex este 004c, status care este 0 (pentru pachetul verify) ?i sesiunea care am setat-o cu 0 c?ci am auzit c? in conect?rile directe nu se ?ine cont de ea (?i cum serverul mi-a r?spuns, chiar nu se ?ine cont). Statusul ?i sesiunea sunt pe 4 bytes, fiecare. Eu am scris o func?ie care creaz? pachetul in func?ie de aceste op?iuni ?i apoi trimit prin socket, la server.

- serverul r?spunde cu un pachet "verify". Asta inseamn? c? el poate s? intre?in? autentificarea. Pan? aici toate bune, codul pe care l-am scris func?ioneaz?.

- clientul trimite un pachet de cerere de autentificare care are la con?inut Yahoo id-ul care vrea s? se conecteze la re?ea. Practic ii spunem serverului cine suntem ?i ce vrem s? facem: "hei, eu sunt yahoo_id_oarecare. vreau s? m? conectez la re?ea prin intermediul t?u". De aceast? dat? pachetul va con?ine in header cateva mici schimb?ri ?i anume: la serviciu vom avea 0x0057 ?i lungimea con?inutului va fi in conformitate cu m?rimea ID-ului. Con?inutul acestui pachet are urm?toarea form?: "1":"Yahoo_Id_oarecare".

- serverul imi trimite (pan? func?ioneaz?) pachetul de autentificare cu ack1. Acest pachet con?ine in valoarea cheii 94 challange-ul pe care il vom folosi in urm?torul pachet. Am decupat acest challange (el este de fiecare dat? altul ?i nu are leg?tur? cu vreo dat? privat? a ID-ului.) ?i am ob?inut ceva de genul:


y*n/d/q^t/g^w|o^i%h&(q^r%n|2^(s&(o/m&k^i|l^(c+x/z+s|d/1-3/x|(p&p%b|d)))))

- acum urmeaz? partea dr?gu?? ?i anume conectarea prin ssl pentru a lua tokenul unui user. Fie c? urmeaz? acum, fie c? apare in cod mai devreme, nu conteaz?. Totul este s? ob?inem tokenul ?i in func?ie de token valoarea crumb (care este alta de fiecare dat?) ?i cookie-urile pentru autentificare. Scrie Slick cum se procedeaz? pentru a le ob?ine.

- acum urmeaz? partea mai mult sau mai pu?in interesant?. Am snifat pachetele pe care le trimite clientul meu de Yahoo messenger ?i am v?zut c? valoarea stringului 307 are lungimea de 24 incluzand ?i dou? - la sfar?it. Cum stringul 307 este ceva de genul yahoo64(md5(crumb+challange)) o s? avem yahoo64(o_valoare_de_lungime_32) ?i s? 44 ca lungime. Mie unul mi se pare ciudat. Am g?sit intr-un cod surs? de autentificare nou? c? doar primii 16 din cei 32 din md5 sunt encoda?i in yahoo64 ?i am modificat un pic func?ia de encodare in yahoo64 a lui Slick s? v?d dac? merge:


function yahoo64_encode($source)
{ $yahoo64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";

// something with 16 bytes not hex
$inlen = 16;
$in=0;
// in este ce primim
for(; $inlen >=3; $inlen -=3)
{
$dest.=$yahoo64[ord($source[$in])>>2];
$dest.=$yahoo64[((ord($source[$in])<<4)&0x30) | (ord($source[$in+1])>>4)];
$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3C) | (ord($source[$in+2])>>6)];
$dest.=$yahoo64[ord($source[$in+2])&0x3F];
$in += 3;
}

if($inlen>0)
{
// enters here
$dest.=$yahoo64[ord($source[$in])>>2];
$fragment = ((ord($source[$in])<<4)&0x30);
if($inlen>1){$fragment |= (ord($source[$in+1])>>4); }
$dest.=$yahoo64[$fragment];
if($inlen<2)
{$dest.="-";}
else
{$dest.=$yahoo64[((ord($source[$in+1])<<2)&0x3c)]; }
$dest.="-";

}


return $dest;
}

- am creat pachetul ?i l-am trimis c?tre server in speran?a c? am inimerit stringul 307 corect totu?i nu func?ioneaz?. Serverul imi trimite un mesaj cu serviciul de deconectare (0x07d1) ?i cu statutul 0xffffffff. in con?inut g?sesc:


"66":"1003"
"16":".....Yahoo_id_oarecare.. ?i mai multe cifre ?i virgule"

- b?nuiesc c? problema este de la stringul 307 ?i autentificarea pic? deci m? d? afar?. Ori m-a banat serverul? Idei?

Link to comment
Share on other sites

Buna, vad ca ai studiat destul de mult ..... dar ai obs si tu cred ca daca stergi un fisier (tip .xml) din cache la yahoo... cand repornesti yahoo se instaleaza iar automat..... ai putea afla cum asi putea bloca acest lucru ??

Si te mai rog cv, daca tot vad ca te pricepi la yahoo, stii cumva cum asi putea face rost de "client_add.php" de la yahoo ?

Link to comment
Share on other sites

  • Moderators
daca am obtinut token-ul cum il decodez cu yahoo64?ca nu prea reusesc :(

Token-ul il folosesti ca sa intri pe mail-ul victimei.

EDIT:

Asta ar fi metoda, doar daca nu au modificat-o cei de la Yahoo!


<?php

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

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

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);
}
?>

Edited by Dragos
Link to comment
Share on other sites

@Slick: am salvat alogitmul de la sparsit intr-un php (yahoo64.php) pe care l-am pus in Webfolder pe serverul Apache si cand il execut in browser imi pare decat asta:

Original string=any string Encoded string=YW55IHN0cmluZw-- Decoded string=any string

Asa trebuia facut? Sau cum...?

Super interesant tutorialul!

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