PDA

Просмотр полной версии : Крокодил ВКонтакте - анализ багов приложения


mailbrush
30.03.2010, 01:47
Значит так, сегодня решил покопать эту игрушку. Авторы этого приложения не пожалели 35 000 рублей на специальный домен - kroko.vkontakte.ru, хотя 1 миллион пользователей, наверное, оправдывают цену.

Не туда что-то я пошёл, пожалуй, перейду к анализу приложения.


Удлинение хвоста Крокодила на N см.
Анализируя запросы и исходники Кроко, я увидел, что после выигрыша, отсылается запрос на api.vkontakte.ru, в котром указывается новая длина хвоста. Пример запроса:
http://api.vkontakte.ru/api.php?api_id=1709838&value=1000&sig=a32d41491c2717ee135f4747854c64f2&method=putVariable&random=4831976.466812193&key=1402&test_mode=1
Поясню список параметров:

api_id - ID приложения
value - длина хвоста в миллиметрах
random - абсолютно случайное число
test_mode - тестовый режим. Это позволяет тестировать приложение без загрузки его на сайт.
method - название метода API из общего списка функций. putVariable – записывает значение переменной.
key - номер переменной, в которой записывается её значение.
sig - это именно то, что нам нужно сгенерировать (найти), и над этим придется потрудится. sig - подпись, которая создается в целях безопасности. Параметр sig равен md5 от конкатенации следующих строк:

viewer_id – id текущего пользователя, переданный SWF посредством flashvars при инициализации.
пар "parameter_name=parameter_value", расположенных в порядке возрастания имени параметра (по алфавиту).
секрета приложения api_secret

Приведу пример: в запросе, который я написал выше, параметр sig равен a32d41491c2717ee135f4747854c64f2, тоесть md5 от
34595285api_id=1709838key=1402method=putVariablera ndom=4831976.466812193test_mode=1value=1000api_sec ret


Вроде-бы все есть, да только одного нету - секретного ключа приложения. Берем в руки SWF Decompiler, открываем в нем флешку Крокодила (далее - Кроко). Находим интересный класс - Const:
http://s12.radikal.ru/i185/1003/c2/30c564a24f93.jpg
Вот и все, секретный ключ приложения у нас: nM27UsOLVI.
Теперь никакого труда не составит сгенерировать sig, а соответственно послать запрос на увеличение длины хвоста в api.vkontakte.ru

Делаем md5 следующей строки:
YOUR_IDapi_id=1709838key=1402method=putVariableran dom=4831976.466812193test_mode=1value=LENGTHnM27Us OLVI

Изменяемые значение выделены и окрашены в оранжевый цвет, а именно:
YOUR_ID - ваш ID ВКонтакте.
LENGTH - необходимая длина в миллиметрах.

Получили sig? Отлично. Идем удлинять хвост, переходим по ссылке:
http://api.vkontakte.ru/api.php?api_id=1709838&value=LENGTH&sig=SIG&method=putVariable&random=4831976.466812193&key=1402&test_mode=1

LENGTH - необходимая длина хвоста.
Важно: не должна отличатся от той, что была при генерации sig
SIG - полученный sig.

Обновляем приложение, радуемся :)
Важно: пользователь, которому изменяется длина хвоста должен быть залогинен ВК

PS: Тому, кто ничего не понимает в том, что я написал выше написал специальный скрипт, который генерирует ссылку сам: http://hacker.hmarka.net/kroko.php


