Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
prometheus-unix-socket-dial — Prometheus v3.15.0 - Élevé - À distance - SSRF - http_sd __unix_socket__ Dial non assaini résiduel du scrape UDS | Kitploit
Outils/GitHubGitHub/abraxas/prometheus-unix-socket-dial
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCollecte d'InformationsTests d'IntrusionLabs et Pratique
GitHubabraxas/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Prometheus v3.15.0 - Élevé - À distance - SSRF - http_sd __unix_socket__ Dial non assaini résiduel du scrape UDS

Voir le dépôt
1il y a 9 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Abraxas Labs - prometheus-unix-socket-dial

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  prometheus-unix-socket-dial

Write-up : https://abraxaslabs.tech/research/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Classe : SSRF Portée : Distante

Prometheus v3.15.0 (5241a27) - CNCF / Prometheus

La v3.15.0 a ajouté le scrape via Unix Domain Socket (#12024 / #18091). Le chemin est un label de cible __unix_socket__, et non une liste d'autorisation d'opérateur. http_sd et file_sd recopient ce label tel quel. PopulateLabels ne le valide jamais. newUnixSocketScrapeClient appelle ensuite DialContext(ctx, "unix", socketPath) sans filepath.Clean, sans liste d'autorisation et sans rejet des noms ../ ou des noms abstraits Linux @.

Le scrape TCP ne permet pas cela. CheckTargetAddress rejette toujours les valeurs __address__ contenant /, donc unix:///var/run/docker.sock en tant qu'adresse est rejeté. Le nouveau label constitue la faille.

La configuration par défaut ne définit pas le label. Un accès HTTP non authentifié à Prometheus ne permet pas d'ajouter des jobs. Cela est conditionné par le SD.

IDpas encore de CVE
ClasseSSRF (Dial unix non assaini depuis les labels SD)
PortéeDistante (conditionnée par le SD : auteur de http_sd / file_sd)
CWECWE-918, CWE-22
CVSSÉlevé : 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
ProduitPrometheus
Affectév3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd), image prom/prometheus:v3.15.0
AuthConditionnée par le SD : auteur des labels http_sd / file_sd (ou un relabel qui recopie des métadonnées non fiables dans __unix_socket__)
LicenceGNU Affero GPL v3.0
Lab127.0.0.1 uniquement

Ce qu'un attaquant peut faire

