[ИСПРАВЛЕНО] Новая уязвимость сервера

Madness aka null138

Участник
Сообщения
713
Реакции
734
Фикс - Fix (13.03.2022) #2 РАБОТАЕТ

Здравствуйте. Хочу рассказать об одной уязвимости движка которую я нашел примерно пол года назад, которая работает на очень многих и даже популярных серверах.
Все игры на движке Source начиная с 2007* года имеют эту проблему(насчет CS:GO не уверен, но судя по слитому коду все так же), позволяющую любому игроку за пару секунд заставить сервер дико тормозить вплоть до краша в некоторых случаях.
Заранее скажу, что слотовые сервера арены имеют немного преимущества здесь, так как на них игрока выкидывает с сервера, но лаги все равно проходят к сожалению и это нельзя называть полноценной защитой.

Весь прикол в спаме командами "rpt_client_enable, rpt_server_enable" которые и в придачу выполняются повторно на стороне сервера, от чего в консоли сервера выводится "Unknown command: rpt_client/server_enable".

Я сделал небольшую защиту используя сигнатуры функции CGameClient::ExecuteStringCommand(), но оно имеет ту же проблему как на арене о котором я уже сверху написал.
Предлагаю найти решение вместе, так как с выходом данного поста это необходимо.
 
Последнее редактирование:

Ganter1234

Участник
Сообщения
1,149
Реакции
667
просто заблокировать данные команды 😎
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
просто заблокировать данные команды 😎
никак, по крайнее мере обычным плагином на dhooks.
эти команды видны только через указанную мною функцию CGameClient::ExecuteStringCommand(), а в нем блокировка ничего не решает так как команда сама уже доходит до функции выполнения.

но если так подумать, то можно заставить функцию CGameClient::IsEngineClientCommand() вернуть 0 и это может уже и помочь, но это просто догадки.
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
никак, по крайнее мере обычным плагином на dhooks.
эти команды видны только через указанную мною функцию CGameClient::ExecuteStringCommand(), а в нем блокировка ничего не решает так как команда сама уже доходит до функции выполнения.

но если так подумать, то можно заставить функцию CGameClient::IsEngineClientCommand() вернуть 0 и это может уже и помочь, но это просто догадки.
Я пока в ксго проверил с 10 ботами, ничего кроме спама в консоли хостинга не получил (хотя возможно если 64 человек будет, то возможно заработает)
P.S. Такая же вещь в ксс, только спам в консоли
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Я пока в ксго проверил с 10 ботами, ничего кроме спама в консоли хостинга не получил
там нужно определенное количество, которая является максимальным возможным без buffer overflow и выкидывание с сервера.
думаю уже готовый бинд сюда скинуть реально глупо.
 

sladerev

Участник
Сообщения
323
Реакции
29
Ну че, у кого есть какие идеи, это пофиксить?)
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Не знаю как в CSS, но в CS:GO я бы попробовал хукнуть через PTaH
 

Stiker

Участник
Сообщения
25
Реакции
35
на ксго по умолчанию стоит
C-подобный:
sv_quota_stringcmdspersecond 40
так что на ксго не сработает
 

Boeing 767

заскамили мамонта ни за что, ни про что
Сообщения
524
Реакции
913
Не знаю кто бы и как пользовался, слишком долгий способ ддоса или краша, как удобней называйте. Пример простого фикса, как для ксс так и для ксго и всех игр, где есть эта команда.
Никаких хуков и отсутствие нагрузки, все обновляется само и в случае чего напишет ошибку.
Для компиляции нужен MemoryEx

C++:
#include MemoryEx

Pointer original_ptr;
BaseMemory mem_ptr;

public void OnPluginStart()
{
    original_ptr = g_hMem.FindString("engine.so","rpt_server_enable");
    MemAssert(original_ptr, "outdated str");

    original_ptr = g_hMem.FindValue("engine.so",original_ptr);
    MemAssert(original_ptr, "find xref");

    mem_ptr.SetAddr(original_ptr);
    original_ptr = PTR(mem_ptr.ReadInt());
    mem_ptr.WriteInt(0x0);
}
public void OnPluginEnd()
{
    if(original_ptr)
        mem_ptr.WriteInt(original_ptr);
}
void MemAssert( Address address, char[] error)
{
    if(!address)
        SetFailState(error);
}
 
Последнее редактирование:

sladerev

Участник
Сообщения
323
Реакции
29
Не знаю кто бы и как пользовался, слишком долгий способ ддоса или краша, как удобней называйте. Пример простого фикса, как для ксс так и для ксго и всех игр, где есть эта команда.
Никаких хуков и отсутствие нагрузки, все обновляется само и в случае чего напишет ошибку.
Для компиляции нужен MemoryEx

C++:
#include MemoryEx

Pointer original_ptr;
BaseMemory mem_ptr;

public void OnPluginStart()
{
    original_ptr = g_hMem.FindString("engine.so","rpt_server_enable");
    MemAssert(original_ptr, "outdated str");

    original_ptr = g_hMem.FindValue("engine.so",original_ptr);
    MemAssert(original_ptr, "find xref");

    mem_ptr.SetAddr(original_ptr);
    original_ptr = PTR(mem_ptr.ReadInt());
    mem_ptr.WriteInt(0x0);
}
public void OnPluginEnd()
{
    if(original_ptr)
        mem_ptr.WriteInt(original_ptr);
}
void MemAssert( Address address, char[] error)
{
    if(!address)
        SetFailState(error);
}
1647000272416.png

1647000300627.png
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
Не знаю кто бы и как пользовался, слишком долгий способ ддоса или краша, как удобней называйте. Пример простого фикса, как для ксс так и для ксго и всех игр, где есть эта команда.
Никаких хуков и отсутствие нагрузки, все обновляется само и в случае чего напишет ошибку.
Для компиляции нужен MemoryEx

C++:
#include MemoryEx

Pointer original_ptr;
BaseMemory mem_ptr;

public void OnPluginStart()
{
    original_ptr = g_hMem.FindString("engine.so","rpt_server_enable");
    MemAssert(original_ptr, "outdated str");

    original_ptr = g_hMem.FindValue("engine.so",original_ptr);
    MemAssert(original_ptr, "find xref");

    mem_ptr.SetAddr(original_ptr);
    original_ptr = PTR(mem_ptr.ReadInt());
    mem_ptr.WriteInt(0x0);
}
public void OnPluginEnd()
{
    if(original_ptr)
        mem_ptr.WriteInt(original_ptr);
}
void MemAssert( Address address, char[] error)
{
    if(!address)
        SetFailState(error);
}
однозначно крутая штука, и вправду удалил все ненужные команды через данный İNC. только данный плагин у меня так же отказывается работать, снизу скинул свою версию, с добавлением еще rpt_client_enable который так же тормозит сервер.
благодарность тебе и автору.
 
Последнее редактирование:

sladerev

Участник
Сообщения
323
Реакции
29
однозначно крутая штука, и вправду удалил все ненужные команды через данный İNC.
благодарность тебе и автору.
помогите пожалуйста, у меня не хочет работать.
sourcemod 1.10 css v92
Закомпилил, перезапустил серв, и не бум бум(
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
помогите пожалуйста, у меня не хочет работать.
sourcemod 1.10 css v92
Закомпилил, перезапустил серв, и не бум бум(

13.03.2022 - Уже неактуально, читаем главный пост.
Рабочая версия которую я проверил у себя. Под винду и под линукс(версия под линукс не работает).
 

Вложения

  • rptexploitfix_win.sp
    1 КБ · Просмотры: 21
  • rptexploitfix_linux.sp
    1 КБ · Просмотры: 31
Последнее редактирование:

Boeing 767

заскамили мамонта ни за что, ни про что
Сообщения
524
Реакции
913
Рабочая версия которую я проверил у себя. Под винду и под линукс.
В твоей версии чуть больше нагрузки, т.к патч не самих указателей в массиве, а самих строк, в результате чего цикл всё равно будет проходить по всем строкам. И как по мне это не особо нужно.

Ссылка на цикл: Клик
Ссылка на массив указателей на строки: Клик

В моём варианте происходит именно патч указателя внутри массива, в результате чего цикл по строкам остановится начиная с строки rpt_server_enable
Ну и писал под линукс, для винды просто engine.dll

Это скорее как придирка, нежели чем что-то существенное)
 
Последнее редактирование:

ASTEROID

Участник
Сообщения
74
Реакции
88
Я подозреваю, что плагин был запущен в игре, где нет команды rpt_server_enable , это не кс34 случаем?
У моего друга та же ошибка, но версия ксс не 34


Код:
L 03/12/2022 - 21:10:41: [SM] Exception reported: outdated str
L 03/12/2022 - 21:10:41: [SM] Blaming: rptexploit.smx
L 03/12/2022 - 21:10:41: [SM] Call stack trace:
L 03/12/2022 - 21:10:41: [SM]   [0] SetFailState
L 03/12/2022 - 21:10:41: [SM]   [1] Line 26, F:\SM\addons\sourcemod\scripting\rptexploit.sp::MemAssert
L 03/12/2022 - 21:10:41: [SM]   [2] Line 9, F:\SM\addons\sourcemod\scripting\rptexploit.sp::OnPluginStart
L 03/12/2022 - 21:10:41: [SM] Unable to load plugin "rptexploit.smx": Error detected in plugin startup (see error logs)
 
Сверху Снизу