- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
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 dessa função, podemos realizar uma solicitação de falsificação de solicitação do lado do servidor SQL para nosso próprio host. Isso significa que podemos realizar uma injeção de SQL fora de banda para exfiltrar dados dos resultados da consulta SQL. Pelo menos, existem 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 de entrada para a porta PostgreSQL**, e em seguida, acionar uma conexão para nosso host com dados exfiltrados como `user`/`dbname`. Por **padrão**, o PostgreSQL não usa SSL para comunicação, portanto, 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. Só precisamos configurar um servidor com um IP público, instalar o PostgreSQL, definir o serviço PostgreSQL para ouvir \*/0.0.0.0 e executar um capturador de rede (por exemplo, tcpdump) para monitorar o tráfego para a porta PostgreSQL (5432 por padrão).
Então, podemos continuar a extrair o banco de dados usando várias consultas PostgreSQL. Note 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 de `dblink_connect`.
Parece que só há uma tabela vazia no esquema atual e a flag não está no banco de dados. Talvez precisemos realmente 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 receberemos uma conexão de entrada para que o usuário atual possa não ter permissão para usar essas funções.
É possível ler arquivos usando objetos grandes ([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, receberemos o `oid` do objeto.
Obtivemos 24668 como `oid`, o que significa que podemos usar a função `lo_import`. Infelizmente, não obteremos nenhum resultado 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 de 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 que o usuário atual o leia, podemos exfiltrar o conteúdo desse objeto.
Temos um monte de `oid`s. Podemos tentar usar `lo_get` para carregar o conteúdo do objeto. Por exemplo, `lo_get(16439)` irá 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 antes. O objeto do arquivo de flag existe com `oid` 16444. Não há espaços em branco na flag, então podemos exibi-la como está.
- Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.