On a vu dans le précédent post qu’il est possible d’élever ses privilèges et de devenir administrateur local en copiant depuis l’espace Kernel le pointeur du Token System vers le pointeur du Token d’un invite de commandes. Alors oui c’était facile car nous étions en mode debug Kernel et tout se faisait à la main en Windbg, néanmoins cela a posé certaines bases. Nous verrons dans un prochain post comment exploiter un driver vulnérable à de l’écriture arbitraire pour élever ses privilèges selon une technique assez proche.
En attendant attardons-nous un peu sur ces Token, plus précisément les Windows Access Token, que sont-ils ?
Un Windows Access Token est un objet qui décrit le contexte de sécurité d’un processus ou d’une thread. Il est généré par le système lors du logon. Il est utilisé lorsqu’un processus ou une thread interagit avec un objet qui dispose d’un descripteur de sécurité, un « securable object ».
Un Windows Access Token contient pas mal d’attributs, dont :
- le SID du propriétaire
- les SID des groupes dont il est membre
- la liste de ses privilèges
- le type de Token (Primary ou Impersonation)
Une fois que le Token est créé il n’est pas possible d’ajouter de nouveaux privilèges, il est seulement possible d’activer ou de désactiver les privilèges déjà existant.
Mais qu’est-ce qu’un privilège ?
Un privilège est un droit attribué à un utilisateur ou un à un groupe afin d’effectuer diverses opérations sur le système comme éteindre la machine, chargé des drivers, ou changer l’heure.
Certains utilisateurs et groupes ont des privilèges prédéfinis comme les administrateurs locaux, les membres du groupe Backup ou Printer Operators.
Les privilèges sont aussi administrables à travers les stratégies locales (gpedit.msc) dans la section « Attribution des droits utilisateurs ».
La commande whoami /priv liste vos privilèges.
Pour observer la structure mémoire d’un Acces Token et des privilèges, retournons dans Windbg.
Examinons un processus cmd.exe avec la commande !process. On voit que son Access Token est référencé à l’adresse 972c0a28 :
Affichons maintenant le contenu du Token avec la commande !token. On trouve le SID de l’utilisateur ainsi que les SID des groupes dont il est membre. Enfin plus bas on trouve bien la liste des privilèges, ceux que l’on retrouve avec la commande whoami /priv
Si on regarde en mémoire, les privilèges sont représentés par une valeur « Present » où chaque bit correspond à un privilège. Noté également la valeur « Enabled » qui est la liste des privilèges activés (bit à 1) ou pas (bit à 0).