Экстрасенсорика или узнаем секретное слово
Эх, моя любопытность :) Берем в руки HTTPAnalyzer (сниффер (перехватчик) запросом. Жмем Start в нем, после чего в приложении нажимаем "Начать игру". Получаем несколько запросов. Первые два - для получения баннеров рекламы, третий - для кроссдомена, а последний - для получения параметров игры.

http://s43.radikal.ru/i102/1003/49/46e931e89a03.jpg

Именно он нас интересует. В теле ответа получаем следующее:
<?xml version="1.0"?><response><word>1079,1084,1088,1082,1082,1084,1091,1092</word><presenterPen>24</presenterPen><count>2</count><sessionId>95799079</sessionId><presenterId>34595285</presenterId><playerIds>34595285,19531510</playerIds><timeToStart>14992</timeToStart></response>
Это ответ в формате XML. То, что между <> и </> - это имя параметра, а то, что между именами - значение. На интересует только одно - word - зашифрованное слово. Но как его расшифровать? Опять берем SWF Decompiler, смотрим функцию расшифровки.

http://s001.radikal.ru/i195/1003/ce/70ca7a7eca2b.jpg

Единственным аргументом этой функции является именно этот word. Далее функция преобразовывает эту строку в массив, разбивая её через запятую. Позже создается цикл от 0 и до количества элементов массива минус 5 (5 последних цифр - мусор, который отбрасывается). В самом цикле переменной _loc_2 присваивается значение конкатенации строк _loc_2 и значение элемента массива _loc_3 с индексом _loc_4 минус _loc_4. Вот такая вот защита от "хакеров", но нам это не страшно :) Т.к. все обходится элементарно просто. Если закодирован первый символ был 1079, то его раскодирование = String.fromCharCode(1079 - 0), тоесть String.fromCharCode(1079). Второй был 1084, его раскодировка = String.fromCharCode(1084 - 1), тоесть String.fromCharCode(1083), и так далее, с каждым разом увеличивая _loc_4.

PS: Кто ничего не понял - юзает мою тулзу http://hacker.hmarka.net/kroko2.php


Ну, вобщем, все...

Если куда-то копируете, ссылку сюда давайте :) И еще мой копирайт :cool:

steyj
30.03.2010, 03:32
Нормаль, а может как нибудь для игры в покер чего ни будь создашь? К примеру видеть карты игрока

tiath
30.03.2010, 03:34
steyj а хохо не хуху? )))

steyj
30.03.2010, 03:43
Можно и такое в каком конверте

GlooK
30.03.2010, 04:25
Руки бы оторвать тому кодеру, кто юзает putVariable в приложениях.

netdimarik
30.03.2010, 04:40
ну чтоже ждём когда допишут )) а так респект !)

Zyon
30.03.2010, 07:54
Стало интересно, вот только приложение пока я это не юзал))

Assembler
30.03.2010, 12:11
Молодца, ай молодца. mailbrush по старой дружбе http://vkontakte.ru/app676982 тоже все перерыл именно этот Sig параметр тоже понял что надо сгенерировать но до сих пор не понял какие параметры в него шить. Помоги... Если что кинь в ЛС. Просто если догадаешься как это уже приват инфо в чистом виде...

regau
30.03.2010, 12:37
скинь на vkbugs.ru

Assembler
30.03.2010, 12:45
Пусть допишет сначала. Потом если захочет сам скинет. Я бы на его месте по другому бы сделал.

BELbIY
30.03.2010, 12:48
Ух ты сработало спс

Assembler
30.03.2010, 13:44
Вот от покера

Видимо два запроса отвечают 21 и 22

Вот 21


Вот сам запрос:
http://pokerex.skillclub.com/Entry.ashx?sig=2178f7f2456053709e3962139cf0e368&pid=9830377&method=max&val=70&salt=12378642&uid=9830377&key=21&auth%5Fkey=a34a0154ced6fe1a96e890f6a1517c60
Вот то что в запросе:
Sig 2178f7f2456053709e3962139cf0e368 - подпись
pid 9830377 мой ид
method max - че делать (метод)
val 70 - фишки
salt 12378642 =)
uid 9830377 мой ид
key 21 номер запроса
auth_key a34a0154ced6fe1a96e890f6a1517c60 - ключ авторизации

Вот 22

http://pokerex.skillclub.com/Entry.ashx?sig=de09d544e9eb1dc5aa6d5fc1c2880b03&pid=9830377&method=setScore&val=70&salt=10059406&uid=9830377&key=22&auth%5Fkey=a34a0154ced6fe1a96e890f6a1517c60

Sig de09d544e9eb1dc5aa6d5fc1c2880b03 - подпись
pid 9830377 мой ид
method setScore - че делать (метод) - Вот тут поставить счет.
val 70 - фишки
salt 10059406 =)
uid 9830377 мой ид
key 22 номер запроса
auth_key a34a0154ced6fe1a96e890f6a1517c60 - ключ авторизации - Он кстати одинаковый. Ну это и понятно =)

