четверг, 21 апреля 2016 г.

Уязвимости работы с файлами в Counter-Strike

Вступление

В данной статье мне бы очень хотелось рассмотреть с вами одну интересную заднюю дверь, которая существует в клиентах и серверах движка GoldSource ниже 5999 билда. Она позволяет серверам менять игрокам файлы, записывая в них свой мастерсервер или редактируя игровое меню, добавляя туда кнопку своего сервера. Клиентам же она позволяет загружать на сервера различные конфигурационные файлы (cfg), благодаря которым можно, например, установить свой rcon_password.
Проанализировав ссылки поисковой системы Google я пришел к выводу, что эта тема до сих пор не была полностью раскрыта. Всех, кто просил рассказать про это дело - гнали к шею. И есть за что, на самом деле, так как вряд ли сообщество захотело бы, чтобы в нём появился ещё один сервер, который навязывает свой мастерсервер и игровое меню. Но сейчас я всё же хочу рассказать, как это работает во всех деталях, так как я нахожу эту тему довольно интересной и загадочной, а в конце мы попробуем отредактировать себе файл MasterServer.vdf через motd_write. Наберитесь терпения, так как текста будет достаточно.
Чтобы понять, в чем проблема движка, который позволяет себе выполнять такие вещи с файловой системой, нужно поинтересоваться у него самого по этому поводу. Я это уже сделал сам и сейчас всё расскажу.




Как это работает?

Все неприятности крутятся вокруг функции под названием IsSafeFileToDownload, с помощью которой на свет был рожден не один эксплойт. Цель этой функции, как можно догадаться из ее названия, это проверка пути файла на его безопасность. То есть если файл имеет расширение, скажем, ".exe", то он считается небезопасным. Также функция проверяет, происходит ли выход файла на верхний уровень текущей директории благодаря символам "..", а также не допускает использование символа ":", так как это означает вход в корень диска, а в последних версиях билдов добавлена проверка наличия символа "~", благодаря которому можно попасть в домашнюю директорию пользователя в Linux (вряд ли применимо на практике), или обратиться к файлу по более короткому имени (к MyProtector.dll можно обратиться через MyProt~1.dll) в Windows. Вроде бы грамотно реализованная функция, которая должна быть прекрасным фильтром, не пропуская опасные файлы. Так в чем же тогда кроется проблема? Перед тем, как проверить файл, функция смотрит, начинается ли он со строки "!MD5" или нет. Если да, то файл сразу помечается как "безопасный" и функция прекращает свою работу. Никакие проверки на расширения и специальные символы выполнены не будут. Но и это ещё не всё. Обмануть функцию можно, отправив в нее файл с расширением, которое находится в некорректном регистре. То есть файл "anticheat.exe" будет считаться плохим, а "anticheat.eXe" - хорошим. Почему так происходит? Функция "strstr", которая используется для поиска нежелательных расширений в файле, является регистрозависимой. Если мы попросим ее найти ".exe" в строке, где вместо ".exe" находится ".eXe", то она не выполнит эту задачу, так как с точки зрения процессора это абсолютно разные строки. К счастью (кому как), данные уязвимости исправлены билдах выше 5999. Проверка "!MD5" убрана, а расширение проверяется после преобразования строки пути файла в нижний регистр функцией, которая преобразовывает каждый символ строки в нижний регистр еще раз. Наверное, чтоб наверняка. Также функция не забывает смотреть на длину расширения с учетом точки. Длина расширения должна быть ровно четыре символа, в противном случае файл считается опасным.
Ниже будет приведён список расширений (подстрок), которые являются опасными:
  •  .cfg, .lst, .exe, .vbs, .com, .bat, .dll, .ini, .log
Для 5999 и выше билдов то же самое, плюс список ниже:
  •  .so, .dylib, .sys, halflife.wad, pak0.pak, xeno.wad

Message Of The Day

Теперь мы поговорим о такой замечательной консольной команде, как motd_write. Исходя из ее названия, можно догадаться, для чего она необходима - для записи чего-нибудь в файл MOTD. Логический вывод - команда серверная, так как этот файл обычно используется сервером, чтобы показать подключившемуся игроку какой-либо текст в специальном окошке. Но, как показывает практика, работает эта команда на клиенте так же хорошо, как и на сервере, а писать можно не только в указанный выше файл, а именно в тот, который записан в переменной motdfile, а по умолчанию там указан как раз "motd.txt". Но если вы укажите, например, "n0th1ng.wad", то это тоже сработает и у вас появится возможность записи любого текста в указанный файл. Уже достаточно, чтобы немного подпортить клиент игроку. Но дальше будет интереснее.
Основные характеристики команды motd_write следующие:
  • Использование кавычек в качестве объединения аргументов нежелательно, так как команда и так воспринимает поступающие в нее данные как целую строку.
  • Максимальное количество символов, которые могут быть записаны в файл - 2048.
  • Подстрока "\n" преобразовывается в символ переноса "#10" (не в подстроку "#10", а именно в символ "line feed").
  • Файл можно только перезаписывать и создавать, не дополнять.
