Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
prometheus-unix-socket-dial — Prometheus v3.15.0 – Hoch – Remote – SSRF – http_sd __unix_socket__ unsanitisierter Dial-Rest des UDS-Scrape | Kitploit
Tools/GitHubGitHub/abraxas/prometheus-unix-socket-dial
SchwachstellenanalyseExploitationWebanwendungs-ExploitationInformationsbeschaffungPenetrationstestsLabs & Praxis
GitHubabraxas/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Prometheus v3.15.0 – Hoch – Remote – SSRF – http_sd __unix_socket__ unsanitisierter Dial-Rest des UDS-Scrape

Repository anzeigen
1vor 9 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

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

Klasse: SSRF Reichweite: Remote

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

v3.15.0 führte Unix Domain Socket Scraping ein (#12024 / #18091). Der Pfad ist ein Target-Label __unix_socket__, keine Operator-Allowlist. http_sd und file_sd kopieren dieses Label unverändert durch. PopulateLabels validiert es nie. newUnixSocketScrapeClient ruft anschließend DialContext(ctx, "unix", socketPath) auf, ohne filepath.Clean, ohne Allowlist und ohne Ablehnung von ../ oder Linux-Abstract-Namen mit @.

TCP-Scraping kann das nicht. CheckTargetAddress verwirft weiterhin __address__-Werte, die / enthalten, sodass unix:///var/run/docker.sock als Adresse abgelehnt wird. Das neue Label ist die Lücke.

Die Standardkonfiguration setzt das Label nicht. Unauth HTTP zu Prometheus kann keine Jobs hinzufügen. Dies ist SD-gated.

IDnoch keine CVE
KlasseSSRF (unsanitized unix Dial aus SD-Labels)
ReichweiteRemote (SD-gated: Schreiber von http_sd / file_sd)
CWECWE-918, CWE-22
CVSSHigh: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
ProduktPrometheus
Betroffenv3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd), Image prom/prometheus:v3.15.0
AuthSD-gated: Schreiber von http_sd / file_sd-Labels (oder ein Relabel, das nicht vertrauenswürdige Metadaten in __unix_socket__ kopiert)
LizenzGNU Affero GPL v3.0
Labnur 127.0.0.1

Was ein Angreifer tun kann

Die Kontrolle über http_sd-JSON (oder beschreibbares file_sd) genügt. Die SD-URL ist Operator-Konfiguration. Der verbleibende Punkt ist, dass Gruppen-labels __unix_socket__ setzen können und Prometheus dieses dann per Dial anspricht.

PrivilegMethode / SinkIm Labor nachgewiesen oder abgeleitet
Verbindung zu einem Host-Unix-Socket, den die Prometheus-UID öffnen kannclientForTarget -> DialContext(ctx, "unix", socketPath) aus __unix_socket__Im Labor nachgewiesen. Pfad /sockets/jail/../oracle.sock aus http_sd; Scrape-Health up
../ in diesem Pfad folgenkein filepath.Clean / keine ..-AblehnungIm Labor nachgewiesen. Der Kernel löste den Traversal zu /sockets/oracle.sock auf
Ein Linux-Abstract-Socket dialenderselbe Dial von @nameIm Labor nachgewiesen. __unix_socket__=@prom-lab-oracle; Scrape-Health up
HTTP GET auf diesem Socket als die Prometheus-UIDScrape ist GET; __metrics_path__ ist der Request-PfadIm Labor nachgewiesen. GET /fs-traversal und /abstract; User-Agent Prometheus/; lab_witness ingestiert
Sockets erreichen, die TCP-Scrape nicht benennen kannCheckTargetAddress lehnt / in __address__ abIm Labor nachgewiesen. unix:///var/run/docker.sock als __address__ protokollierte is not a valid hostname; kein aktives Target; prometheus_target_sync_failed_total=1
GET auf Docker Engine / kubelet HTTP APIs, falls diese Sockets im Scope liegen__unix_socket__=/var/run/docker.sock plus ein Docker-API-PfadAbgeleitet. Derselbe unsanitisierte Dial. Dieses Labor mountet keinen echten Engine-Socket. JSON-APIs scheitern üblicherweise an der Exposition-Parse, daher ist das High der Connect/GET, nicht TSDB-Exfil von Docker-JSON
Docker mutieren (Container erstellen, schreiben)Scrape-VerbenGeschlossen. Scrape ist GET-only
Scrape-Jobs über unauthentifiziertes Prometheus-HTTP hinzufügen/-/reload, Admin-APIGeschlossen. Beide Flags standardmäßig aus; Reload hat keinen Body
Dies auf der Standard-Beispielkonfiguration verwenden__unix_socket__ nicht gesetzt; Beispiel scrapt localhost:9090 über TCPGeschlossen. In-tree k8s/consul/docker SD emittieren nur __meta_*; diese Präfixe werden nach Relabel gelöscht

Das Sicherheitsmodell des Herstellers erlaubt SD bereits, TCP-Scrape-Targets zu wählen. Das neue Primitiv ist Host-IPC, die __address__ nicht benennen konnte.

Wie ich es gefunden habe

Ich habe prometheus/prometheus v3.15.0 nach der 3.15-FEATURE-Zeile für UDS-Scrape gepinnt. Das Standard-OSS auf diesem Pin hat Admin-API, Lifecycle-HTTP, Remote-Write-Receiver und OTLP-Receiver aus. PopulateDiscoveredLabels kopiert jedes http_sd-Gruppenlabel. __unix_socket__ ist nicht __meta_*, daher übersteht es den Meta-Wipe. PopulateLabels prüft nur __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 lehnt weiterhin / in der Adresse ab. URL() behält Schema/Host/Pfad aus __scheme__ / __address__ / __metrics_path__; der Socket dient nur zum Wählen.

Bereits festgehaltene Fehlannahmen: dies als In-Modell-NONE zu bewerten, weil SD bereits TCP-Ziele auswählt (das neue Primitiv ist Host-IPC); unix:///var/run/docker.sock als __address__ als die Lücke zu behandeln (es wird abgelehnt); zu behaupten, die Standard-Beispielkonfiguration sei dieser Überrest. Theater: eine Reverse Shell. Das Orakel ist die Scrape-Gesundheit up auf Sockets, die das SD-JSON benannt hat.

Lab

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

oder

cd lab
./run.sh

prom/prometheus:v3.15.0 teilt sich einen netns mit einem Python-Sidecar. Der Sidecar stellt http_sd unter 127.0.0.1:8080/targets.json und zwei Unix-HTTP-Orakel bereit: Dateisystem /sockets/oracle.sock und abstrakt @prom-lab-oracle. Prometheus wird unter 127.0.0.1:19390 veröffentlicht. Admin-API und Lifecycle bleiben deaktiviert.

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 und /abstract, beide Health-Status up. Der TCP-Slash wurde nie zu einem aktiven Target.

Die Behebung

Rufe __unix_socket__ nicht von SD aus per Dial auf, solange es kein bereinigter absoluter Dateisystempfad ist. Lehne leere Werte, NUL, Linux-Abstract-@-Namen, relative Pfade und jedes .. nach filepath.Clean ab. Eine Allowlist von Präfixen aus der Scrape-YAML ist stärker. Auch das Entfernen des Labels aus PopulateDiscoveredLabels, sofern es nicht aus der Operator-Konfiguration stammt, schließt die SD-Injection.

Referenzen

Tool herunterladen