Походу тут мд5 + salt =(

Вот еще можно изменить все свои данные типо имя и т.д.
Режим Аноним

http://pokerex.skillclub.com/Entry.ashx?sig=d4eac27e295068c606e10de89f9f6a3d&salt=9923647&uid=9830377&method=setLabel&pid=9830377&label=9830377%7C%D0%98%D0%B3%D0%BE%D1%80%D1%91%D0% BA%7C%D0%9B%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1 %8C%7C%401cs4398%2E%403%2Fu9830377%2Fc%5Fcc2e1c85% 402%7C%401cs4398%2E%403%2Fu9830377%2Fb%5F1fd5d379% 402%7C112%7C%7C26%2E1%2E1989%7C%7C%7C2%7C%7C%7C&auth%5Fkey=a34a0154ced6fe1a96e890f6a1517c60

Sig d4eac27e295068c606e10de89f9f6a3d - подпись
pid 9830377 мой ид
method setLabel - че делать (метод) - Вот тут поставить данные о тебе.
salt 9923647 =)
uid 9830377 мой ид
label 9830377%7C%D0%98%D0%B3%D0%BE%D1%80%D1%91%D0%BA%7C% D0%9B%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C%7C %401cs4398%2E%403%2Fu9830377%2Fc%5Fcc2e1c85%402%7C %401cs4398%2E%403%2Fu9830377%2Fb%5F1fd5d379%402%7C 112%7C%7C26%2E1%2E1989%7C%7C%7C2%7C%7C%7C - тут данные обо мне
auth_key a34a0154ced6fe1a96e890f6a1517c60 - ключ авторизации - Он кстати одинаковый. Ну это и понятно =)

Осталось понять как sig подделать.

7on
30.03.2010, 14:25
как открыть флешку в SWF Decompiler
не получаетса , смотрел видео как делать, у них там появляется в експлорере кнопка, а у меня её нету(((

Assembler
30.03.2010, 14:55
https://www.sothink.com/download/swfcatcher.xpi

Аддон для мозилы.
Далее в инструменты и щелкай по нему.

7on
30.03.2010, 15:01
спс большое, но теперь она у меня сохранилась а там всего 9 кб, и нету конст((

Assembler
30.03.2010, 15:10
Мда. const есть но secret нет но судя по скрину маил браша че то мы не так делаем. У него название идет не api_wrapper.swf вобщем маилбраш ты где???

Assembler
30.03.2010, 15:21
Вобщем надо версию SWF Decompiler 5.4 скачивать
Таблетка


SWF Decompiler V5.4 build 535
Name: Registered
Code: 031U4A-K03QAX-6YDQBB-JTHN2J-2KEUCV-4MNAD0-KT9BVV-QN3B1W-HDJUZA-0AWPT8-6HWBJR-UBZYMK

Скачать от сюда
http://www2.sothink.com/download/swfdec.zip

mailbrush
30.03.2010, 16:41
Дописал до конца :)

маилбраш ты где???
В школе был.

ЗЫ: Мб потом поковыряю покер еще...

Assembler
30.03.2010, 16:59
Маил браш, слух отпиши Мне в личку ID 9830377

waik
30.03.2010, 17:55
Если куда-то копируете, ссылку сюда давайте :) И еще мой копирайт :cool:

Старался и оформлял долго,надеюсь ты одобришь. Кпирайт есть!

хttp://allcheats.ru/t163634/?uri=/t163634-post1942157/#post1942157

StiXy24
30.03.2010, 18:02
А по сути что от этого приложения7 Как я понимаю только понты.
mailbrush, против не чего не имею... просто не понимаю почему подняли такое активное обсуждение... вопрос один, реальные деньги на этом поднять можно7 Прочитал мельком, понял тему так, что можно выделится среди других и на этом точка.

Timofa
30.03.2010, 18:59
Заморочился парень ))) Эта игруля того не стоит.Я все это же в чарльз с ней делал.Плюс к тому и ручку себе сделал самую дорогую.Мелочь,а приятно )

Assembler
30.03.2010, 19:37
Эта нет но при этом есть дофига приложений которые работают по тому же принципу... А это уже абсолютно другая тема. И я знаю как на этом реально можно заработать причем не мало...

Assembler
30.03.2010, 19:40
И кстати маилбраш Ты говоришь исходняк разбирать. Как его выковырять то?

ViLKaa
31.03.2010, 17:48
в сурскоде страницы ищем 3456234yv823nf*ku4atfifr*324.ZIP
качаем, меняем расширение на swf и декомпилим всякими SWF декомпилерами

