Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
prometheus-unix-socket-dial — Prometheus v3.15.0 - Alta - Remota - SSRF - http_sd __unix_socket__ Dial sin sanear remanente de scrape UDS | Kitploit
Herramientas/GitHubGitHub/abraxas/prometheus-unix-socket-dial
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebRecopilación de InformaciónPruebas de PenetraciónLabs y Práctica
GitHubabraxas/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Prometheus v3.15.0 - Alta - Remota - SSRF - http_sd __unix_socket__ Dial sin sanear remanente de scrape UDS

Ver Repositorio
1hace 9 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Abraxas Labs - prometheus-unix-socket-dial

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

Análisis: https://abraxaslabs.tech/research/prometheus-unix-socket-dial

prometheus-unix-socket-dial

Clase: SSRF Alcance: Remoto

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

v3.15.0 añadió el scrape de Unix Domain Socket (#12024 / #18091). La ruta es una etiqueta de destino __unix_socket__, no una lista de permitidos del operador. http_sd y file_sd copian esa etiqueta tal cual. PopulateLabels nunca la valida. Después, newUnixSocketScrapeClient llama a DialContext(ctx, "unix", socketPath) sin filepath.Clean, sin lista de permitidos y sin rechazar ../ ni los nombres abstractos de Linux @.

El scrape TCP no puede hacer esto. CheckTargetAddress sigue descartando los valores de __address__ que contienen /, por lo que unix:///var/run/docker.sock como dirección es rechazado. La nueva etiqueta es el agujero.

La configuración por defecto no establece la etiqueta. El HTTP sin autenticación a Prometheus no puede añadir jobs. Esto está condicionado por SD.

IDaún sin CVE
ClaseSSRF (Dial unix sin sanear desde etiquetas SD)
AlcanceRemoto (condicionado por SD: escritor de http_sd / file_sd)
CWECWE-918, CWE-22
CVSSAlto: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N
ProductoPrometheus
Afectadov3.15.0 (5241a27fe3c6983549fccc32f6e65917408c63cd), imagen prom/prometheus:v3.15.0
AutenticaciónCondicionado por SD: escritor de etiquetas http_sd / file_sd (o un relabel que copie metadatos no confiables en __unix_socket__)
LicenciaGNU Affero GPL v3.0
Laboratoriosolo 127.0.0.1

Qué puede hacer un atacante

Basta con controlar el JSON de http_sd (o un file_sd escribible). La URL de SD es configuración del operador. Lo que queda es que las labels del grupo pueden establecer __unix_socket__ y Prometheus hará Dial sobre ella.

PrivilegioMétodo / sinkDemostrado en laboratorio o inferido
Conectarse a un socket unix de host que el UID de Prometheus puede abrirclientForTarget -> DialContext(ctx, "unix", socketPath) desde __unix_socket__Demostrado en laboratorio. Ruta /sockets/jail/../oracle.sock desde http_sd; salud del scrape up
Seguir ../ en esa rutasin filepath.Clean / sin rechazo de ..Demostrado en laboratorio. El kernel resolvió el recorrido a /sockets/oracle.sock
Marcar un socket abstracto de Linuxmismo Dial de @nameDemostrado en laboratorio. __unix_socket__=@prom-lab-oracle; salud del scrape up
HTTP GET en ese socket como el UID de Prometheusel scrape es GET; __metrics_path__ es la ruta de la peticiónDemostrado en laboratorio. GET /fs-traversal y /abstract; User-Agent Prometheus/; lab_witness ingerido
Alcanzar sockets que el scrape TCP no puede nombrarCheckTargetAddress rechaza / en __address__Demostrado en laboratorio. unix:///var/run/docker.sock como __address__ registró is not a valid hostname; no es un target activo; prometheus_target_sync_failed_total=1
GET a las APIs HTTP de Docker Engine / kubelet si esos sockets están en alcance__unix_socket__=/var/run/docker.sock más una ruta de la API de DockerInferido. Mismo Dial sin sanear. Este laboratorio no monta un socket real del engine. Las APIs JSON normalmente fallan el parseo de exposición, así que el riesgo Alto es la conexión/GET, no la exfiltración de JSON de Docker vía TSDB
Mutar Docker (crear contenedor, escribir)verbos del scrapeCerrado. El scrape es solo GET
Añadir trabajos de scrape sobre HTTP de Prometheus sin autenticación/-/reload, API de administraciónCerrado. Ambas flags están desactivadas por defecto; reload no tiene cuerpo
Usar esto en la configuración de ejemplo por defecto__unix_socket__ sin definir; el ejemplo hace scrape de localhost:9090 sobre TCPCerrado. Los SD k8s/consul/docker del árbol solo emiten __meta_*; esos prefijos se eliminan tras el relabel

El modelo de seguridad del proveedor ya permite que el SD elija targets de scrape TCP. La nueva primitiva es IPC de host que __address__ no podía nombrar.

Cómo lo encontré

Fijé prometheus/prometheus v3.15.0 tras la línea FEATURE de 3.15 para scrape UDS. El OSS por defecto en este pin tiene desactivadas la API de administración, el ciclo de vida HTTP, el receptor remote-write y el receptor OTLP. PopulateDiscoveredLabels copia cada etiqueta de grupo de http_sd. __unix_socket__ no es __meta_*, así que sobrevive al borrado de meta. PopulateLabels solo comprueba __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 sigue rechazando / en la address. URL() conserva scheme/host/path de __scheme__ / __address__ / __metrics_path__; el socket es solo para dial.

Errores ya registrados: puntuar esto como NONE en el modelo porque SD ya elige objetivos TCP (la nueva primitiva es IPC de host); tratar unix:///var/run/docker.sock como __address__ como el agujero (se rechaza); afirmar que la configuración de ejemplo por defecto es este remanente. Teatro: una reverse shell. El oráculo es la salud de scrapeo up en los sockets que el JSON de SD nombró.

Laboratorio

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

o

cd lab
./run.sh

prom/prometheus:v3.15.0 comparte un netns con un sidecar de Python. El sidecar sirve http_sd en 127.0.0.1:8080/targets.json y dos oráculos HTTP unix: el de sistema de archivos /sockets/oracle.sock y el abstracto @prom-lab-oracle. Prometheus se publica en 127.0.0.1:19390. La API de administración y el ciclo de vida permanecen desactivados.

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 y /abstract, ambos con estado up. La barra TCP nunca llegó a ser un objetivo activo.

La corrección

Descargar herramienta