День 35. Command Injection
Узнайте об уязвимости, позволяющей выполнять команды через уязвимое приложение, и о способах ее устранения.
1. Введение (Что такое внедрение команд?)
В этой комнате мы рассмотрим веб-уязвимость, называемую внедрением команд . После того, как мы разберемся, что это за уязвимость, мы продемонстрируем ее влияние и риски, которые она представляет для приложения.
Затем вы сможете применить эти знания на практике, а именно:
- Как обнаружить уязвимость внедрения команд
- Как протестировать и использовать эту уязвимость с помощью полезных нагрузок, разработанных для разных операционных систем.
- Как предотвратить эту уязвимость в приложении
- В заключение, в конце занятия вы сможете применить теоретические знания на практике.
Для начала давайте разберемся, что такое внедрение команд . Внедрение команд — это злоупотребление поведением приложения для выполнения команд в операционной системе с использованием тех же привилегий, с которыми приложение работает на устройстве. Например, внедрение команд на веб-сервере, работающем от имени пользователя с именем, joeприведет к выполнению команд от имени этого joeпользователя — и, следовательно, к получению всех имеющихся у него разрешений joe.
Внедрение команд также часто называют «удалённым выполнением кода» (RCE) из-за возможности удалённого выполнения кода внутри приложения. Эти уязвимости часто наиболее выгодны для злоумышленника, поскольку означают, что он может напрямую взаимодействовать с уязвимой системой. Например, злоумышленник может читать системные или пользовательские файлы, данные и тому подобное.
Например, возможность злоупотребить приложением для выполнения команды, whoamiпозволяющей вывести список учетных записей пользователей, работающих в этом приложении, будет примером внедрения команд .
Внедрение команд вошло в десятку наиболее распространенных уязвимостей, о которых сообщалось в отчете Contrast Security AppSec Intelligence за 2019 год ( Contrast Security AppSec., 2019 ). Более того, фреймворк OWASP постоянно предлагает уязвимости такого рода в качестве одной из десяти наиболее распространенных уязвимостей веб-приложений ( фреймворк OWASP ).
2. Обнаружение внедрения команд
Эта уязвимость существует потому, что приложения часто используют функции в таких языках программирования, как PHP , Python и NodeJS, для передачи данных и выполнения системных вызовов в операционной системе компьютера. Например, для получения входных данных из поля и поиска записи в файле. В качестве примера рассмотрим приведенный ниже фрагмент кода:
В этом фрагменте кода приложение принимает данные, которые пользователь вводит в поле ввода с именем$title Чтобы найти название песни в каталоге, давайте разберем этот процесс на несколько простых шагов.
1. Приложение сохраняет MP3-файлы в каталоге, расположенном в операционной системе.
2. Пользователь вводит название песни, которую хочет найти. Приложение сохраняет этот ввод в $titleпеременную.
3. Данные из этой $titleпеременной передаются команде grepдля поиска в текстовом файле с именем songtitle.txt записи , которую пользователь желает найти.
4. Результат поиска по файлу songtitle.txt определит , сообщит ли приложение пользователю о существовании песни или нет.
Обычно подобная информация хранится в базе данных; однако это лишь пример того, как приложение получает ввод от пользователя для взаимодействия с операционной системой.
Злоумышленник может злоупотребить этим приложением, внедрив в него собственные команды для выполнения. Вместо того чтобы использовать его grepдля поиска записи в файле songtitle.txt, он может попросить приложение прочитать данные из более конфиденциального файла.
Злоупотребление приложениями таким образом возможно независимо от используемого языка программирования. Пока приложение обрабатывает и выполняет его, это может привести к внедрению команд. Например, приведенный ниже фрагмент кода — это приложение, написанное на Python.
Обратите внимание, что от вас не требуется понимание синтаксиса этих приложений. Однако, для наглядности, я также описал шаги работы этого приложения на Python.
- Пакет "flask" используется для настройки веб-сервера.
- Функция, использующая пакет "subprocess" для выполнения команды на устройстве.
- Мы используем маршрут в веб-сервере , который будет выполнять всё предоставленное. Например, чтобы выполнить команду
whoami, нам нужно будет перейти по адресу http : //flaskapp.thm/whoami
Вопрос: Какая переменная хранит ввод пользователя в фрагменте PHP-кода в этом задании?
Вопрос: Какой HTTP-метод используется для получения данных, отправленных пользователем, в приведенном фрагменте PHP-кода?
Вопрос: Если я хочу выполнить idкоманду из приведенного фрагмента кода на Python, какой маршрут мне нужно будет посетить?
3. Использование уязвимостей внедрения команд
Зачастую определить возможность внедрения команд можно по поведению приложения, как вы увидите на практическом занятии в этой комнате.
Приложения, использующие ввод пользователя для заполнения системных команд данными, часто могут комбинироваться, что приводит к непредусмотренному поведению. Например, операторы оболочки `sudo` ;, ` sudo` &и &&`sudo` объединяют две (или более) системные команды и выполняют обе . Если вам незнакома эта концепция, стоит ознакомиться с модулем «Основы Linux» , чтобы узнать об этом больше.
Внедрение команд можно обнаружить, как правило, двумя способами:
Эти два метода описаны в таблице ниже, а более подробное объяснение приведено в двух разделах, расположенных ниже.
Этот тип внедрения происходит, когда при тестировании полезной нагрузки приложение не выдает прямого результата. Вам придется изучить поведение приложения, чтобы определить, была ли ваша полезная нагрузка успешной.
Этот тип внедрения предполагает прямую обратную связь от приложения после тестирования полезной нагрузки. Например, запуск команды whoamiдля определения пользователя, под которым работает приложение. Веб-приложение выведет имя пользователя непосредственно на страницу.
Обнаружение внедрения слепых команд
Слепое внедрение команд — это внедрение команды , при котором отсутствует видимый результат, поэтому оно не сразу заметно. Например, команда выполняется, но веб-приложение не выводит никакого сообщения.
Для такого типа внедрения команд нам потребуется использовать полезные нагрузки, которые вызовут некоторую задержку по времени. Например, команды `ping` pingи `ping` sleepявляются важными полезными нагрузками для тестирования. Используя `ping` pingв качестве примера, приложение зависнет на x секунд в зависимости от количества указанных вами пингов .
Ещё один метод обнаружения внедрения команд вслепую — это принудительное выделение некоторого вывода. Это можно сделать с помощью операторов перенаправления, таких как >`.`. Если вы с этим не знакомы, рекомендую ознакомиться с модулем «Основы Linux» . Например, мы можем указать веб-приложению выполнить такие команды, как `,` whoamiи перенаправить их в файл. Затем мы можем использовать команду, например, `,` catдля чтения содержимого этого вновь созданного файла.
Проверка внедрения команд таким способом часто бывает сложной и требует немалого количества экспериментов, особенно учитывая различия в синтаксисе команд между Linux и Windows.
Эта curl команда — отличный способ проверить возможность внедрения команд . Это связано с тем, что вы можете использовать её curl для передачи данных в приложение и из приложения в составе полезной нагрузки. В качестве примера рассмотрим приведенный ниже фрагмент кода: простая полезная нагрузка curl для приложения может быть использована для внедрения команд.
curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami
Обнаружение внедрения подробных команд
Обнаружение внедрения команд таким способом, пожалуй, является самым простым из двух методов. Подробное описание внедрения команд — это когда приложение предоставляет обратную связь или вывод о том, что происходит или выполняется.
Например, результаты выполнения таких команд, как pingили , whoamiотображаются непосредственно в веб-приложении.
В таблицах ниже я собрал несколько полезных программ для Linux и Windows.
Вопрос: Какую полезную нагрузку мне следует использовать, если я хочу определить, от имени какого пользователя запущено приложение?
Вопрос: Какой популярный сетевой инструмент я бы использовал для проверки возможности внедрения команд вслепую на машине с Linux ?
Вопрос: Какую полезную нагрузку я бы использовал для проверки машины под управлением Windows на предмет слепой инъекции команд?
4. Устранение последствий внедрения команд
Внедрение команд можно предотвратить различными способами. Начиная от минимального использования потенциально опасных функций или библиотек в языке программирования и заканчивая фильтрацией входных данных без учета ввода пользователя. Ниже я более подробно опишу эти способы. Примеры ниже приведены для языка программирования PHP ; однако те же принципы могут быть распространены на многие другие языки.
В PHP многие функции взаимодействуют с операционной системой для выполнения команд через командную оболочку; к ним относятся:
Рассмотрим приведенный ниже фрагмент кода в качестве примера. Здесь приложение будет принимать и обрабатывать только числа, введенные в форму. Это означает, что любые команды, такие как [неразборчиво], whoamiобрабатываться не будут.
- Приложение принимает только определённый набор символов (цифры от 0 до 9).
- Затем приложение перейдет к обработке только этих данных, которые носят исключительно числовой характер.
Эти функции принимают на вход строку или пользовательские данные и выполняют всё, что предоставлено системой. Любое приложение, использующее эти функции без надлежащей проверки, будет уязвимо для внедрения команд.
Проверка и очистка любых входных данных от пользователя, используемых приложением, — отличный способ предотвратить внедрение команд. Это процесс определения форматов или типов данных, которые может отправлять пользователь. Например, поле ввода, принимающее только числовые данные или удаляющее любые специальные символы, такие как запятая >и &пробел /.
В приведенном ниже фрагменте кода используется функция filter_input PHP для проверки того, являются ли данные, введенные через форму ввода, числом или нет. Если это не число, значит, данные недействительны.
Приложения используют множество методов фильтрации и очистки данных, получаемых от пользователя. Эти фильтры ограничивают доступ к определенным типам данных; однако мы можем использовать логику приложения для обхода этих фильтров. Например, приложение может удалять кавычки; вместо этого мы можем использовать шестнадцатеричное значение этих кавычек для достижения того же результата.
При выполнении, хотя предоставленные данные будут иметь формат, отличающийся от ожидаемого, их все равно можно будет интерпретировать, и результат будет тем же.
Вопрос: Как называется процесс «очистки» пользовательского ввода, предоставляемого приложению?
Ответ: sanitisation (ну по идее Санация (или Очистка / Валидация))
5. Практическое занятие: Внедрение команд (развертывание)
Запустите машину, подключенную к этой задаче; она станет видна в режиме разделенного экрана, как только будет готова.
Протестируйте несколько полезных нагрузок в приложении, размещенном на веб-сайте и отображаемом в режиме разделенного экрана, чтобы проверить возможность внедрения команд. Обратитесь к этой шпаргалке, если у вас возникнут трудности или вы захотите изучить более сложные полезные нагрузки.
Найдите содержимое флага, расположенного в файле /home/tryhackme/flag.txt . Для этого можно использовать различные полезные нагрузки — я рекомендую попробовать несколько вариантов.
Вопрос: От имени какого пользователя запущено это приложение?
Вопрос: Что содержит флаг, расположенный в файле /home/tryhackme/flag.txt ?
6. Заключение
Молодец, что дошли до конца этой комнаты. Вкратце, мы изучили следующие элементы внедрения команд :
- Как обнаружить уязвимость внедрения команд
- Как протестировать и использовать эту уязвимость с помощью полезных нагрузок, разработанных для разных операционных систем.
- Как предотвратить эту уязвимость в приложении
- Применение полученных знаний на практике путем выполнения внедрения команд.
Как вы, вероятно, уже выяснили, существует несколько полезных нагрузок, которые можно использовать для достижения одной и той же цели. Я настоятельно рекомендую вам вернуться к практической стороне этой задачи и попробовать альтернативные методы извлечения флага.
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!