Autoryzacja w Gadu Radio

Udało mi się wreszcie opisać sposób i algorytm autoryzacji w usłudze Gadu Radio. Wykorzystałem materiały udostępnione przez AQQKillera oraz własne analizy i spostrzeżenia wynikłych w czasie prac nad wtyczką „Gadu Radio” dla komunikatora Tlen.pl.

Wprowadzenie

Gadu Radio to najpopularniejsze polskie radio internetowe. Po raz pierwszy zaczęło nadawać we wrześniu 2006 roku. Obecnie słucha je już 250 tys osób dziennie i ponad 1,2 mln osób miesięcznie.

Jest to typowa usługa internetowej rozgłośni radiowej nadająca swoje audycje przez Internet, za pomocą przesyłania strumieniowego wykorzystując odpowiednie oprogramowanie serwera mediów strumieniowych, w tym przypadku oprogramowania fundacji Xiph.orgIcecast.

Oczywiście w przypadku Gadu Radia nie wystarczy uruchomienie odtwarzacza i wprowadzenie adresu serwera strumieniowego, aby oddać się przyjemności słuchania radia. Trzeba przejść poprawnie proces autoryzacji, aby otrzymać wygenerowany unikalny adres strumienia wraz z hasłem.

Sam pomysł i realizacja tego procesu jest bardzo dobra i wymaga do prawidłowego przejścia procesu autoryzacji pliku wykonywalnego komunikatora Gadu-Gadu. Choć z czasem pojawienia się możliwości słuchania radia wprost z strony www, metoda ta straciła swój potencjał, poprzez wykorzystywanie tych samym danych (do złamania Enigmy przyczyniło się wykorzystanie przez Niemców kilkukrotnie tych samych haseł jednorazowych).

Działanie Gadu Radia w komunikatorze Gadu-Gadu opiera się na ukrytym procesie Winampa odtwarzającego w tle kanał. W przypadku strony web, po zalogowaniu się wykorzystując nasz numer w sieci gg, otrzymamy wygenerowany url strumienia.

Lista kanałow

Listę kanałów zawierającą informacje o dostępnych kanałach tematycznych radia oraz o namiarach na serwery można pobrać spod adresu:

http://static.gaduradio.pl/stations/2008070201.xml

gdzie nazwa pliku składa się z daty ostatniej aktualizacji listy.

Jest to plik XML o prostej strukturze:

<?xml version="1.0" encoding="windows-1250"?>
<list xmlns="http://www.gaduradio.pl/schema/gr-im-channel-list"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.gaduradio.pl/schema/gr-im-channel-list
 http://www.gaduradio.pl/schema/gr-im-channel-list.xsd">
    <default chname="2">
        <server ip="gr-lb-2.gaduradio.pl" port="80" authport="443"></server>
        <server ip="gr-lb-1.gaduradio.pl" port="80" authport="443"></server>
    </default>
    <channel description="Orange Music" chname="31">
        <server ip="gr-lb-2.gaduradio.pl" port="80" authport="443"></server>
        <server ip="gr-lb-1.gaduradio.pl" port="80" authport="443"></server>
    </channel>
        .
        .
        .
    <channel description="RADIO MUZANGO" chname="9">
        <server ip="gr-lb-2.gaduradio.pl" port="80" authport="443"></server>
        <server ip="gr-lb-1.gaduradio.pl" port="80" authport="443"></server>
    </channel>
    <version>2008070201</version>
</list>

Mam nadzieję, że omawianie nie jest konieczne, każdy z analizą powinien sobie bez problemu poradzić.

Plik z sygnaturą dla listy kontaktów znajduje się pod podobnym adresem co sama lista, tylko z innym rozszerzeniem:

http://static.gaduradio.pl/stations/2008070201.sign

Niestety jego przeznaczenie nie jest znane.

Proces autoryzacji

Ogólny schemat jest prosty. Logujemy się na serwer Gadu Radia przy użyciu naszego konta w sieci Gadu-Gadu i pobieramy dane potrzebne do wyliczenia hasha, czyli wygenerowaną dynamicznie pozycję pliku wykonywalnego (gg.exe) komunikatora Gadu-Gadu z jakiej mamy wygenerować hash. Otrzymany hash odsyłamy do serwera, który w odpowiedzi odeśle nam adres strumienia i tymczasowe hasło ważne tylko jedną sesje z serwerem strumieniowym.

Cała wymiana danych w procesie autoryzacji odbywa się za pomocą szyfrowanych połączeń HTTPS. Otrzymywane odpowiedzi od serwera są porcjami danych zapisanymi w formacie CSV, gdzie jako znak separatora wykorzystano średnik.

Wartość pierwszego pole w danych otrzymywanych od serwera określa rodzaj odpowiedzi.

W całym etapie autoryzacji występują dwa główne rodzaje, są to odpowiedzi potwierdzające poprawne wykonanie zapytania i zawierające niezbędne dane, o które proszono w zapytaniu – wartość pola wynosi 1 oraz odpowiedzi oznajmujące wystąpienie błędu wraz z odpowiednim komunikatem jego dotyczącym – wartość pola wynosi 0.

Oprócz tych dwóch rodzajów, na różnych etapach autoryzacji można spotkać jeszcze inne, ale o tym wspomnimy w miejscu występowania.

Przejdźmy, zatem do szczegółowego opisu poszczególnych etapów autoryzacji.

Logowanie

Aby załogować się na serwer i otrzymać dane niezbędne do wyliczenia hasha musimy na jeden z serwerów dostępnych na liście z kanałami wysłać odpowiednie zapytanie GET:

/auth.gg?u=123456&p=password&c=33&v=7.7.0.3725&s=2008070201&w=5.2.4.703&r=0

Parametry u i p do dane do naszego konta gg, c jest identyfikatorem kanału muzyczny jaki chcemy słuchać (w tym przypadku „Gadu Radio Chillout”). Powinniśmy jeszcze podać wersję komunikatora Gadu-Gadu jaką używamy i z jakiej będziemy generować hash w parametrze v, używaną wersję listy kanałów w s oraz posiadaną wersję Winampa – parametr w. Znaczenie wartości parametru r bliżej nieznane.

Wszystkie parametry oprócz r są wymagane.

Na przykład dla kanału „Gadu Radio Chillout” będzie to równoważne z pobraniem strony:

https://gr-lb-1.gaduradio.pl/auth.gg?u=123456&p=password&c=33&v=7.7.0.3725&s=2008070201&w=5.2.4.703&r=0

W zależności od danych, jakie przekazaliśmy serwerowi w zapytaniu, otrzymamy odpowiednią odpowiedź.

Gdy popełniliśmy błąd, przekazali niepoprawne dane lub z jakiś innych powodów logowanie nie mogło dojść do skutku, otrzymamy pakiet z odpowiednim komunikatem błędu.

W przypadku podania błędnych informacji, otrzymamy jeden z kilku komunikatów:

0;1;Nie udało się zalogować przy pomocy podanego numeru i hasła.;
0;1;Żądany kanał nie istnieje.;
0;1;Podana wersja komunikatora jest błędna.;
0;1;Podana wersja Winampa jest błędna.;

W przypadku nie obsługiwanych wersji komunikatora lub Winampa:

0;1;Ściągnij najnowszą wersję komunikatora Gadu-Gadu i najnowszą wersję Winampa.;

Może się tez zdarzyć, ze wszystkie serwery Gadu Radia są w tej chwili pełne, wtedy dostaniemy odpowiedni komunikat:

0;1;Wszystkie serwery Gadu Radia są pełne, spróbuj ponownie za chwilę;

W aktualnych wersjach ciężko ‚spotkać’ powyższy komunikat błędu. Ale za czasów beta testów i pierwszych chwil życia usługi był dosyć często widywany ;)

Innym rodzajem odpowiedzi na jaki możemy trafić na tym etapie procesu autoryzacji jest przekierowanie, odpowiedź taka zawiera w pierwszym polu wartość 2, a jej struktura prezentuje się następująco:

2;frog5a.gaduradio.pl:443;GaduRadioNonRDSMessage;

Jak można zauważyć w polu drugim zawiera adres serwera, z którym należy ponowić logowanie, a w trzecim opcjonalną wiadomość lub wartość GaduRadioNonRDSMessage oznaczająca brak takowej.

Po adresie serwera (z pierwszych wersji usługi) można wywnioskować, że odpowiedź ta była tak, jak w przypadku przepełnienia serwerów, dosyć często widoczna w czasach młodości usługi, obecnie ciężko na nią trafić.

Gdy podaliśmy poprawne dane i uda nam się wreszcie zalogować to otrzymamy informacje niezbędne do wygenerowania hasha, ale o tym w następnym punkcie.

Generowanie hasha

Gdy uda nam się poprawnie załogować na serwer, dostaniemy potrzebne nam dane do dalszego procesu autoryzacji:

1;1;1;1;1;600;Trwa logowanie do GaduRadio...;
https://gr-grr-15.gaduradio.pl:443/auth.gg;
http://static.gaduradio.pl:80/stations/2008070201;;

