Методы проникновения в линуксовые системы (часть 4): Страшные истории про sudo

Методы проникновения в линуксовые системы (часть 4): Страшные истории про sudo

В этой статье мы рассмотрели разные способы подбора паролей для SSH и эксплуатации приложений, запускаемых при помощи команды sudo.

Автор: Scott Sutherland

В этой статье рассматриваются различные способы подбора паролей для 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

http://blog.netspi.com/wp-content/uploads/2020/03/ssh-sudo-locate.mp4

Атака на SSH сервера с использованием словаря

Подбор пароля – довольно простой, но в то же время эффективный, метод для получения первоначального доступа к линуксовой системе. Мы наблюдаем использование слабых или стандартных паролей примерно в половине случаев.

Если вы не решали задач подобного рода, ниже приводятся рекомендации, которых можно придерживаться на начальных этапах:

  1. Выполняйте дополнительное сканирование и анализ сигнатур целевого SSH сервера на предмет того, является ли цель специфическим устройством: известным принтером, свитчем, роутером или другим сетевым девайсом. Во многих случаях эта информация может помочь в обнаружении стандартных паролей для устройства.

  2. На базе анализа сигнатур служб также попробуйте обнаружить, какие приложения запущены в системе, которые могут использовать локальные учетные записи со стандартными паролями.

  3. Наконец, попробуйте комбинации наиболее распространенных имен пользователей и паролей. Однако будьте осторожны и учитывайте, что могут использоваться политики блокировки аккаунтов. Никто не хочет иметь лишних проблем.

В этом сценарии предполагается, что мы будем проверять наиболее распространенные комбинации имени пользователя и пароля. Соответственно, нам нужен файл, содержащий имена пользователей, и файл, содержащий пароли. В дистрибутиве kali есть несколько хороших словарей с наиболее распространенными именами пользователей и паролями, многие из которых можно найти в директории /usr/share/wordlists/.

Рисунок 1: Перечень стандартных словарей в Kali Linux

Хотя эти словари могут быть очень полезны, мы будем создавать новые файлы с небольшим перечнем.

Файл 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

На скриншоте ниже продемонстрировано, что должно получиться в случае успешного подбора пароля.

Рисунок 2: Пример успешного подбора пароля

Ниже приводится видеодемонстрация процесса подбора паролей и получения первоначального доступа в систему при помощи Metasploit.

http://blog.netspi.com/wp-content/uploads/2020/03/ssh-sudo-dictionary-attack.mp4

Как только валидный пароль обнаружен, можно подключаться при помощи ssh клиента.

Рисунок 3: Авторизация в системе с использование найденного пароля

Просмотр опций выполнения файла sudoers

Есть множество утилит, используемых для идентификации небезопасных конфигураций с целью расширения привилегий: Metasploit, LinEnum, Lynis, LinuxPrivCheck, UnixPrivsEsc. Однако в этой статье мы рассмотрим файл sudoers, который определяет, какие команды могут запускаться в контексте какого пользователя. Кроме того, этот файл часто используется для указания команд, запускаемых от имени суперпользователя теми, у кого более низкие привилегии.

Команда sudo, показанная ниже, может использоваться для просмотра команд, которые может запускать текущий пользователей с правами root’а.

sudo -l

Рисунок 4: Перечень команд, которые может запускать текущий пользователь с правами суперпользователя

В этом сценарии наш пользователь может запускать любую команду с правами суперпользователя. Рассмотрим несколько примеров.

Эксплуатация команды sudo sh

К сожалению, мы наблюдали подобные ситуации в реальных средах. Пользователь, владеющий права на запуск sh или любого другого шелла через sudo, имеет полный доступ к системе с правами суперпользователя. Ниже показан простейший пример:

sudo sh

Рисунок 5: Получение прав суперпользователя после запуска команды sudo sh

Эксплуатация команды sudo vi

VI – текстовый редактор, идущий в составе большинства линуксовых дистрибутивов и популярный среди многих разработчиков. Соответственно, не так часто возникают ситуации, когда vi запускается через sudo для модификации привилегированных конфигурационных файлов, которые используются в средах разработки. Способность изменять любой файл в системе имеет свои риски, однако у vi есть встроенный функционал, позволяющий выполнять произвольные команды. То есть, если у пользователя есть права на запуск vi через sudo, то, по сути, есть полный доступ к серверу с правами root’а.

Пример команды:

vi
ESC (press esc key)
:!whoami

Ниже показан скриншот с результатами выполнения этой команды:

Рисунок 6: Результат эксплуатации команды sudo vi

Эксплуатация команды sudo python

Многим нравится Python, представляющий собой язык для написания сценариев, используемый во многих сферах и не собирающийся сдавать свои позиции в ближайшее время. Довольно редко можно увидеть, что Python или любой другому интерпретатору разрешено работать через sudo, но несколько раз встречалось. Python, как и большинство современных и популярных языков программирования, используемых для написания сценариев, по умолчанию поддерживает произвольное выполнение команд.

Ниже показана базовая команда и короткое видео, демонстрирующее весь процесс:

sudo python –c “import os;os.system(‘whoami’)”

http://blog.netspi.com/wp-content/uploads/2020/03/ssh-sudo-breakouts.mp4

Эксплуатация команды sudo nmap

Большинство сценариев, связанных с повышением привилегий, включает в себя манипуляцию приложением, работающим с более высокими привилегиями, для запуска вашего кода или команд. Одна из многих техник, используемых злоумышленниками, - эксплуатация функций, встроенных в целевое приложение. Распространенная тема, наблюдаемая нами во многих приложениях, - создание и загрузка пользовательских модулей, плагинов или дополнений.

Предположим, что мы можем запускать Nmap при помощи sudo и хотим использовать функционал этого сканера для запуска команд операционной системы.

Когда я сталкиваюсь с ситуациями, когда есть возможность запуска Nmap через sudo, то обычно задаю следующие вопросы:

  1. Позволяет ли Nmap прямое выполнение команд операционной системы? Нет (только старые версии при помощи флага –interactive и команды !whoami).

  2. Позволяет ли Nmap расширить свою функциональность? Да. Разрешено загружать и выполнять пользовательские .nse модули.

  3. На каком языке программирования написаны .nse модули? На языке LUA.

  4. Поддерживает ли язык движок 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'

Рисунок 7: Результат выполнения команды whoami

nmap --script=./exec --script-args='command=cat /etc/shadow'

Рисунок 8: Результат выполнения команды cat /etc/shadow

По скриншотам выше становится понятно, что мы можем запускать произвольные команды. Теперь попробуем сделать то же самое, но при помощи sudo.

Рисунок 9: Результат выполнения команд в контексте суперпользователя

В качестве развлечения мы периодически конфигурируем ncat в файле sudoers при проведении разных конкурсов, однако мы не наблюдали подобные ситуации в реальной жизни. На видео ниже демонстрируется процесс с использованием Nmap и ncat.

http://blog.netspi.com/wp-content/uploads/2020/03/ssh-sudo-custom-nmap-module.mp4

Заключение

В этой статье мы рассмотрели разные способы подбора паролей для SSH и эксплуатации приложений, запускаемых при помощи команды sudo. Надеюсь, эта статья будет полезной начинающим специалистам в сфере безопасности.

Всего наилучшего.

Где кванты и ИИ становятся искусством?

На перекрестке науки и фантазии — наш канал

Подписаться