Взлом сервера Counter Strike или «Безопасность? Не… не слышал!»

    Добрый день.
    В с появлением различных сервисов, предоставляющих услуги хостингов игровых серверов, появилось много желающих сделать свой сервер, при этом, в ряде случаев, вопросы безопасности остаются проигнорированными.

    Пару месяцев назад, просматривая список серверов в поисках «где бы поиграть», я обнаружил сервер, в названии которого содержатся угрозы к тем, кто будет использовать читы.

    Первоначальный план созрел очень быстро: генерируем SteamID администратора, развлекаемся с читами на сервере, имея иммунитет.
    Генерировать SteamID я научился, пока писал VoiceCodecFix — модуль, который даёт возможность общаться с игроками, не обновившими Counter Strike. О нём и о загрузке asi-модулей, я, скорее всего, расскажу в другой раз.

    Зайдя на сервер с администраторской учёткой и обнаружив, что у меня есть доступ к amx_rcon я уже было подумал, что получил доступ к учётке главного администратора, однако, всё прояснилось несколько позже.

    Небольшое отступление по поводу прав доступа в Counter Strike

    Есть права, которые предоставляются модулем AmxModX, они выставляются флагами (a-u), флаг z — обычный игрок.
    Какой флаг за что отвечает, можно посмотреть здесь.
    Администратор с флагом amx_kick, amx_ban, и т. д. и т. п., не может как-либо воздействовать на игрока, у которого стоит флаг иммунитета.

    Также, есть доступ, предоставляемый RCON-паролем (Remote Console, насколько я понимаю). Думаю, здесь будет уместна аналогия с ssh-ключом. В общем, давать его всем подряд — не самая хорошая мысль.
    Это, фактически, прямой доступ к к консоли сервера.

    Команда amx_rcon несколько облегчает использования Rcon-a, но и имеет «обратную сторону медали». Администратор, имеющий доступ к этой команде имеет доступ и к amx_showrcon, с помощью которой можно узнать RCON-пароль. Отличаются они тем, что amx_rcon не выводит результат выполнения в консоль, а amx_showrcon — выводит.
    Код, отвечающий за amx_rcon выглядит так:
    public cmdRcon(id, level, cid)
    {//в id хранится идентификатор того, кто эту команду использует. Остальные атрибуты нужны для проверки прав доступа.
    	if (!cmd_access(id, level, cid, 2))
    		return PLUGIN_HANDLED//Если нет доступа, прекращаем выполнение команды.
    	
    	new arg[128], authid[32], name[32]
    	read_args(arg, 127)
    	get_user_authid(id, authid, 31)//Получаем SteamID использующего эту команду.
    	get_user_name(id, name, 31)//Получаем его имя.
    	log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")", name, get_user_userid(id), authid, arg)//Записываем в лог, что он произвёл какое-то действие с RCON-ом.
    	console_print(id, "[AMXX] %L", id, "COM_SENT_SERVER", arg)//Пишем в консоль того, кто эту команду использовал, что-то вроде "команда отправлена на сервер".
    	server_cmd("%s", arg)//Выполняем команду в консоли сервера.
    	return PLUGIN_HANDLED
    }
    

    Прочитать то, что написал сервер у себя в консоли и вывести обратно игроку средствами AmxModX не представляется возможым.

    Команда amx_showrcon фактически заменяет 2 стандартные команды, за которые отвечает движок, и для работы которых не нужны модули:
    rcon_password _пароль_
    rcon _команда_

    public cmdShowRcon(id, level, cid)
    { 
    	if (!cmd_access(id, level, cid, 2))
    		return PLUGIN_HANDLED	
    	new password[64]
    	get_pcvar_string(rcon_password, password, 63)//получаем значение CVar "rcon_password"
    	if (!password[0])
    	{
    		cmdRcon(id, level, cid) // Если RCON-пароль на сервере не установлен, выполняем обычный amx_rcon
    	} 
    	else 
    	{
    		new args[128]
    		read_args(args, 127) //считываем аргументы команды
    		client_cmd(id, "rcon_password %s", password)//устанавливаем нужное значение rcon_password администратору
    		client_cmd(id, "rcon %s", args)//выполняем команду из консоли администратора.
    	}
    	return PLUGIN_HANDLED
    }
    

    То есть, после использования этой команды, достаточно посмотреть, каким стало значение rcon_password, чтобы узнать RCON-пароль сервера. Узнав его можно:
    1. Изменять настройки сервера (Поставь гравитацию 10000000, говорили они, это весело, говорили они)
    2. Переименовать сервер.
    3. Кикать игроков, даже тех, у которых есть иммунитет (rcon kick #userid).
    4. Менять карту на своё усмотрение (rcon changelevel _mapname_)
    5. Менять результат голосования за следующую карту (rcon amx_nextmap _mapname_)
    6. Банить от имени сервера
    … короче, творить всяческие безобразия.

    Посмотрев командой amx_who какие права кому выданы… в общем, это была не учётка главного администратора. Они всем администраторам ставили все доступные флаги.
    В качестве теста я решил кикнуть одного администратора, который громко ругался на сервере и мешал играть, написав в причине «помолчи». Об этом «инциденте» им тут же была создана тема в группе сервера, мол «меня кто-то кикает».
    Главный администратор не придумал ничего лучшего, чем снять со всех администраторов доступ к amx_kick.
    Так как подделать SteamID достаточно просто, я решил написать об этом главному администратору, который занимался выставлением прав доступа. В ответ получил «Раз ты такой умный, почему ты до сих пор не купил у нас админку?». (Действительно...)
    В общем, после наглядной демонстрации возможности кикать администраторов, используя rcon, вместо того, чтобы как-то ограничить у администраторов доступ к amx_rcon он выдал мне бан по IP-адресу, «чтобы не лез, куда не надо».
    Это так у нас теперь благодарят за найденную уязвимость.

    Ну чтож, пишем небольшой скрипт, который кикает всех игроков с сервера и закрывает сервер паролем. Весело, надёжно.
    Опять таки, вместо того, чтобы убрать у админов доступ к Rcon-паролю, главный админ решил перевести их на доступ по комбинации ник- пароль
    Про то, чтобы поменять RCON-пароль никто так и не подумал.

    Часть вторая, получаем доступ к MySQL от AmxBans сервера

    Сейчас стало модно держать отдельную веб-страничку со списком игроков, забаненных на сервере.
    Этот список формируется из MySQL таблицы, данные в которую заносит плагин AmxBans.
    Так же, AmxBans позволяет хранить информацию о админах не в файле users.ini, а в той же самой БД.
    Данные для доступа к этой базе прописываются в кварах(CVar) сервера. Их можно прочитать командой rcon amxx cvars
    Нас интересуют значения:
    amx_sql_host
    amx_sql_user
    amx_sql_pass


    В качестве способа общения с БД, я традиционно использую SQLYog
    База принадлежала игровому хостингу и была настроена на доступ только с доверенных IP-адресов.
    SQLYog может использовать HTTP-туннель для доступа к базе, для этого достаточно закинуть SQLyogTunnel.php на нужный ресурс и указать к нему путь.
    Пришлось немного раскошелиться и купить на этом же хостинге сервер и страничку для AmxBans. На всё про всё- 200 рублей.

    В базе данных AmxBans все пароли хранятся в виде MD5 хешей. Всего их там было около 50, при этом практически все были раскодированы с помощью сервиса по декодированию различных хешей так как состояли из 7-8 цифр без использования каких-либо буквенных символов.

    Выставлением прав доступа прямым редактированием БД мало кто занимается, поэтому на веб-странице AmxBans можно залогиниться под администраторской учёткой и выставлять права через удобный веб-интерфейс.
    Там было 3 администратора. Их пароли так же хранятся в виде MD5 хешей, но у одного был длинный и с виду надёжный пароль, но он состоял из часто встречаемых слов и года, у другого — дата рождения. Пароль третьего был расшифрован где-то через час.

    Сообщать об этом администрации, я, разумеется, уже не буду, более того, когда я сообщил о уязвимости первый раз, мне было сказано, что из-за того, что я нашёл уязвимость и сообщил о ней администрации — «сам понимаешь доверие пропадает». (Ну да, действительно, надо было пользоваться и ни кому о ней не говорить :) )

    PS: Судя по всему, никаких выводов они так и не сделали. Там стали появляться новые администраторы с правами «abcdefghijklmnopqrstu», и опять эти права выдаются по SteamID.

    PPS: Ещё до того, как перейти к «активной фазе действий» с генерацией SteamID администратора, я предложил им свою безвозмездную помощь по исправлению некоторых недочётах в плагинах. В ответ мне было сказано что-то вроде «в помощи школоты не нуждаемся».
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 39
    • +8
      TL;DR: Не используйте dproto или подобную фигну которая позволяет играть на вашем сервере без Steam'a.
      • +1
        На тех серверах только 5-6 Steam игроков обитается. Им без Dproto никак.
        • +1
          В таком случае имеем, что имеем. :)
          • 0
            Не совсем.

            Если ингейм админки выдавать на ник+адекватный_пароль, а лучше ник+адекватный_пароль+статик_IP и не использовать готовые решения вроде anxbans (ЕМНИП репутация у него так себе) до следующего паблик сплоита можно особо не волноваться за сервер.
      • +2
        Прям ностальгия берет, спасибо за пост!

        На самом деле явный признак безграмотности администрации игрового сервиса, с таких только «лулзы» ловить, пока не научатся.
        Для защиты rcon пароля в своё время использовалось RCON Defencer .
        А вот про генерацию SteamID я впервые слышу, где можно почитать?
        • +4
          Про сам алгоритм генерации SteamID у RevEmu можно почитать в исходниках Dproto. У первых версий они были открытыми.
          Там вся сложность заключается в том, что так или иначе нужно подбирать строку, которая даст нужный хеш.
          Хеш считается по такому вот алгоритму и должен быть равен желаемому SteamID.
          unsigned int CRevSteamID::revHash(const char* Str) 
          {
          	int i;
          	unsigned int Hash;
          	int CurChar;
          
          	i = 0;
          	Hash = 0x4E67C6A7;
          	CurChar = Str[i++];
          	while (CurChar)
          	{
          		Hash ^= (Hash >> 2) + CurChar + 32 * Hash;
          		CurChar = Str[i++];
          	}
          	return Hash;
          }
          

          Пока варианта лучше, чем банальный брутфорс я не придумал.
          И да, таким методом можно сгенерировать только SteamID вида STEAM_0:0:XXXXXXX…
          STEAM_0:1:XXXXXXX -генерации таким методом не поддаётся.

          В прочем, думаю, я об этом напишу в статье про способ включения Speex-кодека в новых версиях КС.
          • 0
            antibrute.sma
            #include <amxmodx>
            
            #define PLUGIN "Random Rcon"
            #define VERSION "1.0"
            #define AUTHOR "Sho0ter"
            
            #define TASK_RCON 121212
            
            new g_Rcon
            new g_Period
            new g_MaxRandom
            new i_Rcon
            new i_MaxRandom
            
            public plugin_init()
            {
            	register_plugin(PLUGIN, VERSION, AUTHOR)
            	g_Rcon = register_cvar("amx_rcon_random", "1")
            	g_Period = register_cvar("amx_rcon_period", "1.0")
            	g_MaxRandom = register_cvar("amx_rcon_max", "1000000000")
            	set_task(1.0, "change_rcon", TASK_RCON)
            	return PLUGIN_CONTINUE
            }
            
            public change_rcon()
            {
            	if(g_Rcon)
            	{
            		i_MaxRandom = get_pcvar_num(g_MaxRandom)
            		i_Rcon = random_num(0, i_MaxRandom)
            		set_cvar_num("rcon_password", i_Rcon)
            		set_task(get_pcvar_float(g_Period), "change_rcon", TASK_RCON)
            	}
            	else
            	{
            		remove_task(TASK_RCON)
            	}
            	return PLUGIN_CONTINUE
            }
            
            
            • 0
              Всегда менять пароль на рандомный? Проще RCON отключить.
            • +5
              32бита конечно недолго сбрутить, но для таких простых хэшей можно использовать SMT солверы. Пример кода для z3. Для любого хэша находит строчку моментально
          • 0
            Спасибо за пост. Ностальгия =)

            В бытность свою «главным» администратором целого портала решил вопрос с помощью MyAC и выдал админки через AmxBans используя myacid который брал за основу серийники железяк.

            А еще писал свои плагины для аренды и защиты ников, покупки админки, цветного чата за «премиум» аккаунт, продажи опыта на сервере с модом UWC3… Уууух было время!
            • 0
              Статья интересная, явно выделяется на фоне остальных статей в теме Информационой безопасности (как, вы ещё не читали про XSS?) Я хоть и не сильно шарю в конкретно этой области безопасности, но смог тем не менее оценить технические навыки ума автора, умении анализировать ситуацию и его настойчивость в достижении цели.

              И у меня возник вопрос: чем обусловлено наличие такого количества свободного времени у автора, что он может позволить себе тратить его на совершенно чужой ему проект таким вот образом:
              предложил им свою безвозмездную помощь по исправлению некоторых недочётах в плагинах

              При чём, я так понимаю, предложение было довольно настойчивым. В плане того, что оно от автора исходило несколько раз:

              Так как подделать SteamID достаточно просто, я решил написать об этом главному администратору, который занимался выставлением прав доступа. В ответ получил «Раз ты такой умный, почему ты до сих пор не купил у нас админку?».


              и
              PPS: Ещё до того, как перейти к «активной фазе действий» с генерацией SteamID администратора, я предложил им свою безвозмездную помощь по исправлению некоторых недочётах в плагинах. В ответ мне было сказано что-то вроде «в помощи школоты не нуждаемся».


              • +2
                Да там пару глупых косяков я поправить хотел, таких как:
                1. Админы могут брать оружие в первом раунде, например AWP (правилами это запрещено, я хотел сделать так, чтобы это было просто невозможно)
                2. На картах 35_hp, awp_, aim_, и других «специфических» админы по-прежнему могут брать оружие.
                Так что, тут не так уже много времени надо было.
                • +1
                  Chuvi
                  Ещё раз хочу подчеркнуть, что статья действительно довольно интересна по своей технической части. Меня интересует другая сторона статьи. Повествовательная.

                  Ну, вопрос не в том насколько много времени автор готов потратить на фикс косяков. А на сам факт.
                  Если сделать некую квинтэссенцию статьи, то получается вот что:

                  1.Находите баг, тратите время и силы для реализации пруфа в серваке принадлежащим совершенно не знакомым автору людям.
                  2. Пишите админу, получаете грубый ответ и бан на попытку безвозмездной (точно безвозмездной?) помощи.
                  3. Не падаете духом, движимые советом Иисуса «кто ударит тебя в правую щеку твою, обрати к нему и другую», снова им пишете.
                  4. Всё равно не реагируют и снова грубость. Опечалившись сотворить добро своими руками — пишете статью (в надежде повлиять на ситуацию и склонить админов пропатчится, без какого-либо злого умысла, правда?). В статье выгодно выделяетесь как добродетель, админы — как ось зла.

                  Может ли быть такое? Ну, допустим… Но мы же историю знаем только со слов автора. А на сколько она правдива? Давайте допустим, что:

                  1. Автор знал админов. Админы с автором повздорили. И автор проявил не дюжие способности к анализу сервака (даже учитывая уже имевшийся опыт работы с модулем VoiceCodecFix). Этим объясняется его упорство в решении задачи поиска бага.
                  2. Автор не писал админам о багах. Они ему были самому нужны — он решил «наказать» негодных админов.
                  3. Не получив должного удовлетворения от содеяного, создал пост тут. Используя хабраэффект для усиления очернения админов.

                  Пусть каждый сам решает какая история ближе к правде. Я же не утверждаю, что было всё по второму варианту. Это только предположение. Но для себя, с высоты своего жизненного опыта, могу сказать.
                  Первый вариант истории может быть при условии, что автор и есть ангел, которому не свойственно обижаться, и им движет только добродетель.
                  Второй вариант истории ближе к жизни и к человеческим недостаткам, которыми, увы, все мы, смертные, полны.

                  P.S. Парируя возможные вопросы насчёт моей попытки очернить автора, мотивируя это моей завистью к нему, отвечу. Причин для зависти нет. У меня уже были статьи в Лучших за 24 часа. А насчёт кармы и рейтинга (эти показатели у меня ниже) — ну, я же не пишу такие комменты всем, у кого они выше.
                  • 0
                    На самом деле, эта история происходила не за один день и даже не за один месяц. Ну да, я несколько сжал повествование.
                    Свободное время у меня штука такая… оно то есть, то его нет. Иногда его может не быть месяц и более.
                    История эта, по-факту, началась где-то с середины лета, я ещё тогда немного «пошатал» им сервер. Тогда они перевели админки на логин-пароль, но, как оказалось, на время. Эта статья — результат не понимания простейших аспектов безопасности с их стороны.

                    Тут несколько длинноватая история получится, если писать всё с самого начала. Так что в кратце.
                    1. Да не тратил я «время и силы на реализацию пруфа». Я месяц только генератор SteamID делал, ибо только по несколько часов в неделю мог этим заниматься.
                    2. Вот тут, как оказалось, я был не прав. По факту — админ сначала ничего не ответил, но сообщение было помечено как «прочитанное». Короче, сам себе напридумывал. :)
                    3. Тут вы не правы. Я сначала их уже во-второй раз «пошатал», а потом уже написал, что нужно сделать, чтобы этого не повторялось. В ответ было «у нас всё нормально».
                    4. Статью пишу, чтобы они таки поняли, что у них не «всё нормально».

                    И да, я из статьи убрал целый кусок про доступ к FTP. У них пароли от FTP были прописаны в поле rcon-паролей от сервера в базе AMXBans.
                    Теперь они там не прописаны. Как они там оказались — никто так и не понял. :)
                • –2
                  На самом деле, практически не выделяется.
                  Для грамотного админа игрового сервера, подмена steamid это практически как xss для веб разработчика. (подменил стим ид схоже с «увел сессию» хотя и не является полностью тем же самым, но доступ к «админцентру» появляется)
                  Софт для подмены steamid уже гуляет по сети, а все проблемы от неграмотной настройки модуля dproto.

                  Ну автор имеет свободное время наверное согласно возрасту (это не обида, констатация факта).
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • –2
                      Насколько? 20? 22? shanker скорее всего старше.
                      PS. У меня тоже свободного времени вагон.
                      • +3
                        Гадай@В профиль не смотри.
                        • 0
                          Я как бэ смотрел в профиль перед ответом.
                • +1
                  Нубский вопрос: что именно понимается под словом «админка», и почему это продают?
                  • +3
                    Там, где это не продают, админка это набор административных полномочий (банить, кикать игроков, и т.д.), позволяющих поддерживать порядок на сервере.
                    Там, где продают, это способ выделиться из толпы — бесплатное оружие в начале раунда (см. коммент выше), зелёный цвет в чате, прикольные шапки, в особо тяжёлых случаях — неуязвимость, повышенный урон пушек, и т.д.
                    • +1
                      Это основной способ монетизации CS серверов.
                      • 0
                        К сожалению, именно этим большинство серверов стало «не играбельным». Каждый «школоло» считает себя админом и если вы его убили — будете сразу же забанены «за читы». Увы и ах…
                      • 0
                        Выглядит как чистосердечное признание.
                        • +1
                          а как же самое интересное? почему так мало подробностей про шутки на серваке?
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              а форум контент в php хранит? вот это победа я щитаю…
                              • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              Генерация SteamID это интересно, не слышал что можно себе желаемый ID подсовывать. А вот amxbans это они конечно зря.
                              Спасибо за пост.
                              • 0
                                У нас авторизация админов по нику + setinfo _pw, права ограничены. RCON отключил после взлома и анализа логов. Пароль просто сбрутили.
                                • +2
                                  no-steam игроки себя уже наказали, зачем еще и ломать их сервер?
                                  • 0
                                    Вообще ЦА этих серверов — школьники в лицензию не играют.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      На самом деле не так сильно. Они такие косые изза установки дополнительных модулей. Т.е допустим голый nginx не особо косой, но когда добавить apache/php-fpm появляется больше возможных уязвимостей.
                                    • 0
                                      ггггг, какой добрый автор.
                                      если бы я обладал такими скиллами, да получил такой ответ — это с моей-то обидчивостью. ууух, они бы плакали :-)))
                                      • 0
                                        В своё время давал админки по Steam ID + _pw. Пароль генерировал сам. Но тут тоже не без нюансов: если setinfo переполнен (чем грешат пиратские сборки, пихая туда всякий хлам), пароль может не поместиться. Из-за этого были постоянные жалобы, вроде: «Аааа, за что забрал админку».
                                        Достали =)
                                        • +2
                                          Никого не хочу обидеть. Среди держателей серверов есть и серьезные люди, но большинство из админов — это школьники, считающие себя гуру IT. Похоже Вы нарвались именно на такого индивида.
                                          • 0
                                            Банальный же косяк, который встречается ооочень часто
                                            • 0
                                              Великий взлом CS сервера — генерирование SteamID :-)
                                              На нормальных серверах ни один админ не ставит права по steamid. все только через setinfo

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.