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
vfs-service-sid — VFS para Git ab95cf51 - Medio - Local - Privilegio residual - la tubería del servicio confía en JSON OwnerSID | Kitploit
Herramientas/GitHubGitHub/abraxas/vfs-service-sid
Autenticación y AutorizaciónEscalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónPruebas de PenetraciónMala ConfiguraciónLabs y Práctica
GitHubabraxas/vfs-service-sid

vfs-service-sid

VFS para Git ab95cf51 - Medio - Local - Privilegio residual - la tubería del servicio confía en JSON OwnerSID

Ver Repositorio
5hace 4 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 - vfs-service-sid

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vfs-service-sid

vfs-service-sid

Clase: Privilegio residual Alcance: Local

VFS for Git master ab95cf51 (etiqueta v2.0.26259.1) - Microsoft

GVFS.Service se ejecuta como LocalSystem. WindowsPlatform.CreatePipeByName otorga a BUILTIN\Users ReadWrite | CreateNewInstance sobre GVFS.Service.pipe. RegisterRepoHandler.Run almacena el OwnerSID JSON tal cual. Nada llama a ImpersonateNamedPipeClient.

Cualquier principal de Users puede registrar una ruta del atacante bajo un SID de la víctima. En SessionLogon el servicio hace CreateProcessAsUser de gvfs mount <ruta del atacante> como la víctima. El hijo no es NT AUTHORITY\SYSTEM.

IDaún sin CVE
ClasePrivilegio residual (autorización faltante / ejecución entre usuarios)
AlcanceLocal
CWECWE-862, CWE-284
CVSSMedio: 6.6 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
ProductoVFS for Git
Afectadomaster ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; etiquetas de GitHub v2.0.26229.1 / v2.0.26259.1. Solo Windows.
AuthLocal. Cualquier principal BUILTIN\Users. Inicio de sesión de la víctima para el automontaje.
LicenciaGNU Affero GPL v3.0
LabSolo 127.0.0.1. how=gadget (sin GVFS.Service de Windows en vivo).

Git 2.35+ dubious-ownership puede entonces fallar git dentro de un árbol propiedad del atacante. El proceso aún se inicia como la víctima. Si la ruta es propiedad de la víctima pero escribible por el atacante (vfs-clone-acl), mount git, credential.helper y los hooks se ejecutan como ese usuario.

Qué puede hacer un atacante

Cualquier principal BUILTIN\Users en una máquina donde el servicio está instalado. Conectarse a \\.\pipe\GVFS.Service.pipe. Sin privilegio adicional.

PrivilegioMétodo / sinkQué otorgaRecon / integridad / disponibilidadProbado en lab o inferido
Listar cada raíz de enlistment activaGetActiveRepoListRequest sin comprobación de SID (TryGetActiveRepos, no GetActiveReposForUser)Rutas usadas como oráculo de nombre de pipe para el residual #2ReconProbado en lab. El gadget listó /lab/repos/victim
Desactivar un enlistment de la víctima para que no se automonteUnregisterRepoRequest {EnlistmentRoot} sin comprobación de SID (TryDeactivateRepo)Los repos de la víctima permanecen desmontadosDisponibilidadProbado en lab. La fila de la víctima desapareció de la lista activa
Persistir la ruta del atacante bajo el SID de la víctimaRegisterRepoRequest JSON EnlistmentRoot + OwnerSID; TryRegisterRepo almacena ambosFila de registro ruta del atacante + SID de la víctimaIntegridadProbado en lab. Fila de registro /lab/repos/attacker + S-1-5-21-1000-2000-3000-1001
Iniciar GVFS.exe mount <ruta del atacante> como la víctima al iniciar sesiónOnSessionChange SessionLogon -> AutoMountRepos(userId) -> TryRunAs / CreateProcessAsUserCreación de proceso entre usuarios como el usuario que inicia sesiónIntegridadProbado en lab en el gadget. Padre generado GVFS.Service, argv mount /lab/repos/attacker, uid 1002 victim, testigo escrito
Ejecutar como NT AUTHORITY\SYSTEMMismo automontajeHijo LocalSystemIntegridadCerrado. El whoami del hijo es la víctima, no SYSTEM (child-not-system=yes)
Git / hook / credential.helper como la víctima dentro de un árbol propiedad del atacanteLa creación del proceso aún ocurre; git 2.35+ safe.directory puede fallarRCE por hook como la víctima si el árbol es propiedad de la víctima pero escribible por el atacanteIntegridadInferido. El lab no ejecutó git de Microsoft. Vincular la ruta como propiedad de la víctima pero escribible por el atacante para RCE por hook

Cerrado en este pin: acceso remoto no autenticado (el named pipe es local). Shell SYSTEM. La ACL de pipe por defecto aún deja entrar a Users; un registro parcheado que vincula el SID del cliente (gadget X-Patched: 1) no automonta la ruta del atacante para la víctima.

Residuales del mismo pin: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-hook-impersonate, vfs-install-cwd.

Cómo lo encontré

Fijé VFSForGit master ab95cf51 tras el merge del 2026-09-28. La ACL del pipe del servicio es Users ReadWrite. Register almacena el OwnerSID JSON. SessionLogon automonta como ese SID. Nada suplanta al cliente del pipe.

Caminos equivocados ya registrados: llamar a esto un shell SYSTEM (el automontaje es CreateProcessAsUser del token de inicio de sesión); tratar git safe.directory como autorización del IPC; una reverse shell. Teatro. Faltaba Windows nativo, así que el lab es un gadget de los handlers del pin más un oráculo TCP de Unix.

Lab

python3 vfs-service-sid-Abraxas-Labs.py

o

cd lab
./run.sh

Gadget HTTP en 127.0.0.1:19660. Testigo VFS-SERVICE-SID-WITNESS. La última línea usa how=gadget.

SUCCESS vfs-service-sid how=gadget register-forged-sid=yes automount-as-victim=yes child-not-system=yes VFS-SERVICE-SID-WITNESS

La solución

Suplantar al cliente del named-pipe (ImpersonateNamedPipeClient / NamedPipeServerStream.RunAsClient). Ignorar el OwnerSID JSON; vincular TryRegisterRepo al SID del cliente. Restringir CreatePipeByName al usuario interactivo y LocalSystem (eliminar BuiltinUsersSid ReadWrite / CreateNewInstance). GetActiveRepoList debería devolver solo los repos de ese cliente. UnregisterRepo debería requerir la misma coincidencia de SID.

Referencias

Descargar herramienta