<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
Normalmente, `dblink_connect` pode ser usado para abrir uma conexão persistente com um banco de dados PostgreSQL remoto (por exemplo, `SELECT dblink_connect('host=HOST user=USER password=PASSWORD dbname=DBNAME')`). Como podemos controlar o parâmetro desta função, podemos realizar um SQL Server Side Request Forgery para o nosso próprio host. Isso significa que podemos realizar uma Injeção SQL Out-of-Band para exfiltrar dados dos resultados de consultas SQL. Existem pelo menos duas maneiras de fazer isso:
1. Configurar um **servidor DNS** e, em seguida, acionar a conexão para `[data].our.domain` para que possamos ver os dados no log ou nos pacotes de rede DNS.
2. Configurar um **servidor PostgreSQL público, monitorar os pacotes de rede que chegam à porta do PostgreSQL**, e então acionar uma conexão para o nosso host com dados exfiltrados como `user`/`dbname`. Por **padrão**, o PostgreSQL não usa SSL para comunicação, então podemos ver `user`/`dbname` como um **texto simples** na rede.
O **segundo método é mais fácil** porque não precisamos de nenhum domínio. Precisamos apenas configurar um servidor com um IP público, instalar o PostgreSQL, configurar o serviço PostgreSQL para ouvir em \*/0.0.0.0 e executar um dumper de rede (por exemplo, tcpdump) para monitorar o tráfego para a porta do PostgreSQL (5432 por padrão).
Então, podemos **continuar a extrair o banco de dados usando várias consultas PostgreSQL**. Observe que para cada resultado de consulta que contém espaços em branco, precisamos converter o resultado para **hex/base64** com a função `encode` ou substituir o espaço em branco por outro caractere com a função `replace`, pois isso causará um erro de execução durante o processo `dblink_connect`.
Parece que só tem uma tabela vazia no esquema atual e a flag não está no banco de dados. Podemos realmente precisar exfiltrar dados de `/var/lib/postgresql/data/secret`. Infelizmente, se tentarmos usar `pg_read_file` ou `pg_read_binary_file` para ler o arquivo, não obteremos uma conexão de entrada, de modo que o usuário atual pode não ter permissão para usar essas funções.
É possível ler arquivos usando large objects ([https://www.postgresql.org/docs/11/lo-funcs.html](https://www.postgresql.org/docs/11/lo-funcs.html)). Podemos usar `lo_import` para carregar o conteúdo do arquivo no catálogo `pg_largeobject`. Se a consulta for bem-sucedida, obteremos o `oid` do objeto.
Conseguimos 24668 como `oid`, o que significa que podemos usar a função `lo_import`. Infelizmente, não obteremos resultados se tentarmos obter o conteúdo do objeto grande usando `lo_get(24668)` ou acessar diretamente o catálogo `pg_largeobject`. **Parece que o usuário atual não tem permissão para ler o conteúdo de novos objetos.**
Após ler a documentação sobre objetos grandes no PostgreSQL, podemos descobrir que **objetos grandes podem ter ACL** (Lista de Controle de Acesso). Isso significa que, se houver um objeto antigo com uma ACL que permita ao usuário atual lê-lo, então podemos exfiltrar o conteúdo desse objeto.
Conseguimos uma série de `oid`s. Podemos tentar usar `lo_get` para carregar o conteúdo do objeto. Por exemplo, `lo_get(16439)` carregará o conteúdo de `/etc/passwd`. Como o resultado de `lo_gets` é `bytea`, precisamos convertê-lo para `UTF8` para que possa ser anexado na consulta.
Podemos tentar carregar alguns objetos com o menor `oid` para descobrir se o arquivo de flag foi carregado anteriormente. O objeto do arquivo de flag realmente existe com `oid` 16444. Não há espaços em branco na flag, então podemos exibi-la como está.
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).