June 29, 2021

Методы проникновения в линуксовые системы: Страшные истории про 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 сервера с использованием словаря

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

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

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

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

Перечень стандартных словарей в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

vi
ESC (press esc key)
:!whoami

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

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

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

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

Базовая команда

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

Эксплуатация команды 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' 
Результат выполнения команды whoami
nmap --script=./exec --script-args='command=cat /etc/shadow'
Результат выполнения команды cat /etc/shadow

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

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

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

Заключение

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