| Квентин ХАРДИ |
| quentin.hardy@protonmail.com |
| quentin.hardy@bt.com |
ODAT
ODAT (Oracle Database Attacking Tool) — это инструмент для пентестинга с открытым исходным кодом, который тестирует безопасность Oracle баз данных удалённо.
Примеры использования ODAT:
* У вас есть Oracle база данных, доступная по сети, и вы хотите найти валидные SID и учётные данные для подключения к ней.
* У вас есть действующая учётная запись Oracle в базе данных, и вы хотите повысить свои привилегии, став DBA или SYSDBA.
* У вас есть учётная запись Oracle, и вы хотите выполнить системные команды (например, обратный shell), чтобы продвинуться дальше в операционной системе, на которой размещена база данных.
Протестировано на Oracle Database 10g, 11g, 12c, 18c и 19c.
Версия ODAT linux standalone доступна по адресу https://github.com/quentinhardy/odat/releases/. Обратите внимание, что рекомендуется использовать версию для разработки (git clone), ветку master-python3 (версия для Python 3).
История изменений
- Версия 5.1.1 (27/04/2022):
- вывод предупреждения при возникновении ошибки "ORA-12519 - TNS:no appropriate service handler found". Эта ошибка может быть вызвана сервером базы данных (прослушивателем), когда установлено слишком много соединений (например, при переборе учётных данных). В этом случае следует использовать параметр --sleep (например, --sleep 0.2).
- Версия 5.1 (12/03/2021):
- новый параметр во всех модулях: --nmap-file для загрузки всех Oracle баз данных из XML-файла вывода nmap.
- новый параметр во всех модулях: -l для загрузки всех целей из текстового файла (ip:port или ip по строке).
- во всех модулях теперь перед запуском тестов ODAT проверяется TCP-соединение с каждой целью. Для управления значением тайм-аута можно использовать --timeout-tcp-check.
- во всех модулях теперь выполняется проверка каждой цели на корректную конфигурацию TNS-прослушивателя. Эта проверка выполняется после проверки TCP-соединения.
- новый глобальный параметр: --client-driver. Позволяет задать имя клиента для подключения к базе данных (client_driver из V$SESSION_CONNECT_INFO).
Полезен для приложений, конечные пользователи которых не знают, что используется cx_Oracle. По умолчанию теперь 'sql*plus'.
- ODAT теперь принимает файл sqlnet.ora. Файл по умолчанию находится в conf/. Теперь тайм-аут для TCP-подключения и исходящего (TNS) подключения по умолчанию установлен на 60 секунд.
- Версия 5.0 (08/02/2021):
- Важный новый модуль: Service Name Guesser, для поиска валидных имён сервисов. Конкретный модуль называется snguesser и также интегрирован в модуль all. Теперь модуль all по умолчанию ищет все валидные имена сервисов после поиска SID. SID может совпадать с именем сервиса. Когда найдено имя сервиса, но не SID, имя сервиса может использоваться как SID для подключения.
- параметр --basic-info в модуле search для получения основной технической информации о базе данных/экземпляре. Он получает имя сервиса, SID, базы данных, статус Oracle Database Vault, статус Java, имя хоста, IP-адрес сервера, политику паролей, текущие системные привилегии, текущие роли, патчи (когда версия >= 12c и пользователь имеет привилегии) и т.д. Для получения очень интересной информации (например, политики паролей и статуса блокировки) требуются высокие привилегии.
- Обратный shell реализован в модуле DbmsScheduler, когда цель — Windows. Запускает минимальный HTTP-сервер, заставляет Oracle базу данных загрузить код PowerShell и выполнить его удалённо. Пользователь получает интерактивную оболочку PS. Загруженный файл удаляется автоматически.
- параметр --make-download реализован в DbmsScheduler, чтобы загрузить на цель Windows скрипт/бинарный файл.
- исправлена ошибка в выводе модуля DbmsScheduler (printOSCmdOutput()).
- улучшены пояснения в модуле DbmsScheduler (параметры).
- Версия 4.3 (28/06/2020):
- новый параметр: --both-ul. Пробовать каждый пароль в нижнем и верхнем регистре, если это не сделано в файле(ах) учётных данных.
- новый параметр: --random-order. Тестировать учётные записи в случайном порядке. По умолчанию используется порядок из текстового файла.
- теперь все пароли по умолчанию тестируются в нижнем регистре (файлы учётных записей изменены с верхнего на нижний регистр).
- добавлены некоторые новые учётные записи.
- Версия 4.2 (04/02/2020):
- минимальная интерактивная SQL-оболочка в модуле search.
- новая возможность для загрузки файлов с помощью DBMS_XSLPROCESSOR.read2clob в модуле DbmsXslprocessor.
- улучшение для получения удалённой ОС после аутентификации.
- исправление ошибок (например, размер терминала).
- Версия 4.1 (01/15/2020):
- Параметр для подключения с SERVICE NAME вместо SID.
- Кодировка по умолчанию установлена на UTF-8 для некоторых операций (например, NVARCHAR2 и NCLOB, VARCHAR2 и CLOB).
- Несколько исправлений ошибок (проблемы с кодировкой).
- Версия 4.0 (08/10/2019):
- Odat для python 3, стабильная версия.
- Версия 3.0 (01/09/2019):
- Совместимость с Oracle Database 18c.
- Новый параметр в Java-модуле для указания пути к оболочке (например, /usr/bin/sh в CentOS).
- Версия 2.3.2 (16/07/2019):
- Исправление ошибок:
- внешняя таблица и ложноположительные результаты.
- Версия 2.3.1 (10/08/2018):
- Новый параметр в Java-модуле для эксплуатации CVE-2018-3004: позволяет аутентифицированному пользователю произвольно записывать файлы в ОС (Повышение привилегий с обходом встроенной безопасности Oracle JVM). Подробности: http://obtruse.syfrtext.com/2018/07/oracle-privilege-escalation-via.html.
- Версия 2.3 (06/03/2018):
- Исправление ошибок:
- Некоторые учетные данные базы данных не могли быть обнаружены в модуле passwordguesser (когда он сначала пытался подключиться как SYSDBA/SYSOPER). Важное исправление!
- Отсутствовал вывод PPoutput в модуле smb (спасибо dirkjanm).
- Ложноположительные результаты в модуле tnspoison.
- Иногда не удавалось получить версию из VSNNUM.
- Улучшения:
- Улучшение производительности при переборе учётных записей.
- Параметр для подключения с помощью TNS Connection String.
- Новые простые учетные данные в файле accounts.
- Улучшенный метод чтения файлов в модуле dbmsLob (спасибо omair2084).
- Версия 2.2.1 (12/04/2017):
- Исправление ошибок:
- Версия в tnscmd (инфо).
- Внешний модуль (Перехват ошибки Oracle).
- Перехват ошибки при "не удалось подключиться к серверу".
- Tnscmd: "Для сервера SID необходимо указать параметр '-d SID'".
- Исправление ошибки TypeError в модуле tnspoison.
- Модуль TNS poisoning, когда порт!=1521 (ошибка целочисленного типа).
- Улучшения:
- Версия 2.2 (25/03/2016):
- Новый модуль (tnspoison) для эксплуатации атаки отравления TNS-прослушивателя (CVE-2012-1675). Огромное спасибо Joxean Koret и donctl.
- Некоторые исправления ошибок.
- Улучшенное меню справки.
- Страницы WIKI в репозитории ODAT.
- Версия 2.1 (04/03/2016) :
- Новый модуль (cve) для эксплуатации некоторых CVE (Common Vulnerabilities and Exposures). На данный момент реализована CVE-2012-3137 (возможно, это число, я не уверен...): Аутентифицированный пользователь может изменять все таблицы, которые он может выбирать (SELECT), даже если обычно он не может их изменять (нет привилегии ALTER).
- новый параметр (--accounts-files) для атаки удалённой аутентификации, который использует 2 отдельных файла: список логинов и список паролей.
- Вывод паролей в формате 10g для совместимости с oclHashcat.
- исправление ошибок (прослушивание с помощью nc).
- Версия 2.0 (21/02/2016) :
- Новый модуль (privesc) для использования системных привилегий пользователя Oracle (например, CREATE ANY PROCEDURE) для получения привилегированного доступа (т.е. DBA). Системные привилегии, которые может использовать ODAT в этой версии:
- CREATE ANY PROCEDURE: выполнение произвольных запросов с привилегиями APEX_040200 (например, изменение паролей пользователей Oracle).
- CREATE PROCEDURE и EXECUTE ANY PROCEDURE: выполнение произвольных запросов от имени SYS (например, предоставление роли DBA пользователю).
- CREATE ANY TRIGER (и CREATE PROCEDURE): выполнение произвольных запросов от имени SYS (например, предоставление роли DBA пользователю).
- ANALYZE ANY (и CREATE PROCEDURE): выполнение произвольных запросов от имени SYS (например, предоставление роли DBA пользователю).
- CREATE ANY INDEX (и CREATE PROCEDURE): выполнение произвольных запросов от имени SYS (например, предоставление роли DBA пользователю).
- Модуль privesc может быть использован для получения всех предоставленных системных привилегий и ролей. Он показывает системные привилегии, которые можно использовать для получения привилегированного доступа.
- новый параметр (-vvv) для отображения SQL-запросов, отправляемых ODAT, в отладке.
- автономная версия перенесена в releases (https://github.com/quentinhardy/odat/releases/).
- Версия 1.6 (14/07/2015) :
- новая возможность для определения уязвимости цели к отравлению TNS (CVE-2012-1675).
- новый модуль с именем unwrapper для распаковки обёрнутого исходного кода PL/SQL из файла или удалённой базы данных.
- выполнены некоторые улучшения.
- Версия 1.5 (17/03/2015) :
- новый модуль с именем search для поиска по именам столбцов
- внесены некоторые улучшения (например, вывод таблиц)
- новый параметр: кодировка вывода
- Версия 1.4 (07.12.2014) :
- исправлены некоторые ложные срабатывания
- улучшен модуль CVE-2012-3137: проверка возможности эксплуатации уязвимости стала проще
- Версия 1.3 (07.10.2014) :
- добавлен параметр -C в модуль all. Этот модуль можно использовать для работы с файлом, содержащим учетные данные (отключает параметры -U и -P)
- добавлен модуль tnscmd для получения алиаса TNS, версии базы данных (благодаря VSNNUM) и статуса TNS
- исправление ошибки: для параметра -s теперь можно указывать имя сервера
- Версия 1.2 (08.08.2014) :
- добавлен модуль SMB для перехвата аутентификации SMB
- добавлен параметр (SHOW_SQL_REQUESTS_IN_VERBOSE_MODE) в файле Constants.py для отображения SQL-запросов, отправляемых на сервер базы данных
- Версия 1.1 (28.07.2014) :
- добавлен модуль DBMS_LOB, полезный для загрузки файлов, хранящихся на удаленном сервере, через Oracle Database.
- исправление ошибки: исходный код Java: "getenv больше не поддерживается, используйте properties и -D вместо этого"
- Версия 1.0 (26.06.2014) :
- первая версия ODAT.
Возможности
Благодаря ODAT вы можете:
- искать валидный SID на удалённом прослушивателе Oracle Database с помощью:
- атаки по словарю
- атаки методом полного перебора
- АЛИАСА прослушивателя
- искать учетные записи Oracle с помощью:
- атаки по словарю
- использования каждого пользователя Oracle в качестве пароля (перед этой атакой необходима учетная запись)
- выполнять системные команды на сервере базы данных с помощью:
- DBMS_SCHEDULER
- JAVA
- внешних таблиц
- oradbg
- загружать файлы, хранящиеся на сервере базы данных, с помощью:
- UTL_FILE
- DBMS_XSLPROCESSOR
- внешних таблиц
- CTXSYS
- DBMS_LOB
- выгружать файлы на сервер базы данных с помощью:
- UTL_FILE
- DBMS_XSLPROCESSOR
- DBMS_ADVISOR
- удалять файлы с помощью:
- UTL_FILE
- получать привилегированный доступ, используя следующие комбинации системных привилегий (смотрите справку по командам модуля privesc):
- CREATE ANY PROCEDURE
- CREATE PROCEDURE и EXECUTE ANY PROCEDURE
- CREATE ANY TRIGER (и CREATE PROCEDURE)
- ANALYZE ANY (и CREATE PROCEDURE)
- CREATE ANY INDEX (и CREATE PROCEDURE)
- отправлять/получать HTTP-запросы с сервера базы данных с помощью:
- UTL_HTTP
- HttpUriType
- сканировать порты локального или удалённого сервера с помощью:
- UTL_HTTP
- HttpUriType
- UTL_TCP
- перехватывать аутентификацию SMB через:
- индекс для вызова SMB-соединения
- эксплуатировать некоторые CVE:
- CVE-2012-3137
- получение ключа сессии и соли для произвольных пользователей
- атака по словарю на сессии
- CVE-2012-????: Аутентифицированный пользователь может изменять все таблицы, которые он может выбирать, даже если он обычно не может их изменять (без привилегии ALTER).
- CVE-2012-1675 (известная как атрава отравления TNS)
- искать по именам столбцов с помощью модуля search:
- поиск шаблона (например, password) в именах столбцов
- распаковывать исходный код PL/SQL (10g/11g и 12c)
- получать системные привилегии и предоставленные роли. Также можно получить привилегии и роли предоставляемых ролей
- выполнять произвольные SELECT-запросы (так называемая минимальная SQL-оболочка)
Этот список не является исчерпывающим.
Карта ума - ODAT и пентесты Oracle Database

Поддерживаемые платформы и зависимости
ODAT совместим только с Linux.
Существует автономная версия, чтобы не устанавливать зависимости (см. https://github.com/quentinhardy/odat/releases/).
Автономная версия ODAT была создана с помощью pyinstaller.
Если вы хотите установить на свой компьютер версию для разработки, необходимы следующие инструменты и зависимости:
* Язык: Python 3
* Зависимости Oracle:
* Instant Oracle basic
* Instant Oracle sdk
* Библиотеки Python:
* cx_Oracle
* passlib
* pycrypto
* python-scapy
* python-libnmap (новая с python 5.1)
* colorlog (рекомендуется)
* termcolor (рекомендуется)
* argcomplete (рекомендуется)
* pyinstaller (рекомендуется)
Установка (опционально, для версии для разработки)
Этот раздел описывает, как установить instantclient, CX_Oracle и некоторые другие библиотеки Python в Ubuntu для использования версии ODAT для разработки.
Не забывайте, что существует автономная версия ODAT по адресу https://github.com/quentinhardy/odat/releases/: Для использования автономной версии установка чего-либо не требуется
- Клонируйте репозиторий для получения исходного кода ODAT:
git clone https://github.com/quentinhardy/odat.git
- Обновите страницы вики в этом репозитории, чтобы получить документацию ODAT локально:
cd odat/
git submodule init
git submodule update
- Загрузите instant client basic, sdk (devel) и sqlplus с веб-сайта Oracle:
- X64: http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
-
X86: http://www.oracle.com/technetwork/topics/linuxsoft-082809.html
-
В настоящее время (03/2021) для генерации автономной версии ODAT с помощью pyinstaller лучше всего подходит версия Oracle Database instant client 11.2.
Для использования версии ODAT для разработки можно использовать последнюю версию клиента Oracle (например, версию 19).
-
Установите пакеты python3-dev, alien и libaio1 (для sqlplus):
sudo apt-get install libaio1 python3-dev alien python3-pip
- Сгенерируйте DEB-файлы из RPM-файлов с помощью:
sudo alien --to-deb oracle-instantclient19.3-basic-???.x???.rpm
sudo alien --to-deb oracle-instantclient19.3-devel-???.x???.rpm
- Установите instant client basic, sdk и sqlplus:
sudo dpkg -i oracle-instantclient19.3-basic-???.x???.deb
sudo dpkg -i oracle-instantclient19.3-devel_???_???.deb
- Вставьте эти строки в файл /etc/profile для определения переменных окружения Oracle:
export ORACLE_HOME=/usr/lib/oracle/19.3/client64/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=${ORACLE_HOME}bin:$PATH
/usr/lib/oracle/19.3/client64/lib/
- Обновите ldpath с помощью:
sudo ldconfig
sudo -s
source /etc/profile
pip3 install cx_Oracle
- Проверьте, что все в порядке:
python3 -c 'import cx_Oracle'
Эта команда должна просто завершиться без ошибок.
- Установите некоторые библиотеки Python:
sudo apt-get install python3-scapy
sudo pip3 install colorlog termcolor pycrypto passlib python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete
- Скачайте и установите разрабатываемую версию pyinstaller (http://www.pyinstaller.org/) для python 3.
python setup.py install
- или установите через pip:
pip3 install pyinstaller
./odat.py -h
Хорошая работа, если у вас нет ошибок:)
Документация и примеры
Документация и примеры находятся в WIKI
Пожертвования
Если вы хотите поддержать мою работу, сделав пожертвование, я буду очень признателен:
- Через BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf