Today, I would like to talk about the vectors of attacks on Oracle DBMS at different stages: how to probe the weaknesses of the base outside, penetrate and get entrenched inside plus how to automate all this business with the help of specialized software. The architecture and capabilities of the database are very interesting, there are many interesting moments, and therefore, there are many ways to spoil everything. However, do not forget: break - do not build, so all further information is provided solely in order to identify shortcomings in the protection of the tested systems and improve security.
The external perimeter. The Listener is Under Attack
Anyone who has ever encountered this database knows that interaction with Oracle RDBMS is carried out through TNS Listener. Listener is a kind of connection balancer. By default, the listener listener listens to the 1521st TCP port (in the “future” Oracle promises to go to 2483 and 2484/SSL) and deals incoming connections depending on which is requested by the database, which, accordingly, allows you to work with several. Identification of a particular database takes place on the basis of the alphanumeric line - its SID'a (System IDentifier). There is also the concept of SYSTEM_NAME, which can most often be perceived as an analogue of SID (from a pentest point of view, of course).
It is with the attacks on the service of the userer, as a rule, the Oracle database punchet begins. The task of finding and determining the DBMS version is perfectly coped with Nmap. But the first thing for us is to get SID to connect to the “listener”, because without it the listener will not communicate with us. On this topic, Sh2kerr once wrote a great study of the Different to ways guess Oracle database SID.
The main methods of obtaining SID include a selection of typical values for a particular platform, since SID can be defaulted. For example, ORCL is default for regular Oracle, XE for the Oracle Express Edition. SID can also be obtained through third-party resources. For example, the EM-console web interface on port 1158; via SAP web_appserver, XDB and other things installed on top of Oracle. The system identifier can be twisted, since the listener when connecting returns various errors depending on whether there is such an SID or not. In addition, there is a long-standing practice of making short identifiers (3-4 characters). When too much, do not forget about the name of the company, the name of the system, the names of the hosts and other social aspects. The latter task is very effectively coped with the module from Memasloite auxiliary/scanner/oracle/sid_brute. For an attack, it is enough to specify the IP address of the deleted host. This is a very good sidish blot, it has a built-in dictionary on 600 typical values.
Кстати, встреча с версиями Oracle ниже 10.0 — настоящий праздник для пентестера. Listener — одна из старых версий с настройками по умолчанию, которая раскрывает всё, что можно, включая SID, версию СУБД, тип ОС, и имеет ряд важных уязвимостей (здесь мы используем утилиту lsnrtctl, которая входит в состав Oracle):
Примечание: Используя протокол TNS, вы можете отправить «слушателю» команду STATUS или SERVICE. В первом случае, даже если установлен пароль, слушатель предоставит много информации. STATUS вернет версию ОС, время работы, каталог файла журнала и SID. SERVICE также покажет версию ОС и SID.
LSNCTL: статус 192.168.1.100
Объясните с помощью
DoS-атака: Вы можете остановить прослушиватель.
LSNCTL: остановка 192.168.1.100
Объясните с помощью
DDoS-атаки: можно установить высокий уровень отслеживания событий, что часто приводит к повышенной нагрузке на процессор и расходует всё свободное дисковое пространство.
LSNRCTL: set trc_level 16
Объясните с помощью
DDDoS: с помощью следующих команд можно ввести некорректные настройки подключения, что приведет к неработоспособности сервиса:
LSNRCTL: установить connect_timeout
LSNRCTL: установить invalid_connect
Объясните с помощью
до RCE: можно изменить способ доступа к файлу журнала "прослушиватель":
LSNRCTL: установить log_file C:/boot.ini
Объясните с помощью
RCE! Если добавить к предыдущему абзацу, что все запросы попадают в bail, можно осуществить подобную атаку под Windows: указать путь к папке автозагрузки администратора (службы Oracle работают из-под системы, поэтому проблем с правами не будет) с расширением .bat и отправить такой TNS-запрос для подключения, чтобы какая-нибудь команда Windows зафиксировала это в логе. Например, добавление пользователя в ОС – `net user bab /add`. Когда администратор войдет в ОС (и мы поможем предыдущим примерам с DoS или чем-то подобным, наш злой bat запустится вместе со всеми командами внутри! Кстати, все, что будет записано там слушателем, будет пропущено как несуществующие команды, так что можете не беспокоиться.
Для реальной атаки мы будем использовать утилиту tenscd.pl, поскольку lsnrctlu не может отправлять пользовательские запросы. Первый запрос — это запись в логе bat-пакета в автозагрузке, второй — добавление пользователя:
tnscmd -h 192.168.1.100 -p 1521 --rawcmd "(DESCRIPTION=(CONNGECT_DATA=(CID=(PROGRAM=)(HOST=)(US)(US)(COMUND-_gmissile)(ARGUMENTS)(SERVICE=LISTENER)(VERSION=)(WALUE=C](US)(US)(US)(US)(COM.SSD)(MOS)(Aluminist\Adminator\Roamsoft>Winsoftware)(SERVICE=Litener)(VERSION=)(WALUE=C=C)(W.
tnscmd -h 192.168.1.100 -p 1521 --rawcmd "(DONCNECL_DATA=(((((
> net user Bob Marley /add
Объясните с помощью
В Linux можно аналогичным образом провернуть грязные трюки, например, добавить свои SSH-ключи. Подробнее об этом методе можно прочитать в книге А. Безопасность Oracle глазами аудитора: атака и защита. Кстати, часть описанных выше действий можно также выполнить с помощью одноименного модуля в Metasploit — auxiliary/admin/oracle/tnscmd. Наконец, если уже есть удаленный доступ к серверу с базой данных, можно украсть из userer.ora (это такой конфигурационный файл, он находится в $ORACLE_HOME/network/admin) хэш пароля «слушателя». Для подключения достаточно десятой его версии.
PASSWORDS_LISTENER = 334CC7A0C4F01A0
Объясните с помощью
Ещё раз подчеркну, что эти атаки актуальны только для Oracle до десятой версии включительно. Начиная с «десятков», удалённая конфигурация по умолчанию запрещена. Хотя некоторую информацию из кластера мы можем получить.
Внешний периметр. TNS Listener Poison
Если вы только что столкнулись с новой версией «слушателя», то выйти из неё уже не получится, остаётся только взращивание вредоносного ПО. Однако все версии, включая 12c, с настройками по умолчанию уязвимы для атаки, называемой TNS Listener Poison (разновидность атаки типа «человек под прицелом», MITM). При этом 12c уязвима только в некоторых конфигурациях. Например, одним из вариантов, который может нам помочь, является отключение динамической конфигурации «слушателя», что невозможно при использовании Oracle DataGuard, PL/SQL Gateway с подключением к APEX и некоторых версий SAP.
Суть в следующем: по умолчанию сервис «слушателя» поддерживает удалённую конфигурацию, необходимую для создания кластера баз данных (RAC – Real Application Cluster). Фактически, мы можем подключиться к «слушателю» и «зарегистрироваться», то есть сообщить ему, что мы являемся членом кластера, на котором работает его база данных. Далее можно ожидать подключений от клиентов, которые будут перенаправляться к нам слушателем. Но не все, а только части, потому что слушатель балансирует нагрузку на кластер: кто-то сразу подключится к реальной СУБД, кто-то перенаправит кого-то к нам. При этом для полноценной MITM-атаки ничто не мешает перенаправлять клиентов, подключающихся к нам, обратно в СУБД. И одновременно у нас будет возможность полностью контролировать передаваемый трафик: и просматривать его (данные, за исключением аутентификации, не шифруются), изменять команды и добавлять их.
Принцип использования уязвимости TNS Poison
Вот примерный алгоритм атаки:
Мы отправляем запрос TNS `CONNECT_DATA=(COMMAND=SERVICE_REGISTER_NSGR)`.
Уязвимый сервер ответит `(DESCRIPTION=(TMP=))`. Pattdy сообщит `(ERROR_STACK=(ERROR=1194)`.
Сформируйте конфигурационный пакет с SID и IP-адресом нового «слушателя» (нашего). Количество символов в имени текущего SID имеет принципиальное значение. Его необходимо знать, иначе он будет неправильно интерпретирован, и пакет не будет считаться «корректно сформированным».
Мы отправляем всё это «слушателю».
Если всё это правда, то после этого часть новых пользовательских подключений будет отправлена на IP-адрес, находящийся под нашим контролем.
Проверить уязвимость сервера можно с помощью одного из модулей MSF — `auxiliary/scanner/orace/tnspoison_checker`. Стоит отметить, что универсальных утилит, позволяющих полностью контролировать передаваемые данные во время MITM-атак, не существует. Это во многом связано со сложностью протокола orc, а также с большим количеством его разновидностей (количество зависит от версии базы данных, архитектуры хоста, ОС и языка программирования). С другой стороны, для конкретных целей и задач осуществить «харассмент» не составит труда.
ВВС
Архив со скриптами (прокси, отравитель) и подробным описанием уязвимости.
Внешний периметр. Пользователи используют метод грубой силы.
Получен SID? Отлично, перейдём к следующей типичной задаче – получаем запись. С этого момента можем подключиться к «слушателю» и блокировать учетные записи. В целом, Oracle когда-то был уязвим, и можно было сначала блокировать логины, а затем пароли (та же проблема: различные ошибки для существующих и несуществующих пользователей), но существующий торс устарел и работает очень нестабильно. С классическим способом блокировки учетных записей снова Metasploit и его модуль `auxiliary/scanner/oracle_login`. В нём есть встроенный словарь наиболее популярных учетных записей по умолчанию в виде логин:пароль. Хотя, конечно, он не охватывает все возможные варианты, и иногда приходится гуглить информацию о неработающей платформе или снова полагаться на воображение сотрудников. При этом не забывайте, что Oracle поддерживает политики паролей и может блокировать учетные записи.
Записи по умолчанию представляют собой одну из самых распространенных и одновременно серьезных проблем безопасности в Oracle. Таких пользователей много, у них разные привилегии, и некоторые из них не так легко отключить. Поэтому при проведении аудита продуктов Oracle очень важно изучить список учетных записей по умолчанию в документации. И если в «чистой» базе данных Oracle таких записей не так много, то если установить на нее ERP-систему, например, E-Business Suite, их окажется около 300! Для более тщательного, но долгосрочного анализа я советую обратиться к Nmap:
nmap --script oracle-brute -p 1521 --script-args oracle-brute.id=DSECRGG,userb=/oot/Desktop/ore/userdb, passdb=/Dosktop/oro/Desktop/o-passb 192.168.1.100
Объясните с помощью
Обратите внимание, что этот скрипт использует как логины, так и пароли, то есть при каждой попытке входа в систему проверяется каждый пароль, и это занимает довольно много времени!
Внешний периметр. Удалённая аутентификация ОС.
Более элегантный способ получить запись из базы данных — обойти проверку. Но это сработает только в том случае, если тестируемая система использует `удалённую аутентификацию ОС`. Суть в том, что СУБД Oracle имеет возможность перенести аутентификацию пользователя в ОС. Таким образом, если пользователь аутентифицирован в ОС, подключение к базе данных произойдёт без проверки пароля. Логины таких пользователей в базе данных имеют префикс ops$ (например, ops$Bob). И эта функция работает также с удалёнными хостами. Поэтому для атаки нам нужно подключиться к «слушателю» по имени пользователя и «сказать», что пароль проверяется в ОС, чтобы нас пропустили. Слушатель поверит и пропустит
Несмотря на кажущуюся странность, этот метод используется для пакета систем SAP, где Oracle является основной. Таким образом, практическая последовательность действий следующая:
Узнайте, как рассчитывается подобный счет (например, в SAP он "вычисляется" по известному алгоритму).
Создайте такую учетную запись ОС в своем автомобиле.
Подключайтесь к СУБД стандартными способами.
Если вы хотите попрактиковаться в своей испытательной лаборатории, то можете проверить методику, следуя пошаговому плану:
Проверьте наличие удаленной аутентификации. Введите ее в SQL-терминал:
показать параметр os_authent;
// Возвращает TRUE, если включено
Объясните с помощью
Включить r.auth (если FALSE):
alter system set remote_os_authent=TRUE=SPFILE;
Объясните с помощью
Создайте пользователя EVIL с префиксом ops:
создать пользователя ops$evil, идентифицированного как p@ssw0rd;
Объясните с помощью
Выдача прав:
предоставить доступ к ops$evil;
Объясните с помощью
Наконец, для подключения к базе данных с использованием удаленной аутентификации введите следующее:
sqlplus /@\"192.161.1.6.3:1521/orcl.maryll.local\"
/* Косая черта перед символом @, так сказать, указывает sqlplus, что проверка учетной записи выполняется из операционной системы */
Объясните с помощью
Кстати, пароль пользователя в операционной системе и пароль пользователя базы данных Oracle могут отличаться, это ни на что не влияет.
На конференции ZeroNights 2015 Роман Бажин (@nezlooy) поделился интересным наблюдением: оказалось, что при отправке пакета с запросом авторизации **можно заменить значение текущего пользователя**, и, следовательно, можно слишком сильно выйти из игры. Такая атака будет работать явно быстрее, чем прямой Burth, если нужно проверить только логины, без паролей. Более подробную информацию об удаленной аутентификации ОС можно найти здесь и здесь.
Внешний периметр. Дистанционная система скрытного прохода. Сила поддержки.
Ещё одна серьёзная уязвимость в СУБД Oracle — возможность удалённого получения хэша пароля любого пользователя и его последующего локального копирования. Уязвимыми к этой технике являются версии 11.1.0.6, 11.1.0.7, 11.2.0.1, 11.2.0.2 и 11.2.0.3. Чтобы понять суть уязвимости, необходимо рассмотреть, как работает протокол аутентификации с СУБД одиннадцатой версии (маньяки из Oracle в каждой новой ветке меняют протокол аутентификации). Взаимодействие с сервером происходит по следующей схеме:
Клиент подключается к серверу и отправляет имя пользователя.
Сервер генерирует идентификатор сессии (`ATH_SESSKEY`) и шифрует его с помощью AES-192. В качестве ключа используется хеш SHA-1, полученный из пароля пользователя, к которому добавляется соль (`ATH_VFR_DATA`).
Сервер отправляет клиенту зашифрованный идентификатор сессии и соль.
Клиент генерирует ключ, хешируя свой пароль и полученную соль. Используя этот ключ, клиент расшифровывает данные сессии, полученные от сервера.
На основе расшифрованного идентификатора серверной сессии клиент генерирует новый общий ключ, который будет использоваться в дальнейшем.
Самое интересное сейчас то, что идентификатор сессии `AUTH_SESSKEY`, который сервер отправляет клиенту, имеет длину 48 байт. Из них 40 байт случайные, а последние 8 — повторяющиеся значения 0x08 (заполнение). Вектор инициализации — 0x00 (Null). Зная, что последние 8 байт идентификатора всегда состоят из 0x08, мы можем отсортировать пароли, расшифровав идентификатор сессии (хеш мы берем из пароля, соль получаем от сервера) и проверив заполнение. И, как вы понимаете, все это происходит в автономном режиме, то есть с большой скоростью, особенно если использовать графический процессор. Для проведения атаки необходимо знать SID, действительный логин (например, учетная запись `SYS` очень интересна) и, конечно же, иметь возможность подключиться к базе данных. Если разорвать соединение, не обращаясь к пунктам 4 и 5, то в журналах аудита Oracle не будет записей типа «Неверная попытка входа» даже для получения идентификатора сессии и соли. Для лабораторного тестирования подобной атаки необходимо выполнить следующее:
С помощью Wireshark можно перехватывать трафик при запуске системы во время логирования. Фильтр TNS в этом поможет.
Удалите шестнадцатеричные значения AUTH_SESSKEY и AUTH_VFR_DATA.
Замените их в скрипте PoC, который будет использоваться для извлечения данных из словаря.
Приведённая выше ссылка — это всего лишь демонстрационный пример, необходимый для понимания принципа работы. В целом, хеши Oracle хорошо обрабатываются утилитами woraauthbf.
Внутренние атаки. Удаленное выполнение кода.
Так уж получилось, но выполнение команд операционной системы в Oracle не так тривиально, как вызов xp_cmdshell в MS SQL, даже при наличии привилегий DBO. Однако есть как минимум два отличных способа выполнения команд — использование процедур Java и применение пакета DBMS_SCHEDULER. Кстати, в случае обнаружения SQL-инъекции в веб-приложении можно получить удаленное выполнение кода (RCE), конечно, если у пользователя, от имени которого оно запускается, достаточно прав. Настоятельно рекомендую подготовить на этом этапе инструмент для атак на базы данных Oracle ODAT. Не забудьте установить необходимые библиотеки Python для работы с Oracle, а также сам Instant Client.
Итак, представьте, что у нас есть система бронирования администратора. Очень популярный способ выполнения команд на сервере в этом SLEX.
The external perimeter. The Listener is Under Attack
Anyone who has ever encountered this database knows that interaction with Oracle RDBMS is carried out through TNS Listener. Listener is a kind of connection balancer. By default, the listener listener listens to the 1521st TCP port (in the “future” Oracle promises to go to 2483 and 2484/SSL) and deals incoming connections depending on which is requested by the database, which, accordingly, allows you to work with several. Identification of a particular database takes place on the basis of the alphanumeric line - its SID'a (System IDentifier). There is also the concept of SYSTEM_NAME, which can most often be perceived as an analogue of SID (from a pentest point of view, of course).
It is with the attacks on the service of the userer, as a rule, the Oracle database punchet begins. The task of finding and determining the DBMS version is perfectly coped with Nmap. But the first thing for us is to get SID to connect to the “listener”, because without it the listener will not communicate with us. On this topic, Sh2kerr once wrote a great study of the Different to ways guess Oracle database SID.
The main methods of obtaining SID include a selection of typical values for a particular platform, since SID can be defaulted. For example, ORCL is default for regular Oracle, XE for the Oracle Express Edition. SID can also be obtained through third-party resources. For example, the EM-console web interface on port 1158; via SAP web_appserver, XDB and other things installed on top of Oracle. The system identifier can be twisted, since the listener when connecting returns various errors depending on whether there is such an SID or not. In addition, there is a long-standing practice of making short identifiers (3-4 characters). When too much, do not forget about the name of the company, the name of the system, the names of the hosts and other social aspects. The latter task is very effectively coped with the module from Memasloite auxiliary/scanner/oracle/sid_brute. For an attack, it is enough to specify the IP address of the deleted host. This is a very good sidish blot, it has a built-in dictionary on 600 typical values.
Кстати, встреча с версиями Oracle ниже 10.0 — настоящий праздник для пентестера. Listener — одна из старых версий с настройками по умолчанию, которая раскрывает всё, что можно, включая SID, версию СУБД, тип ОС, и имеет ряд важных уязвимостей (здесь мы используем утилиту lsnrtctl, которая входит в состав Oracle):
Примечание: Используя протокол TNS, вы можете отправить «слушателю» команду STATUS или SERVICE. В первом случае, даже если установлен пароль, слушатель предоставит много информации. STATUS вернет версию ОС, время работы, каталог файла журнала и SID. SERVICE также покажет версию ОС и SID.
LSNCTL: статус 192.168.1.100
Объясните с помощью
DoS-атака: Вы можете остановить прослушиватель.
LSNCTL: остановка 192.168.1.100
Объясните с помощью
DDoS-атаки: можно установить высокий уровень отслеживания событий, что часто приводит к повышенной нагрузке на процессор и расходует всё свободное дисковое пространство.
LSNRCTL: set trc_level 16
Объясните с помощью
DDDoS: с помощью следующих команд можно ввести некорректные настройки подключения, что приведет к неработоспособности сервиса:
LSNRCTL: установить connect_timeout
LSNRCTL: установить invalid_connect
Объясните с помощью
до RCE: можно изменить способ доступа к файлу журнала "прослушиватель":
LSNRCTL: установить log_file C:/boot.ini
Объясните с помощью
RCE! Если добавить к предыдущему абзацу, что все запросы попадают в bail, можно осуществить подобную атаку под Windows: указать путь к папке автозагрузки администратора (службы Oracle работают из-под системы, поэтому проблем с правами не будет) с расширением .bat и отправить такой TNS-запрос для подключения, чтобы какая-нибудь команда Windows зафиксировала это в логе. Например, добавление пользователя в ОС – `net user bab /add`. Когда администратор войдет в ОС (и мы поможем предыдущим примерам с DoS или чем-то подобным, наш злой bat запустится вместе со всеми командами внутри! Кстати, все, что будет записано там слушателем, будет пропущено как несуществующие команды, так что можете не беспокоиться.
Для реальной атаки мы будем использовать утилиту tenscd.pl, поскольку lsnrctlu не может отправлять пользовательские запросы. Первый запрос — это запись в логе bat-пакета в автозагрузке, второй — добавление пользователя:
tnscmd -h 192.168.1.100 -p 1521 --rawcmd "(DESCRIPTION=(CONNGECT_DATA=(CID=(PROGRAM=)(HOST=)(US)(US)(COMUND-_gmissile)(ARGUMENTS)(SERVICE=LISTENER)(VERSION=)(WALUE=C](US)(US)(US)(US)(COM.SSD)(MOS)(Aluminist\Adminator\Roamsoft>Winsoftware)(SERVICE=Litener)(VERSION=)(WALUE=C=C)(W.
tnscmd -h 192.168.1.100 -p 1521 --rawcmd "(DONCNECL_DATA=(((((
> net user Bob Marley /add
Объясните с помощью
В Linux можно аналогичным образом провернуть грязные трюки, например, добавить свои SSH-ключи. Подробнее об этом методе можно прочитать в книге А. Безопасность Oracle глазами аудитора: атака и защита. Кстати, часть описанных выше действий можно также выполнить с помощью одноименного модуля в Metasploit — auxiliary/admin/oracle/tnscmd. Наконец, если уже есть удаленный доступ к серверу с базой данных, можно украсть из userer.ora (это такой конфигурационный файл, он находится в $ORACLE_HOME/network/admin) хэш пароля «слушателя». Для подключения достаточно десятой его версии.
PASSWORDS_LISTENER = 334CC7A0C4F01A0
Объясните с помощью
Ещё раз подчеркну, что эти атаки актуальны только для Oracle до десятой версии включительно. Начиная с «десятков», удалённая конфигурация по умолчанию запрещена. Хотя некоторую информацию из кластера мы можем получить.
Внешний периметр. TNS Listener Poison
Если вы только что столкнулись с новой версией «слушателя», то выйти из неё уже не получится, остаётся только взращивание вредоносного ПО. Однако все версии, включая 12c, с настройками по умолчанию уязвимы для атаки, называемой TNS Listener Poison (разновидность атаки типа «человек под прицелом», MITM). При этом 12c уязвима только в некоторых конфигурациях. Например, одним из вариантов, который может нам помочь, является отключение динамической конфигурации «слушателя», что невозможно при использовании Oracle DataGuard, PL/SQL Gateway с подключением к APEX и некоторых версий SAP.
Суть в следующем: по умолчанию сервис «слушателя» поддерживает удалённую конфигурацию, необходимую для создания кластера баз данных (RAC – Real Application Cluster). Фактически, мы можем подключиться к «слушателю» и «зарегистрироваться», то есть сообщить ему, что мы являемся членом кластера, на котором работает его база данных. Далее можно ожидать подключений от клиентов, которые будут перенаправляться к нам слушателем. Но не все, а только части, потому что слушатель балансирует нагрузку на кластер: кто-то сразу подключится к реальной СУБД, кто-то перенаправит кого-то к нам. При этом для полноценной MITM-атаки ничто не мешает перенаправлять клиентов, подключающихся к нам, обратно в СУБД. И одновременно у нас будет возможность полностью контролировать передаваемый трафик: и просматривать его (данные, за исключением аутентификации, не шифруются), изменять команды и добавлять их.
Принцип использования уязвимости TNS Poison
Вот примерный алгоритм атаки:
Мы отправляем запрос TNS `CONNECT_DATA=(COMMAND=SERVICE_REGISTER_NSGR)`.
Уязвимый сервер ответит `(DESCRIPTION=(TMP=))`. Pattdy сообщит `(ERROR_STACK=(ERROR=1194)`.
Сформируйте конфигурационный пакет с SID и IP-адресом нового «слушателя» (нашего). Количество символов в имени текущего SID имеет принципиальное значение. Его необходимо знать, иначе он будет неправильно интерпретирован, и пакет не будет считаться «корректно сформированным».
Мы отправляем всё это «слушателю».
Если всё это правда, то после этого часть новых пользовательских подключений будет отправлена на IP-адрес, находящийся под нашим контролем.
Проверить уязвимость сервера можно с помощью одного из модулей MSF — `auxiliary/scanner/orace/tnspoison_checker`. Стоит отметить, что универсальных утилит, позволяющих полностью контролировать передаваемые данные во время MITM-атак, не существует. Это во многом связано со сложностью протокола orc, а также с большим количеством его разновидностей (количество зависит от версии базы данных, архитектуры хоста, ОС и языка программирования). С другой стороны, для конкретных целей и задач осуществить «харассмент» не составит труда.
ВВС
Архив со скриптами (прокси, отравитель) и подробным описанием уязвимости.
Внешний периметр. Пользователи используют метод грубой силы.
Получен SID? Отлично, перейдём к следующей типичной задаче – получаем запись. С этого момента можем подключиться к «слушателю» и блокировать учетные записи. В целом, Oracle когда-то был уязвим, и можно было сначала блокировать логины, а затем пароли (та же проблема: различные ошибки для существующих и несуществующих пользователей), но существующий торс устарел и работает очень нестабильно. С классическим способом блокировки учетных записей снова Metasploit и его модуль `auxiliary/scanner/oracle_login`. В нём есть встроенный словарь наиболее популярных учетных записей по умолчанию в виде логин:пароль. Хотя, конечно, он не охватывает все возможные варианты, и иногда приходится гуглить информацию о неработающей платформе или снова полагаться на воображение сотрудников. При этом не забывайте, что Oracle поддерживает политики паролей и может блокировать учетные записи.
Записи по умолчанию представляют собой одну из самых распространенных и одновременно серьезных проблем безопасности в Oracle. Таких пользователей много, у них разные привилегии, и некоторые из них не так легко отключить. Поэтому при проведении аудита продуктов Oracle очень важно изучить список учетных записей по умолчанию в документации. И если в «чистой» базе данных Oracle таких записей не так много, то если установить на нее ERP-систему, например, E-Business Suite, их окажется около 300! Для более тщательного, но долгосрочного анализа я советую обратиться к Nmap:
nmap --script oracle-brute -p 1521 --script-args oracle-brute.id=DSECRGG,userb=/oot/Desktop/ore/userdb, passdb=/Dosktop/oro/Desktop/o-passb 192.168.1.100
Объясните с помощью
Обратите внимание, что этот скрипт использует как логины, так и пароли, то есть при каждой попытке входа в систему проверяется каждый пароль, и это занимает довольно много времени!
Внешний периметр. Удалённая аутентификация ОС.
Более элегантный способ получить запись из базы данных — обойти проверку. Но это сработает только в том случае, если тестируемая система использует `удалённую аутентификацию ОС`. Суть в том, что СУБД Oracle имеет возможность перенести аутентификацию пользователя в ОС. Таким образом, если пользователь аутентифицирован в ОС, подключение к базе данных произойдёт без проверки пароля. Логины таких пользователей в базе данных имеют префикс ops$ (например, ops$Bob). И эта функция работает также с удалёнными хостами. Поэтому для атаки нам нужно подключиться к «слушателю» по имени пользователя и «сказать», что пароль проверяется в ОС, чтобы нас пропустили. Слушатель поверит и пропустит
Узнайте, как рассчитывается подобный счет (например, в SAP он "вычисляется" по известному алгоритму).
Создайте такую учетную запись ОС в своем автомобиле.
Подключайтесь к СУБД стандартными способами.
Если вы хотите попрактиковаться в своей испытательной лаборатории, то можете проверить методику, следуя пошаговому плану:
Проверьте наличие удаленной аутентификации. Введите ее в SQL-терминал:
показать параметр os_authent;
// Возвращает TRUE, если включено
Объясните с помощью
Включить r.auth (если FALSE):
alter system set remote_os_authent=TRUE=SPFILE;
Объясните с помощью
Создайте пользователя EVIL с префиксом ops:
создать пользователя ops$evil, идентифицированного как p@ssw0rd;
Объясните с помощью
Выдача прав:
предоставить доступ к ops$evil;
Объясните с помощью
Наконец, для подключения к базе данных с использованием удаленной аутентификации введите следующее:
sqlplus /@\"192.161.1.6.3:1521/orcl.maryll.local\"
/* Косая черта перед символом @, так сказать, указывает sqlplus, что проверка учетной записи выполняется из операционной системы */
Объясните с помощью
Кстати, пароль пользователя в операционной системе и пароль пользователя базы данных Oracle могут отличаться, это ни на что не влияет.
На конференции ZeroNights 2015 Роман Бажин (@nezlooy) поделился интересным наблюдением: оказалось, что при отправке пакета с запросом авторизации **можно заменить значение текущего пользователя**, и, следовательно, можно слишком сильно выйти из игры. Такая атака будет работать явно быстрее, чем прямой Burth, если нужно проверить только логины, без паролей. Более подробную информацию об удаленной аутентификации ОС можно найти здесь и здесь.
Внешний периметр. Дистанционная система скрытного прохода. Сила поддержки.
Ещё одна серьёзная уязвимость в СУБД Oracle — возможность удалённого получения хэша пароля любого пользователя и его последующего локального копирования. Уязвимыми к этой технике являются версии 11.1.0.6, 11.1.0.7, 11.2.0.1, 11.2.0.2 и 11.2.0.3. Чтобы понять суть уязвимости, необходимо рассмотреть, как работает протокол аутентификации с СУБД одиннадцатой версии (маньяки из Oracle в каждой новой ветке меняют протокол аутентификации). Взаимодействие с сервером происходит по следующей схеме:
Клиент подключается к серверу и отправляет имя пользователя.
Сервер генерирует идентификатор сессии (`ATH_SESSKEY`) и шифрует его с помощью AES-192. В качестве ключа используется хеш SHA-1, полученный из пароля пользователя, к которому добавляется соль (`ATH_VFR_DATA`).
Сервер отправляет клиенту зашифрованный идентификатор сессии и соль.
Клиент генерирует ключ, хешируя свой пароль и полученную соль. Используя этот ключ, клиент расшифровывает данные сессии, полученные от сервера.
На основе расшифрованного идентификатора серверной сессии клиент генерирует новый общий ключ, который будет использоваться в дальнейшем.
Самое интересное сейчас то, что идентификатор сессии `AUTH_SESSKEY`, который сервер отправляет клиенту, имеет длину 48 байт. Из них 40 байт случайные, а последние 8 — повторяющиеся значения 0x08 (заполнение). Вектор инициализации — 0x00 (Null). Зная, что последние 8 байт идентификатора всегда состоят из 0x08, мы можем отсортировать пароли, расшифровав идентификатор сессии (хеш мы берем из пароля, соль получаем от сервера) и проверив заполнение. И, как вы понимаете, все это происходит в автономном режиме, то есть с большой скоростью, особенно если использовать графический процессор. Для проведения атаки необходимо знать SID, действительный логин (например, учетная запись `SYS` очень интересна) и, конечно же, иметь возможность подключиться к базе данных. Если разорвать соединение, не обращаясь к пунктам 4 и 5, то в журналах аудита Oracle не будет записей типа «Неверная попытка входа» даже для получения идентификатора сессии и соли. Для лабораторного тестирования подобной атаки необходимо выполнить следующее:
С помощью Wireshark можно перехватывать трафик при запуске системы во время логирования. Фильтр TNS в этом поможет.
Удалите шестнадцатеричные значения AUTH_SESSKEY и AUTH_VFR_DATA.
Замените их в скрипте PoC, который будет использоваться для извлечения данных из словаря.
Приведённая выше ссылка — это всего лишь демонстрационный пример, необходимый для понимания принципа работы. В целом, хеши Oracle хорошо обрабатываются утилитами woraauthbf.
Внутренние атаки. Удаленное выполнение кода.
Так уж получилось, но выполнение команд операционной системы в Oracle не так тривиально, как вызов xp_cmdshell в MS SQL, даже при наличии привилегий DBO. Однако есть как минимум два отличных способа выполнения команд — использование процедур Java и применение пакета DBMS_SCHEDULER. Кстати, в случае обнаружения SQL-инъекции в веб-приложении можно получить удаленное выполнение кода (RCE), конечно, если у пользователя, от имени которого оно запускается, достаточно прав. Настоятельно рекомендую подготовить на этом этапе инструмент для атак на базы данных Oracle ODAT. Не забудьте установить необходимые библиотеки Python для работы с Oracle, а также сам Instant Client.
Итак, представьте, что у нас есть система бронирования администратора. Очень популярный способ выполнения команд на сервере в этом SLEX.