Neset
31.03.2010, 21:54
Такс...
Покерок ...
Просмотрел сниффер вобщем как такового в запросах нету ничего интересного как в кроко. Хотя может быть и есть просто я недопонимаю но походу sig гдето не там делаетс

В декомпиляторе примерно из интересного нашел следующее тоже не очень понимаю может кто пошарестее посмотрит
Насколько я понимаю это запрос на создание или присоеденение секрета

m_psTransactionsLoader.addSignature(Application.in stance.socialapi.CurrentApiNetworkSecretKey(), Preloader._instance.loaderInfo.parameters.vid);

Щас еще поковыряю мб еще че интересное или сам секрет найду...

Но одно я понял sig добавляется в запрос уже в готовом виде.... и пока хз я не знаю от чего зависит.

Такс может быть это, только если покопатья там несколько видов запроса и каждый выглядить по разному вот один из них
public function addSignature(param1:String, param2:String = "") : void
{
var _loc_4:String = null;
var _loc_3:* = new Array();
for (_loc_4 in m_variables)
{

if (_loc_4.length > 0 && _loc_4 != "sig")
{
_loc_3.push(_loc_4 + "=" + m_variables[_loc_4]);
}
}
_loc_3.sort();
m_variables["sig"] = MD5.encrypt(param2 + _loc_3.join("") + param1);
return;

________________________________

variables["sig"] = generate_signature(request_params, m_apiNetwork.VIEWER_ID, m_apiNetwork.SECRET_KEY)
Ага =) ищу дальше SECRET_KEY


________________________________

Что то нашел но не уверен что то что надо почему их два??

class VkApi extends Object implements CommonApi
{
private var m_manager:SocialApiManager;
private var m_apiID:String = "";
private var m_viewerID:String = "";
private static const URL_SERVER_VK:String = "http://api.vkontakte.ru/api.php";
private static const FIELDS_PROFILE:String = "uid,first_name,last_name,sex,photo,city,bdate,phot o_medium";
private static const GET_USERBALANCE:String = "getUserBalance";
private static const GET_PROFILES:String = "getProfiles";
private static const SECRET_KEY_631578:String = "7zDvXcB421";
private static const API_VERSION:String = "2.0";
private static const SECRET_KEY_676982:String = "2iStUcE4s0";
private static const GET_CITIES:String = "getCities";
private static const GET_APPFRIENDS:String = "getAppFriends"

__________________________________________________ _______________
И еще кусочек кода с запросом баланса
private function RequestGetUserBalance() : ApiRequestData
{
var _loc_1:Object = {api_id:m_apiID, v:API_VERSION, method:GET_USERBALANCE};
return new ApiRequestData(_loc_1, SocialApiManager.RQ_USERBALANCE);
}// end function

public function get SECRET_KEY() : String
{
var _loc_1:String = "";
switch(m_apiID)
{
case "676982":
{
_loc_1 = SECRET_KEY_676982;
break;
}
case "631578":
{
_loc_1 = SECRET_KEY_631578;
break;
}
default:
{
break;
}
}
return _loc_1;


************************************
ИЛИ МОЖЕТ Я ЗРЯ ИПАЛ ГОЛОВУ И ВСЕ ТАКИ ВОТ ОНО
private static const SKILL_CLUB_SECRET_KEY:String = "etostrashnoeslovo";
**************************************

Neset
31.03.2010, 22:19
Вобщем кто помозговитее помогите составить правильный запрос!!!! =) Маил браш может подумаешь чуток


PS: Я ассемблер, меня тупо забанили =)

Neset
01.04.2010, 17:54
Нашел приложение которое само все че надо генерирует бля ппц причем у паши дурова на страницее =)

http://vkontakte.ru/app35569

Щелкайте по скрину чтобы увеличить

http://www.imget.ru//images/2010/04/01/small_YQCKe2Q7lV.jpg (http://www.imget.ru/show/?img=/images/2010/04/01/YQCKe2Q7lV.jpg)

ZnikiR
01.04.2010, 21:39
Neset улыбнул.
Написал на javascript расшифратор word.
<html>

<head>

<TITLE>Расшифровываем Слово из приложения "Крокодил".</TITLE>
<SCRIPT>
function hack_begin()
{
input = document.fromCharCode.input.value;
massive = input.split(",");
i = 0
slovo = "";
predel = massive.length - 5;
while (i < predel){
nomer = massive[i];
nomer=nomer-i;
slovo = slovo + String.fromCharCode(massive[i]-i);
i++;
}
document.fromCharCode.output.value = slovo;
}
</SCRIPT>


