Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Mikołajki z sekurakiem! od 2 do 8 grudnia!
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Mikołajki z sekurakiem! od 2 do 8 grudnia!
Kliiiiikbait – bo sposób nie był banalny! A nie, czekaj, sposób był banalny, jak już się wiedziało co i jak. No dobra, nie taki banalny.
Ech… zobaczmy o co chodziło w bugu, który został wykorzystany bojowo 3 lata temu i nieco później załatany.
Idąc od końca, efekt na koncie gracza-hackera był taki:

Idąc od początku:
1. Analiza binarki gry:
2. Można zacząć szukać podatności.
3. Może coś w FindGame() ?
byte[] array = Guid.NewGuid().ToByteArray();
long currentFsgId = FiresideGatheringManager.Get().CurrentFsgId;
bnet.protocol.game_master.Player player = new bnet.protocol.game_master.Player();
Identity identity = new Identity();
identity.SetGameAccountId(gameAccountId);
player.SetIdentity(identity);
player.AddAttribute(ProtocolHelper.CreateAttribute("type", (long)bnetGameType));
player.AddAttribute(ProtocolHelper.CreateAttribute("scenario", (long)scenarioId));
player.AddAttribute(ProtocolHelper.CreateAttribute("brawl_library_item_id", (long)brawlLibraryItemId));
player.AddAttribute(ProtocolHelper.CreateAttribute("deck", deckId));
player.AddAttribute(ProtocolHelper.CreateAttribute("aideck", aiDeckId));
player.AddAttribute(ProtocolHelper.CreateAttribute("request_guid", array));
player.AddAttribute(ProtocolHelper.CreateAttribute("fsg_id", currentFsgId));
...
BattleNet.FindGame(gameProperties, new bnet.protocol.game_master.Player[] { player });
Odpalenie FindGame() już po dołączeniu do gry wywala (samego siebie) z gry. Tj. restart klienta i ponowne podłączenie. Nic wielkiego. Ale co by się stało gdyby gameAccountId podmienić na ID innego gracza? Jeśli dodatkowo ustawię dobry deckId (docelowego gracza), to klient gry tego gracza rozłącza się, restartuje i ponownie podłącza do gry.
Skąd poznać gameAccountID kogoś innego? To gra nam prezentuje w standardzie. Co z deckId? Można użyć tutaj wartości 0 (zero) – odpowiadającej temu deckowi.
4. Do boju.

Ciężko powiedzieć czy Blizzard (oraz gracze) byli zachwyceni takim obrotem sprawy. No dobra, Blizzard chyba finalnie tak, bo błąd został zgłoszony w ramach programu bug bounty i została wypłacona nagroda $2500.
PS
Pamiętajcie żeby takie “zabawy” wykonywać zawsze etycznie i przypadkiem nie rozwalić całej gry.
~Michał Sajdak
Michale Sajdaku, kiedy wyniki konkursu na najlepszy artykuł? Ludzie wciąż czekają.
Odpowiedź jest prosta: najlepszy artykuł nie został jeszcze nadesłany. Konkurs nadal trwa ;)