Le contrôle du JSON http_sd (ou d'un file_sd inscriptible) suffit. L'URL SD relève de la configuration de l'opérateur. Le point restant est que les labels du groupe peuvent définir __unix_socket__ et que Prometheus effectuera un Dial dessus.

PrivilègeMéthode / sinkProuvé en labo ou déduit
Se connecter à un socket unix hôte que l'UID Prometheus peut ouvrirclientForTarget -> DialContext(ctx, "unix", socketPath) depuis __unix_socket__Prouvé en labo. Chemin /sockets/jail/../oracle.sock depuis http_sd ; santé du scrape up
Suivre ../ dans ce cheminpas de filepath.Clean / pas de rejet de ..Prouvé en labo. Le noyau a résolu la traversée vers /sockets/oracle.sock
Se connecter à un socket abstrait Linuxmême Dial de @nameProuvé en labo. __unix_socket__=@prom-lab-oracle ; santé du scrape up
HTTP GET sur ce socket en tant qu'UID Prometheusle scrape est un GET ; __metrics_path__ est le chemin de la requêteProuvé en labo. GET /fs-traversal et /abstract ; User-Agent Prometheus/ ; lab_witness ingéré
Atteindre des sockets que le scrape TCP ne peut pas nommerCheckTargetAddress rejette / dans __address__Prouvé en labo. unix:///var/run/docker.sock en tant que __address__ a journalisé is not a valid hostname ; pas une cible active ; prometheus_target_sync_failed_total=1
GET sur les API HTTP de Docker Engine / kubelet si ces sockets sont dans le périmètre__unix_socket__=/var/run/docker.sock plus un chemin d'API DockerDéduit. Même Dial non assaini. Ce labo ne monte pas de vrai socket de moteur. Les API JSON échouent généralement à l'analyse d'exposition, donc le niveau High concerne la connexion/le GET, pas l'exfiltration TSDB du JSON Docker
Modifier Docker (créer un conteneur, écrire)verbes de scrapeFermé. Le scrape est en GET uniquement
Ajouter des jobs de scrape via l'HTTP Prometheus non authentifié/-/reload, API adminFermé. Les deux flags sont désactivés par défaut ; reload n'a pas de corps
Utiliser ceci sur la config d'exemple par défaut__unix_socket__ non défini ; l'exemple scrape localhost:9090 en TCPFermé. Les SD k8s/consul/docker intégrés n'émettent que des __meta_* ; ces préfixes sont supprimés après relabel

Le modèle de sécurité du fournisseur permet déjà au SD de choisir des cibles de scrape TCP. La nouvelle primitive est l'IPC hôte que __address__ ne pouvait pas nommer.

Comment je l'ai trouvé

J'ai épinglé prometheus/prometheus v3.15.0 après la ligne FEATURE de la 3.15 pour le scrape UDS. L'OSS par défaut sur cet épinglage a l'API admin, le lifecycle HTTP, le récepteur remote-write et le récepteur OTLP désactivés. PopulateDiscoveredLabels copie chaque label de groupe http_sd. __unix_socket__ n'est pas __meta_*, donc il survit à l'effacement des meta. PopulateLabels ne vérifie que __address__.

func (sp *scrapePool) clientForTarget(t *Target) *http.Client {
	socketPath := t.labels.Get(UnixSocketLabel)
	if socketPath == "" {
		return sp.client
	}
	client, err := newUnixSocketScrapeClient(socketPath, ...)
func newUnixSocketScrapeClient(socketPath string, ...) (*http.Client, error) {
	optFuncs = append([]config_util.HTTPClientOption{config_util.WithDialContextFunc(
		func(ctx context.Context, _, _ string) (net.Conn, error) {
			return (&net.Dialer{}).DialContext(ctx, "unix", socketPath)
		},
	)}, optFuncs...)

CheckTargetAddress rejette toujours / dans l'adresse. URL() conserve scheme/host/path depuis __scheme__ / __address__ / __metrics_path__ ; le socket est en dial-only.

Fausses pistes déjà consignées : noter cela comme NONE dans le modèle parce que SD choisit déjà des cibles TCP (la nouvelle primitive est l'IPC hôte) ; traiter unix:///var/run/docker.sock comme __address__ comme la faille (il est rejeté) ; affirmer que la config d'exemple par défaut est ce reliquat. Théâtre : un reverse shell. L'oracle est la santé du scrape up sur les sockets nommés par le JSON SD.

Lab

python3 prometheus-unix-socket-dial-Abraxas-Labs.py

ou

cd lab
./run.sh

prom/prometheus:v3.15.0 partage un netns avec un sidecar Python. Le sidecar sert http_sd à l'adresse 127.0.0.1:8080/targets.json et deux oracles HTTP unix : le système de fichiers /sockets/oracle.sock et l'abstrait @prom-lab-oracle. Prometheus est publié à l'adresse 127.0.0.1:19390. L'API d'administration et le cycle de vie restent désactivés.

SUCCESS prometheus-unix-socket-dial sd=http_sd fs-traversal=yes abstract=yes tcp-slash-rejected=yes how=sd-labels PROMETHEUS-UNIX-SOCKET-DIAL-WITNESS

IOC : scrapeUrl=http://localhost:1/fs-traversal et /abstract, tous deux avec l'état de santé up. Le slash TCP n'est jamais devenu une cible active.

Le correctif

Télécharger l’outil