Pierwsze cztery pola (nie licząc pierwszego pola, określającego rodzaj odpowiedzi) zawierają dane niezbędne do wygenerowania hasha, przeznaczenie następnego pola jest nieznane, z obserwacji wynika, że zawsze znajduje się tam stała wartość równa 600. Dalej znajduje się wiadomość tekstowa wyświetlana w panelu informacyjnym radia w komunikatorze Gadu-Gadu lub wartość GaduRadioNonRDSMessage. Kolejne pole zawiera adres serwera i skryptu, do którego musimy odesłać wygenerowany hash. Zawartość następnego pola jest adres pliku (bez rozszerzenia xml) zawierający aktualną listę kanałów. Pole to jest opcjonalne i gdy w zapytaniu służącym do logowania podaliśmy aktualną wersje listy kanałów, pole to pozostanie puste. Następne, ostatnie pole jest nieznane, z obserwacji wynika, że zawsze puste.

Dla czterech pól z interesującymi nas danymi potrzebnymi do wygenerowania hasha przyjmijmy oznaczenie pos1;len1;pos2;len2;.

Sam algorytm jest bardzo prosty. Czytamy z pliku gg.exe len1 bajtów poczynając od pozycji pos1 oraz len2 bajtów od pos2, a następnie oba te ciągi łączymy razem, a następnie powstały ciąg łączymy jeszcze z stringiem %_Martyna (jakaś dedykacja?). Z tak otrzymanego ciągu za pomocą algorytmu MD5 generujemy 128-bitowy skrót, który jest naszym hashem.

Tak jak wspominałem na początku, od czasu możliwości słuchania Gadu Radia via www metoda ta straciła swój potencjał, dlatego, że dane do wyliczenia hasha są zawsze takie same, pozycje i długości wynoszą 1. Zatem wyliczoną wartość hasha dla danej wersji komunikatora można umieścić na stałe w kodzie.

Gdy już wygenerujemy hash odsyłamy go do serwera (na adres otrzymany wyżej) poprzez zapytanie:

/auth.gg?u=123456&h=ea509f39d8b45bac63326036c14540d2&v=7.7.0.3725

Parametr u zawiera nasz numer gg, h wygenerowany właśnie hash, a v wersje gg jakiej używamy i z jakiej wyliczyliśmy hash.

Gdy jakieś dane nie były prawidłowe serwer odpowie nam jednym z kilku komunikatów błędu:

0;1;Podany numer Gadu-Gadu jest błędny.;
0;1;Błąd autoryzacji do Gadu-Radio.;

W przeciwnym razie, gdy wszystko przebiegło pomyślnie serwer odeśle nam miedzy innymi adres strumienia danego kanału i tymczasowe hasło, dzięki któremu będziemy mogli zalogować się na serwerze strumieniowym, ale o tym w następnym punkcie.

Odtwarzanie ;)

Po porwanym zalogowaniu i wygenerowaniu hasha, gdy wszystko pójdzie sprawnie i nie będzie żadnych niespodzianek, serwer powinien odpowiedzieć nam paczką danych podobną do tej:

1;gr-grr-13.gaduradio.pl:80/33;Z1Hd4jUxbE;Dodaj do kontaktow nr 431 i wejdz na www.mamma-mia.com.pl;;

Gdzie w pierwszym polu (nie licząc pola zawierającego rodzaj odpowiedzi) znajduje się adres strumienia kanału, a w następnym polu tymczasowe hasło niezbędne do zalogowania się na serwerze strumieniowym. Dalej znajduje się opcjonalna wiadomość wyświetlaną w panelu radia, a standardowo ostatnie puste pole nie jest nam znane.

Mając adres strumienia kanału, tymczasowe hasło oraz numer gg, jakiego użyliśmy do logowania i autoryzacji, możemy złożyć sobie url kanału, który ma postać:

http://123456:Z1Hd4jUxbE@gr-grr-13.gaduradio.pl:80/33

z którym teraz wystarczy się połączyć z dowolnego playera obsługującego strumieniowe przesyłanie mediów i możemy oddać się przyjemności słuchania Gadu Radia.

Uwagi

Nie wiem jak obecnie wygląda sytuacja, ale w czasach młodości usługi, serwer lubił nam odpowiedzieć na próbę logowania komunikatem błędu:

0;1;Błąd klient-serwer;

Prawdopodobnie działo się tak, dlatego, że serwer porównywał wersje Gadu-Gadu jakiej używamy, a dokładniej wersją jaką deklarowaliśmy przy pobieraniu informacjo o serwerach Gadu-Gadu z huba przy każdym włączeniu komunikatora z tą jakiej używamy do logowania się w Gadu Radio.

Rozwiązaniem problemu było pobranie informacji o serwerze Gadu-Gadu z huba appmsg.gadu-gadu.pl:

/appsvc/appmsg4.asp?fmnumber=123456&version=7%%2C+7%%2C+0%%2C+3725&fmt=2&lastmsg=2951&dlp=32

dokładnie z takim numerem wiadomości systemowej.

Dokładniejszy opis powyższego zapytania można znaleźć w dokumentacji protokołu Gadu-Gadu.

Jedno przemyślenie nt. „Autoryzacja w Gadu Radio”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *