Protection contre le vol de jeton d’accès (access token) avec INCOGNITO.EXE

Salut à tous

Cet article a pour but :
– De vous présenter ce qu’est un SID, un service, un processus.
– De vous présenter ce qu’est un jeton d’accès (access token).
– De vous présenter ce qu’est un privilège et l’impersonation.
– Vous expliquez comment voler un jeton d’accès pour récupérer des droits (comme admins du domaine) avec un compte administrateur local uniquement.
– Vous protégrer contre le vol de jeton.

1. QU’EST-CE QU’UN SID, SERVICE, PROCESSUS ?
Un SID est un identifiant unique qui correspond à une ressource : un compte utilisateur, un groupe ou un compte ordinateur. Un SID permet de donner des permissions.
Quand on donne des permissions à l’utilisateur Admin-ldap sur un dossier appelé Divers (dans l’onglet Sécurité), seul le SID de ce compte est stocké au niveau du système de fichiers. Windows résout le SID en nom pour l’afficher dans l’onglet Sécurité pour simplifier la tâche de l’administrateur. Si on supprime le compte utilisateur Admin-ldap et que l’on ferme / ouvre de nouveau la session, l’ancien compte utilisateur apparaît sous forme d’un SID inconnu dans l’onglet Sécurité du dossier appelé Divers.
Le SID est unique par domaine et ne peut pas être affecté à une autre ressource.
Pour afficher le SID d’un utilisateur, utiliser ADSIEDIT ou l’outil PSGETSID :
http://technet.microsoft.com/en-us/sysinternals/bb897417.aspx
Un SID dispose de 3 parties.
Exemple avec S-1-5-21-1712426984-1618080182-1209977580-1109 :
S-1-5- : indique que le SID a été généré par Windows Security_NT_Authority.
21-1712426984-1618080182-1209977580 : représente l’identifiant unique du domaine
1109 : c’est l’identifiant unique de la ressource (un compte utilisateur dans notre cas).
Certains SID s’affichent sous la forme suivante : S-1-5-32-544, S-1-5-32-545. Il s’agit des SID des groupes par défaut comme administrateurs ou utilisateurs authentifiés.

Les services sont des exécutables qui démarrent manuellement ou automatiquement dans le contexte d’un compte utilisateur spécifique (voir console services.msc).
Par exemple, le service NETLOGON s’exécute avec le compte SYSTEM (compte système local) et lance l’exécutable c:\windows\system32\lsass.exe.

Un processus est généré pour chaque exécutable qui démarre sur le système Windows (un service ou une application). On peut voir la liste des processus dans le gestionnaire des tâches (onglet Processus).

2. QU’EST-CE QU’UN JETON D’ACCÈS ?
Un jeton d’accès (ou Token, Access Token, Security Token : ce sont des synonymes / traductions) contient :
– Le SID (et le(s) SID History) du compte utilisateur du domaine.
– Le SID (et le(s) SID History) de chaque groupe du domaine auquel l’utilisateur appartient directement ou indirectement (un groupe membre d’un autre groupe).- Le SID de chaque groupe local (groupe de la base SAM de la machine) auquel l’utilisateur appartient
– La liste des privilèges de l’utilisateur (voir paragraphe ci-dessous pour plus d’informations).
Pour visualiser le contenu d’un jeton d’accès, il est possible d’utiliser l’outil Token SZ téléchargeable à cette adresse :
http://www.microsoft.com/en-us/download/details.aspx?id=1448
Sur une machine Windows 2003, lancer la commande suivante :
tokensz.exe /compute_tokensize /dump_groups
Cette commande liste tous le SID du compte utilisateur et des groupes dont il est membre directement (ou indirectement) ainsi que tous ses privilèges.
Un jeton d’accès est généré quand un processus démarre.
Un jeton d’accès permet d’accéder à une ressource (validation des ACL sur les volumes en NTFS…).
Il existe différents types de jeton d’accès :
– Jeton primaire (Primary Token) : ce type de jeton est généré lors des ouvertures de session interactive (locale) ou Batch et sont dit de type 2 dans les événements du journal de sécurité.
– Impersonation jeton (Impersonation Token) : ce type de jeton est généré lors des ouvertures de session réseau et sont dit de type 3 dans les événements du journal de sécurité.

Dans l’exemple ci-dessous, le processus d’ouverture de session Novell (quand on installe le client Novell) initie une ouverture de session interactive (type = 2) :
Type de l’événement : Audit des succès
Source de l’événement : Security
Catégorie de l’événement : Ouverture/Fermeture de session
ID de l’événement : 528
Date : 12/5/2013
Heure : 12:24:14 PM
Utilisateur : ARCHIDFS\administrateur
Ordinateur : SRVDFSR1
Description :
Ouverture de session réseau réussie :
Utilisateur : administrateur
Domaine : ARCHIDFS
Id. de la session : (0x0,0x10BB91)
Type de session : 2
Processus de session : NWGINA
Package d’authentification : Negotiate
Station de travail : SRVDFSR1
GUID d’ouv. de session : {c1d9aa40-fb49-ef62-aa1a-c3b1274d8389}
Nom de l’utilisateur appelant : SRVDFSR1$
Domaine appelant : ARCHIDFS
Id. de session de l’appelant : (0x0,0x3E7)
ID de processus appelant : 372
Services en transit : -% Adresse réseau source : –
Port source : –

Pour plus d’informations sur les jetons d’accès :
http://blogs.technet.com/b/askds/archive/2007/11/02/what-s-in-a-token.aspx
http://blogs.technet.com/b/askds/archive/2008/01/11/what-s-in-a-token-part-2-impersonation.aspx

3. QU’EST-CE QU’UN PRIVILÈGE ET L’IMPERSONATION ?
Pour simplifier, les privilèges ce sont des droits donnés à un utilisateur comme le fait de pouvoir contourner les permissions NTFS (Take ownership of files or other objects) ou d’accéder à la mémoire (Debug programs) au niveau de la base de registre.
Les comptes administrateur et SYSTEM dispose de tous les droits sur une machine Windows car ils disposent d’un accès presque complet au système de fichiers (permissions NTFS) et de tous privilèges.

L’article Microsoft http://technet.microsoft.com/en-us/library/bb457125.aspx explique la notion de privilège en détails sur un système Windows. Ci-dessous la liste des privilèges (autres que ceux pour ouvrir une session…) :
– Act as part of the operating system(SeTcbPrivilege) : ce privilège permet d’outrepasser certains contrôles lors de l’ouverture de session. Il est réservé aux processus censés ouvrir les sessions des utilisateurs. Par exemple, winlogon.exe et le service seclogon ont besoin de ce privilège. Il est recommandé de donner ce privilège à personne.
– Add workstations to domain (SeMachineAccountPrivilege) : permet d’ajouter une machine dans le domaine (jusqu’à 10 stations de travail par défaut).
Adjust memory quotas for a process(SeIncreaseQuotaPrivilege)
– Back up files and directories(SeBackupPrivilege) : permet de sauvegarder les données même sans avoir les permissions.
– Bypass traverse checking (SeChangeNotifyPrivilege)
– Change the system time (SeSystemTimePrivilege) : permet de changer l’heure sur une machine.
– Create a token object (SeCreateTokenPrivilege) : créer un jeton d’accès.
– Create a pagefile (SeCreatePagefilePrivilege) : permet de créer le fichier pagefile.sys.
– Create global objects (SeCreateGlobalPrivilege)
– Debug programs (SeDebugPrivilege) : ce droit permet à un utilisateur d’accéder à l’espace mémoire de n’importe quels processus. C’est sur ce privilège que repose l’outil INCOGNITO.EXE (pour le vol de jeton d’accès). Normalement, aucun service de production ne doit reposer sur ce privilège, il sert en général au développement d’applications et au troubleshooting avancé. Par défaut, les Administrateurs ont ce privilège. Il est recommandé de changer ce paramètre par défaut (définir la GPO avec aucun compte sauf besoin spécifique).
– Enable computer and user accounts to be trusted for delegation (SeEnableDelegationPrivilege) : permet de faire de la délégation (voir paragraphe sur la délégation ci dessous).
– Force shutdown from a remote system (SeRemoteShutdownPrivilege) : permet d’arrêter la machine à distance.
– Generate security audits (SeAuditPrivilege) : détermine le compte qui peut générer des événements dans le journal sécurité.
– Impersonate a client after authentication (SeImpersonatePrivilege) : permet à un processus de prendre l’identité d’un utilisateur qu’il aurait authentifié.  Par défaut, les Administrateurs, SERVICE, LOCAL SERVICE et NETWORK SERVICE ont ce privilège. Seuls des comptes de services (dont ceux built-ins) réalisant de l’impersonation devraient avoir ce privilège.
– Increase scheduling priority (SeIncreaseBasePriorityPrivilege) : permet de déterminer quel compte utilisateur a le droit de changer la priorité d’un processus dans le gestionnaire de tâches.
– Load and unload device drivers (SeLoadDriverPrivilege) : permet de déterminer qui peut charger / décharger un pilote.
– Lock pages in memory (SeLockMemoryPrivilege) : détermine les comptes utilisateurs peuvent utiliser un processus destiné à conserver les données en mémoire physique pour éviter leur pagination en mémoire virtuelle sur le disque.
– Manage auditing and security log (SeSecurityPrivilege) : détermine les comptes utilisateurs qui peuvent définir des entrées d’audit au niveau d’un dossier / registre et qui peuvent accéder / purger au journal Sécurité.
– Modify firmware environment values (SeSystemEnvironmentPrivilege) : Permet de configurer le mode dernière bonne configuration sur un système 32 bits et 64 bits et d’exécuter la commande bootcfg (modification du démarrage) sur OS Windows 64 bits uniquement.
– Perform volume maintenance tasks (SeManageVolumePrivilege) : déterminer les comptes utilisateurs qui peuvent planifier des tâches de maintenance sur un volume disque.
– Profile single process (SeProfileSingleProcessPrivilege) : détermine les comptes utilisateurs qui peuvent des analyses de performance sur des processus non systèmes.
– Profile system performance (SeSystemProfilePrivilege) : détermine les comptes utilisateurs qui peuvent des analyses de performance sur des processus systèmes.
– Remove computer from docking station (SeUndockPrivilege)
– Replace a process-level token (SeAssignPrimaryTokenPrivilege) : permet de changer ou d’assigner le jeton principal d’une application. Permet notamment de lancer un processus en tant qu’un autre utilisateur après s’être authentifié. C’est un usage plutôt orienté service. Par défaut seuls Network Service et Local Service ont ce privilège. Seuls les comptes de services réalisant de l’impersonation devraient avoir ce privilège.
– Restore files and directories (SeRestorePrivilege) : permet de déterminer les comptes utilisateurs qui peuvent passer outre les permissions lors des opération de restauration. L’utilisateur dispose d’un équivalent des permissions NTFS Traverse Folder / Execute file et Write.
– Shut down the system (SeShutdownPrivilege) : détermine quel utilisateur peuvent arrêter un ordinateur.
– Synchronize directory service data (SeSynchAgentPrivilege) : voir article
https://www.ultimatewindowssecurity.com/wiki/WindowsSecuritySettings/Synchronize-directory-service-data
– Take ownership of files or other objects (SeTakeOwnershipPrivilege) : permet de devenir propriétaire d’un fichier / dossier et donc de redéfinit les permissions NTFS. Ce droit permet donc d’outrepasser les permissions NTFS.

Il est possible d’affecter ces privilèges à des comptes utilisateurs en modifiant les paramètres dans Computer Configuration\Security Settings\Local Policies\User Rights Assignment.

Parfois un processus s’exécute dans le contexte d’un compte utilisateur A mais a besoin d’effectuer une autre tâche dans le contexte d’un autre compte utilisateur B.
Exemple d’un serveur de fichiers (applicable aussi à un serveur web) :
Le service « Serveur » s’exécute dans le contexte du compte SYSTEM et gère l’accès aux partages de fichiers. Quand un utilisateur se connecte à un serveur de fichiers, le service «Server » va générer un jeton d’accès dans le contexte du compte de l’utilisateur pour contrôler les accès aux ressources par cet utilisateur.
Pour pouvoir effectuer cette impersonnalisation, le processus du service de partages de fichiers doit avoir le privilège Impersonate a client after authentication(SeImpersonatePrivilege.).
Il existe 4 types d’impersonation :
– Anonymous : un processus peut générer un jeton d’accès avec les privilèges d’un utilisateur anonyme.
– Identification : un processus peut prendre votre jeton pour valider votre identité mais ne peut rien faire d’autres avec (pas de contrôle d’accès).
– Impersonation : un processus peut faire une tâche différente en tant qu’un autre utilisateur. L’impersonation est limité à l’ordinateur local et ne peut être utilisé pour effectuer des actions sur d’autres machines (autres machines membres du domaine par exemple).
– Delegation : même principe que l’impersonation mais il est possible d’effectuer des tâches sur l’ordinateur local et d’autres ordinateurs (autres machines du domaine par exemple). Cette fonctionnalité s’appuie sur le protocole Kerberos (on parle de “Double Hop Authentication).

4. UTILISATION DE L’OUTIL INCOGNITO POUR VOLER UN JETON D’ACCES
L’outil INCOGNITO ne s’appuie pas sur la fonctionnalité d’impersonation.
Il vole les jetons d’accès en s’appuyant sur le privilège Debug programs (SeDebugPrivilege). Pour rappel ce droit permet à un utilisateur « d’ouvrir » n’importe quel processus, d’accéder à son espace mémoire et de copier ses ressources.
L’outil INCOGNITO est disponible à l’adresse suivante :
http://sourceforge.net/projects/incognito/
De nombreux antivirus le détectent comme un virus. Il sera donc nécessaire de l’installer sur une machine avec un antivirus dont le scan temps réel est désactivé.
Incognito est maintenant intégré dans l’outil METASPLOIT (détecté aussi comme un virus parfois). Voir :
http://www.offensive-security.com/metasploit-unleashed/Fun_With_Incognito
http://blogs.technet.com/b/askds/archive/2008/01/11/what-s-in-a-token-part-2-impersonation.aspx

Pour lister tous les jetons disponibles :
Ouvrir une invite de commande en system sous Windows XP.
Lancer la commande suivante pour effectuer cela :
at 01:23 /interactive cmd.exe
http://verbalprocessor.com/2007/12/05/running-a-cmd-prompt-as-local-system/
http://technet.microsoft.com/en-us/library/cc771525.aspx

Une fois l’invite de commande exécuté en tant qu’utilisateur SYSTEM, taper la commande suivante :
incognito.exe -h localhost -u administrateur -p P@ssword list_tokens -u
Une fois que l’on voit les jetons d’accès. Ceux qui sont marqués « Delegation » peuvent être volés et utiliser pour lancer une invite de commande avec la commande suivante (on vole le jeton de archidfs\administrator dans cet exemple qui est Domain Admins sur ma plateforme de tests):
incognito.exe -h localhost -u administrateur -p P@ssword execute -c archidfs\administrator cmd
Entrer la commande whoami pour valider l’utilisateur en cours dans l’invite de commande.

Pour supprimer le processus lancés par INCOGNITO :
incognito.exe -h localhost cleanup

5. COMMENT SE PROTEGER DE L’OUTIL INCOGNITO ?
Si on supprime le privilège “Deboguer ces paramètres de stratégie” (Debug programs – SeDebugPrivilege) l’outil ne fonctionne plus.

A+
Guillaume MATHIEU
Consultant Proservia
La connaissance s’accroît quand on la partage.
http://msreport.free.fr

A propos Guillaume Mathieu

Directeur Technique chez Flexsi
Ce contenu a été publié dans Active Directory, Annuaire, Outils, Sécurité, Scripts, Système, Troubleshouting, Windows 2000 Pro, Windows 2000 Server, Windows 2003 Server, Windows 2012, Windows NT4, Windows Server 2008, Windows Server 2008 R2, Windows Seven, Windows Vista, Windows XP. Vous pouvez le mettre en favoris avec ce permalien.

Une réponse à Protection contre le vol de jeton d’accès (access token) avec INCOGNITO.EXE

  1. Bonjour

    Attention la version 0.1 déconne. Vous pouvez utiliser la version 2.0.
    https://labs.mwrinfosecurity.com/blog/2012/07/18/incognito-v2-0-released/

    Penser à couper les antivirus (dont Windows Defender).

    A+

    Guillaume MATHIEU
    Architecte Metsys

Laisser un commentaire