</HEAD>

<BODY>
<H1 ALIGN=CENTER>&nbsp;</H1>
<H1 ALIGN=CENTER><font face="Verdana" size="2">Расшифровываем Слово из приложения <a href="http://kroko.vkontakte.ru">"Крокодил".</a></font></H1>
<H1 ALIGN=CENTER><font face="Verdana" size="2">Вставьте в поле параметр "word"</font></H1>
<p ALIGN=CENTER><font face="Verdana" size="2">Чтобы получить параметр "word" вам нужно использовать программу для перехвата пакетов.<br>Мы советуем Вам использовать программу Charles.<br>Под формой находится ссылка для скачивания.</font></p>
<p ALIGN=CENTER>&nbsp;</p>

<hr Size='1' color='#E6E6E6'/>
<FORM NAME=fromCharCode>
<p align="center">
<TEXTAREA ROWS=4 COLS=30 NAME=input>"Word"_Вставлять_сюда!</TEXTAREA>
<INPUT TYPE=Button VALUE="Расшифровать" onClick="hack_begin()">
<TEXTAREA ROWS=4 COLS=30 NAME=output></TEXTAREA>
</FORM>
</b></font>
</p>
</BODY></HTML>

*uNkN0Wn*
02.04.2010, 19:58
mailbrush если ты не против я напишу в твоей теме баг еще одного приложения. От создателей Крокодила. Не сильно полезное но все же может пригодится.
Игра Абракадабра. (http://vkontakte.ru/app1830851)
Заходим в приложение. Открываем HTTP Analyzer. В приложении нажимаем "Играть". В программе смотрим запрос http://188.93.17.214:8180/abbra/newAbbra?.... Видим это:
http://i055.radikal.ru/1004/12/075e20e58836.jpg
Дальше жмем правой кнопкой мыши и выбираем кодировку UTF-8 (Первую) :
http://s55.radikal.ru/i149/1004/6a/2ab33228f75f.jpg
После этого видим:
http://s40.radikal.ru/i090/1004/1a/74738fb43e0c.jpg
Правильными словами являются те, после которых стоят цыфры. Эти цыфры означают положение букв, тоесть в каких они строках, столбцах.

ZnikiR
02.04.2010, 22:35
2 unknow
старый баг.
и еще чисто моё мнение юзай чарлиз
response->xml

Neset
03.04.2010, 22:21
UP/ Тупо Маилбраш отпишись харошь тормозить.

Neset
04.04.2010, 19:52
Бля народ, толи не помню тли хз кто предыдущее сообщение набрал. Походу меня хакнули =) Я кстати Маил браш пишу через пробел олени =)

=CEMPER=
05.04.2010, 04:35
...на длинну фиксанули?

tinyM
05.04.2010, 22:58
фиксанули...а жаль,я неуспел воспользоваться)

T.i.p.
06.04.2010, 14:27
новый интерфей,может с ним и новые баги

unl1m
06.04.2010, 14:29
не актуально уже вроде как

bike
06.04.2010, 15:37
Актуально!Только что на длину заюзал.

ruslan444
06.04.2010, 22:28
Neset можешь оставить контакты??

variables["sig"] = generate_signature(request_params, m_apiNetwork.VIEWER_ID, m_apiNetwork.SECRET_KEY);
параметры какие допустим знаю
но в каком порялке генерируется сиг??
md5(param1=1param2=2VIEWER_ID=111SECRET_KEY) или (12111SECRET_KEY)

ruslan444
07.04.2010, 01:05
подскажите брутфорс который будет подбирать пароли по типу:
param1=1
param1=1param2=2param3=3param4=4
param1:1param2:2
param2=21
и т.д.
пробывал в passwordsPro комбинированный брут - что то не то...

T.i.p.
07.04.2010, 12:52
Все работает,только что убедился

Assembler
07.04.2010, 17:25
Neset можешь оставить контакты??


параметры какие допустим знаю
но в каком порялке генерируется сиг??
md5(param1=1param2=2VIEWER_ID=111SECRET_KEY) или (12111SECRET_KEY)


Это несет, просто забанен б6|л, Проядок алфавитнй походу. Но прога которую я описвал вiше (Приложение) оно само вIставляет их в нужном порядке. Так то юзай...