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

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

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

Первоначальный план созрел очень быстро: генерируем 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 администратора, я предложил им свою безвозмездную помощь по исправлению некоторых недочётах в плагинах. В ответ мне было сказано что-то вроде «в помощи школоты не нуждаемся».
Good afternoon.
With the advent of various services that provide hosting services for game servers, there are many who want to make their own server, while, in some cases, security issues remain ignored.

A couple of months ago, looking at the list of servers in search of “where to play,” I discovered a server whose name contains threats to those who will use cheats.

The initial plan matured very quickly: we generate the SteamID of the administrator, have fun with cheats on the server, having immunity.
I learned how to generate SteamID while writing VoiceCodecFix - a module that allows you to communicate with players who have not updated Counter Strike. About him and about loading asi-modules, I will most likely tell you another time.

Having entered the server with administrator account and found that I have access to amx_rcon, I already thought that I got access to the account of the main administrator, however, everything became clear a little later.

A small digression about Counter Strike permissions

There are rights that are granted by the AmxModX module, they are set with the flags (a-u), the z flag is an ordinary player.
Which flag is responsible for what, you can see here.
An administrator with the flag amx_kick, amx_ban, etc., etc., cannot influence the player who has the immunity flag in any way.

Also, there is access provided by the RCON password (Remote Console, as I understand it). I think the analogy with the ssh key would be appropriate here. In general, giving it to everyone is not a good idea.
This is, in fact, direct access to the server console.

The amx_rcon command makes it easier to use Rcon-a, but it also has a "flip side." An administrator with access to this command also has access to amx_showrcon, with which you can find out the RCON password. They differ in that amx_rcon does not output the result of execution to the console, and amx_showrcon - outputs.
The code responsible for amx_rcon looks like this:
public cmdRcon (id, level, cid)
{// id contains the identifier of the person who uses this command. The remaining attributes are needed to verify access rights.
    if (! cmd_access (id, level, cid, 2))
        return PLUGIN_HANDLED // If there is no access, terminate the command.
    
    new arg [128], authid [32], name [32]
    read_args (arg, 127)
    get_user_authid (id, authid, 31) // Get the SteamID using this command.
    get_user_name (id, name, 31) // Get its name.
    log_amx ("Cmd: ^"% s <% d> <% s> <> ^ "server console (cmdline ^"% s ^ ")", name, get_user_userid (id), authid, arg) // Write to the log that he did some action with RCON.
    console_print (id, "[AMXX]% L", id, "COM_SENT_SERVER", arg) // We write to the console of the one who used this command, something like "the command was sent to the server".
    server_cmd ("% s", arg) // Run the command in the server console.
    return PLUGIN_HANDLED
}

It is not possible to read what the server wrote in its console and display it back to the player using AmxModX tools.

The amx_showrcon command actually replaces 2 standard commands for which the engine is responsible and for which modules are not needed:
rcon_password _password_
rcon _command_

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) // get the CVar value "rcon_password"
    if (! password [0])
    {
        cmdRcon (id, level, cid) // If the RCON password is not set on the server, execute the usual amx_rcon
    }
    else
    {
        new args [128]
        read_args (args, 127) // read the arguments of the command
        client_cmd (id, "rcon_password% s", password) // set the desired rcon_password value to the administrator
        client_cmd (id, "rcon% s", args) // execute the command from the administrator console.
    }
    return PLUGIN_HANDLED
}

That is, after using this command, it is enough to see what the rcon_password value has become to find out the server’s RCON password. Having learned it, you can:
1. Change server settings (Set 10,000,000 gravity, they said, it's fun, they said)
2. Rename the server.
3. Kick players, even those who have immunity (rcon kick #userid).
4. Change the card at your discretion (rcon changelevel _mapname_)
5. Change the voting result for the next card (rcon amx_nextmap _mapname_)
6. Ban on behalf of the server
... in short, create all kinds of disgraces.

Having looked at the amx_who team what rights were given to whom ... in general, this was not a record of the main administrator. They set all available flags to all administrators.
As a test, I decided to kick one administrator, who swore loudly on the server and interfered with playing, writing “shut up” for the reason. He immediately created a topic about this "incident" in the server group, saying, "Someone kicks me."
The main administrator did not come up with anything better than to remove access to amx_kick from all administrators.
Since faking SteamID is quite simple, I decided to write about it to the chief administrator, who was involved in setting permissions. In response to
У записи 1 лайков,
0 репостов.
Эту запись оставил(а) на своей стене Rus Shamsutdinoff

Понравилось следующим людям