Достаточно серьезная команда с точки зрения различного рода слоухакинга, так как по сути с её помощью мы можем изменять любой файл, который находится в директории игры. Но тут к нам на помощь приходит функция IsSafeFileToDownload, которая в самом начале выполнения команды motd_write проверяет путь, который указан в motdfile. А теперь вспомним, что писалось несколько строчек выше и ситуация начнет проясняться касательно того, как же серверам удается менять меню и мастерсервера в клиентских файлах. Но чтобы всё стало кристально ясно, я приведу небольшой пример.
Итак, тот момент, ради которого мы тут все собрались, настал. Давайте попробуем изменить себе файл MasterServer.vdf через команду motd_write. Приступаем!
Для начала введем в консоль следующий текст:
motdfile "!MD5\..\..\platform\config\MasterServer.vdf"
Давайте проанализируем, из чего состоит путь файла. В самом начале мы видим ту самую зловредную подстроку "!MD5", которая заставляет функцию IsSafeFileToDownload думать, что в нее отправили декаль (хеш-сумму спрея). По идее мы имеет тут некорректный путь, который даже не должен существовать (часто ли вы держите у себя в папке "cstrike" папку "!MD5"?), но не все так просто, как может показаться. Дело в том, что мы указали путь относительно директории игры, которая в нашем случае будет "cstrike" (если мы будем тестировать это в Half-Life 1, то директория будет "valve" соответственно). Это значит, что в результате мы будем иметь примерно такой путь:
C:\Games\Counter-Strike\cstrike\!MD5\..\..\platform\config\MasterServer.vdf. 
Путь "C:\Games\Counter-Strike\" можете заменить на тот, по которому у вас располагается ваша игра. А теперь посмотрим на результат нашей конкатенации и увидим в нем вот это: "\..\..\". Выше я рассказал, что это такое и что это делает, но сейчас я покажу это на примере. Давайте проследим за выполнением форматирования строки:

  1. C:\Games\Counter-Strike\cstrike\!MD5\..\..\platform\config\MasterServer.vdf
  2. C:\Games\Counter-Strike\cstrike\..\platform\config\MasterServer.vdf
  3. C:\Games\Counter-Strike\platform\config\MasterServer.vdf

Вот это да! Мы вышли из директории "cstrike" и избавились от "!MD5". Теперь мы имеем прямой путь к нашему файлу с мастерсерверами и можем делать с ним всё, что захотим. Всё ограничивается только нашей фантазией, а фантазия ограничивается только длиной в 2048 символов. Этого достаточно, чтобы переписать существующий в файле мастерсервер на свой. Для этого введем в консоль следующее:
motd_write "MasterServers"{"hl1"{"0"{"addr""192.168.0.1:27010"}}}
Если вы увидите в консоли текст "Done.", то вы всё сделали правильно и файл был изменён. В противном случае вы либо указали некорректный путь к файлу, либо на файле стоит опция "Только чтение". Да, благодаря этой опции можно защитить свои файлы от редактирования через команду motd_write, не прибегая к использованию сторонних модулей.

CaseSensExt (Case-Sensitive Extension)

С клиентской части плавно переходим на серверную. С функцией IsSafeFileToDownload также связан один серверный эксплойт, который позволяет скачивать файлы, которые скачивать нельзя. Данный эксплойт реализуется через команду "dlfile". "Dlfile" - команда, которая отправляется клиентом серверу на стадии проверки файлов, если проверяемый файл не был найден. Если послать "dlfile server.CFG", то мы сможем скачать конфигурационный файл сервера, в котором, вероятно, находится значение переменной rcon_password, со всеми вытекающими последствиями. К сожалению, данная команда не сработает, если вы решите отправить её, находясь непосредственно на сервере (видите карту). Заставить эту команду выполнять то, что нужно нам, а именно скачивание приватных файлов, можно только благодаря сторонним библиотекам, поэтому на чистой игровой сборке этого сделать не получится. Данная уязвимость была обнаружена ещё в далёких 200*-х, но получила известность она лишь в 2012 году, благодаря чему и была оперативно исправлена.

Заключение

Если вы являетесь обычным игроков и не хотите переустанавливать свою игру после посещения каждого второго игрового сервера - примите меры предосторожности. Самый простой и безопасный - установка свойства "Только чтение" на файлы с мастерсерверами, ресурсами и конфигурациями. Или же можно воспользоваться модулями под названием "протекторы", которые имеют более широкий функционал в плане защиты. Если же вы держите свой сервер, то для безопасности рекомендуется обновить его до последней версии, в которой исправлены некоторые уязвимости (и добавлены новые, но это уже другая история), а для обеспечения полной защиты воспользуйтесь дополнительными серверными модулями от сообщества, который в данный момент времени есть практически в каждой серверной сборке.

1 комментарий: