Методы проникновения в линуксовые системы: Страшные истории про sudo
В этой статье рассматриваются различные способы подбора паролей для SSH и атак на приложения, доступные для запуска при помощи команды sudo, с целью получения шелла с правами суперпользователя. Этот кейс в основном появляется в конкурсах навроде CTF (Capture the flag; Захват флага), но рассматриваемый подход для атак на слабые пароли и приложения, запускаемые через sudo, может быть применим в реальных ситуациях.
Поиск SSH серверов
Перед началом подбора паролей или атак на приложения, запускаемые через sudo, нужно найти сервера с SSH. Nmap и другие сканеры портов сильно облегчают нашу задачу, поскольку SSH, как правило, использует стандартный порт 22.
Ниже показана команда, с которой можно начать.
nmap -sS -sV -p22 192.168.1.0/24 -oA sshscan
После отработки сканера портов можно быстро распарсить файл с результатами поиска и получить перечень SSH серверов. Ниже показаны примеры команд
grep -i "open" sshscan.gnmap grep -i "open" sshscan.gnmap | awk -F ' ' '{print $2} '> ssh.txt cat ssh.txt
Атака на SSH сервера с использованием словаря
Подбор пароля – довольно простой, но в то же время эффективный, метод для получения первоначального доступа к линуксовой системе. Мы наблюдаем использование слабых или стандартных паролей примерно в половине случаев.
Если вы не решали задач подобного рода, ниже приводятся рекомендации, которых можно придерживаться на начальных этапах:
- Выполняйте дополнительное сканирование и анализ сигнатур целевого SSH сервера на предмет того, является ли цель специфическим устройством: известным принтером, свитчем, роутером или другим сетевым девайсом. Во многих случаях эта информация может помочь в обнаружении стандартных паролей для устройства.
- На базе анализа сигнатур служб также попробуйте обнаружить, какие приложения запущены в системе, которые могут использовать локальные учетные записи со стандартными паролями.
- Наконец, попробуйте комбинации наиболее распространенных имен пользователей и паролей. Однако будьте осторожны и учитывайте, что могут использоваться политики блокировки аккаунтов. Никто не хочет иметь лишних проблем.
В этом сценарии предполагается, что мы будем проверять наиболее распространенные комбинации имени пользователя и пароля. Соответственно, нам нужен файл, содержащий имена пользователей, и файл, содержащий пароли. В дистрибутиве kali есть несколько хороших словарей с наиболее распространенными именами пользователей и паролями, многие из которых можно найти в директории /usr/share/wordlists/.
Хотя эти словари могут быть очень полезны, мы будем создавать новые файлы с небольшим перечнем.
Файл users.txt:
echo user >> users.txt echo root >> users.txt echo test >> users.txt
Файл passwords.txt:
echo Password >> passwords.txt echo Password1 >> passwords.txt echo toor >> passwords.txt echo test >> passwords.txt
В Metasploit есть модули, которые можно использоваться для сетевых атак по словарю для большинства протоколов управления. Большинство из этих модулей именуются в формате protocol_login.
Ниже показан пример использования модуля ssh_login.
msfconsole spool /root/ssh_login.log use auxiliary/scanner/ssh/ssh_login set USER_AS_PASS TRUE set USER_FILE /root/users.txt set PASS_FILE /root/password.txt set rhosts file:///root/ssh.txt set threads 100 set verbose TRUE show options run
На скриншоте ниже продемонстрировано, что должно получиться в случае успешного подбора пароля.
Как только валидный пароль обнаружен, можно подключаться при помощи ssh клиента.
Просмотр опций выполнения файла sudoers
Есть множество утилит, используемых для идентификации небезопасных конфигураций с целью расширения привилегий: Metasploit, LinEnum, Lynis, LinuxPrivCheck, UnixPrivsEsc. Однако в этой статье мы рассмотрим файл sudoers, который определяет, какие команды могут запускаться в контексте какого пользователя. Кроме того, этот файл часто используется для указания команд, запускаемых от имени суперпользователя теми, у кого более низкие привилегии.
Команда sudo, показанная ниже, может использоваться для просмотра команд, которые может запускать текущий пользователей с правами root’а.
sudo -l
В этом сценарии наш пользователь может запускать любую команду с правами суперпользователя. Рассмотрим несколько примеров.
Эксплуатация команды sudo sh
К сожалению, мы наблюдали подобные ситуации в реальных средах. Пользователь, владеющий права на запуск sh или любого другого шелла через sudo, имеет полный доступ к системе с правами суперпользователя. Ниже показан простейший пример:
sudo sh
Эксплуатация команды sudo vi
VI – текстовый редактор, идущий в составе большинства линуксовых дистрибутивов и популярный среди многих разработчиков. Соответственно, не так часто возникают ситуации, когда vi запускается через sudo для модификации привилегированных конфигурационных файлов, которые используются в средах разработки. Способность изменять любой файл в системе имеет свои риски, однако у vi есть встроенный функционал, позволяющий выполнять произвольные команды. То есть, если у пользователя есть права на запуск vi через sudo, то, по сути, есть полный доступ к серверу с правами root’а.
Пример команды:
vi ESC (press esc key) :!whoami
Ниже показан скриншот с результатами выполнения этой команды:
Эксплуатация команды sudo python
Многим нравится Python, представляющий собой язык для написания сценариев, используемый во многих сферах и не собирающийся сдавать свои позиции в ближайшее время. Довольно редко можно увидеть, что Python или любой другому интерпретатору разрешено работать через sudo, но несколько раз встречалось. Python, как и большинство современных и популярных языков программирования, используемых для написания сценариев, по умолчанию поддерживает произвольное выполнение команд.
Базовая команда
sudo python –c “import os;os.system(‘whoami’)”
Эксплуатация команды sudo nmap
Большинство сценариев, связанных с повышением привилегий, включает в себя манипуляцию приложением, работающим с более высокими привилегиями, для запуска вашего кода или команд. Одна из многих техник, используемых злоумышленниками, - эксплуатация функций, встроенных в целевое приложение. Распространенная тема, наблюдаемая нами во многих приложениях, - создание и загрузка пользовательских модулей, плагинов или дополнений.
Предположим, что мы можем запускать Nmap при помощи sudo и хотим использовать функционал этого сканера для запуска команд операционной системы.
Когда я сталкиваюсь с ситуациями, когда есть возможность запуска Nmap через sudo, то обычно задаю следующие вопросы:
- Позволяет ли Nmap прямое выполнение команд операционной системы? Нет (только старые версии при помощи флага –interactive и команды !whoami).
- Позволяет ли Nmap расширить свою функциональность? Да. Разрешено загружать и выполнять пользовательские .nse модули.
- На каком языке программирования написаны .nse модули? На языке LUA.
- Поддерживает ли язык движок LUA выполнение команд операционной системы? Да.
Попробуем создать модуль для выполнения команд операционной системы. Важно отметить, что мы могли бы написать модуль для запуска шелл кода или вызова специфических API функций, но в этот раз не будем усложнять жизнь.
Предположим, что мы потратили немного времени для исследования существующих модулей и возможностей языка LUA, после чего был разработан следующий .nse модуль:
--- SAMPLE SCRIPT local nmap = require "nmap" local shortport = require "shortport" local stdnse = require "stdnse" local command = stdnse.get_script_args(SCRIPT_NAME .. ".command") or nil print("Command Output:") local t = os.execute(command) description = [[This is a basic script for executing os commands through a Nmap nse module (lua script).]] --- -- @usage -- nmap --script=./exec.nse --script-args='command=whoami' -- @output -- Output: -- root -- @args command author = "Scott Sutherland" license = "Same as Nmap--See http://nmap.org/book/man-legal.html" categories = {"vuln", "discovery", "safe"} portrule = shortport.http action = function(host,port) end
Как только модуль скопирован в целевую систему, вы можете запустить этот модуль через Nmap. Ниже продемонстрировано выполнение модуля от имени непривилегированного пользователя.
nmap --script=./exec --script-args='command=whoami'
nmap --script=./exec --script-args='command=cat /etc/shadow'
По скриншотам выше становится понятно, что мы можем запускать произвольные команды. Теперь попробуем сделать то же самое, но при помощи sudo.
В качестве развлечения мы периодически конфигурируем ncat в файле sudoers при проведении разных конкурсов, однако мы не наблюдали подобные ситуации в реальной жизни.
Заключение
В этой статье мы рассмотрели разные способы подбора паролей для SSH и эксплуатации приложений, запускаемых при помощи команды sudo. Надеюсь, эта статья будет полезной начинающим специалистам в сфере безопасности.