{"id":531,"date":"2019-08-18T20:50:41","date_gmt":"2019-08-18T18:50:41","guid":{"rendered":"http:\/\/pentester.blog\/?p=531"},"modified":"2020-05-21T19:50:09","modified_gmt":"2020-05-21T17:50:09","slug":"windows-et-les-privileges-access-token-windbg","status":"publish","type":"post","link":"https:\/\/hacktarus.fr\/?p=531","title":{"rendered":"Windows et les privil\u00e8ges &#8211; Usurpation d&rsquo;un Access Token"},"content":{"rendered":"\n<p>Avant d&rsquo;entamer une s\u00e9rie d&rsquo;articles sur les privil\u00e8ges sous Windows, on va commencer par une d\u00e9mo, un classique vieux de plus de 10 ans mais qui fait toujours son effet.<\/p>\n\n\n\n<p>La d\u00e9mo consiste \u00e0 lancer une invite de commandes en tant que simple utilisateur puis \u00e0 remplacer en m\u00e9moire son Access Token (il contient entre autre la liste de ses privil\u00e8ges) par celui d&rsquo;un processus \u00e0 haut privil\u00e8ges. <\/p>\n\n\n\n<p><strong>Cette technique est encore largement utilis\u00e9e pour de l&rsquo;\u00e9l\u00e9vation de privil\u00e8ges notamment au travers de drivers vuln\u00e9rables \u00e0 de l&rsquo;\u00e9criture arbitraire<\/strong>.<\/p>\n\n\n\n<p>La d\u00e9mo repose sur 2 Virtual Machines, l&rsquo;une \u00e9tant un Windows avec un debugger Windbg en mode Kernel et l&rsquo;autre \u00e9tant un Windows o\u00f9 tourne un invite de commandes (cmd.exe). <\/p>\n\n\n\n<p>Je ne vais pas d\u00e9tailler la mise en oeuvre de cette plateforme de d\u00e9mo car elle est facile \u00e0 trouver sur le Net.<\/p>\n\n\n\n<p>Contexte m\u00e9moire : les 2 VMs sont d\u00e9marr\u00e9es et on a lanc\u00e9 un cmd.exe sur la VM debuggee en mode simple utilisateur. Comme attendu, on ne dispose que des privil\u00e8ges standard :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"283\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-1.png\" alt=\"\" class=\"wp-image-535\"\/><\/figure>\n\n\n\n<p>C\u00f4t\u00e9 VM debugger, sous Windbg, on commence par lister tous les processus avec la commande !dml_proc. On y trouve entre autre le processus System \u00e0 haut privil\u00e8ges et le processus \u00e0 faible privil\u00e8ges cmd.exe.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"659\" height=\"591\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-2.png\" alt=\"\" class=\"wp-image-536\"\/><\/figure>\n\n\n\n<p>On voit que le processus System est \u00e0 l&rsquo;adresse m\u00e9moire 842be020 mais ce qui nous int\u00e9resse est l&rsquo;adresse m\u00e9moire de son Token.<\/p>\n\n\n\n<p>Pour y acc\u00e9der, il faut d&rsquo;abord conna\u00eetre la structure m\u00e9moire d&rsquo;un processus avec la commande dt nt!_EPROCESS :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"458\" height=\"289\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-3.png\" alt=\"\" class=\"wp-image-537\"\/><\/figure>\n\n\n\n<p>On voit que l&rsquo;adresse m\u00e9moire du Token est \u00e0 l&rsquo;offset 0x0f8.<br>Cette adresse est un pointeur un peu particulier car les 3 derniers bits ne sont pas utilis\u00e9s pour le calcul de l&rsquo;adresse, comme le montre la commande dt nt!_EX_FAST_REF (il s&rsquo;agit de la structure d&rsquo;un union en C) :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"365\" height=\"65\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-4.png\" alt=\"\" class=\"wp-image-538\"\/><\/figure>\n\n\n\n<p>La vraie adresse du Token est en fait la valeur affich\u00e9e par \u00ab\u00a0Value\u00a0\u00bb \u00e0 laquelle on masque les 3 derniers bits (certaines structures de donn\u00e9es Kernel ont un alignement particulier et Windows utilise les bits non utilis\u00e9s par ces pointeurs&#8230;).<\/p>\n\n\n\n<p>On commence donc par r\u00e9cup\u00e9rer la valeur \u00e0 l&rsquo;offset 0x0f8 du processus System, soit  0x890014a7 :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"375\" height=\"64\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-5.png\" alt=\"\" class=\"wp-image-539\"\/><\/figure>\n\n\n\n<p>Comme on l&rsquo;a vu il faut masquer les 3 derniers bits ce qui donne <strong>0x890014a0<\/strong>. <\/p>\n\n\n\n<p>Cette adresse  <strong>0x890014a0<\/strong>  est l&rsquo;adresse m\u00e9moire du Token du processus System. C&rsquo;est cette adresse qu&rsquo;on mettra dans l&rsquo;espace m\u00e9moire du processus cible cmd.exe au niveau de son Token.<\/p>\n\n\n\n<p>Maintenant int\u00e9ressons-nous justement au processus cible, cmd.exe. <\/p>\n\n\n\n<p>On r\u00e9cup\u00e8re son RefCnt, c&rsquo;est en fait la valeur des 3 derniers bits du pointeur Token, ici on obtient 001:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"375\" height=\"66\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-6.png\" alt=\"\" class=\"wp-image-540\"\/><\/figure>\n\n\n\n<p>Il faut maintenant fusionner la  valeur <strong>0x890014a0<\/strong> avec le RefCnt du processus cmd.exe, ce qui donne <strong>0x890014a1<\/strong> (on a simplement fait un OR).<\/p>\n\n\n\n<p>Maintenant il n&rsquo;y a plus qu&rsquo;\u00e0 remplacer le pointeur du Token dans le processus cible cmd.exe avec la command ed &lt;adresse&gt; &lt;valeur&gt;.<\/p>\n\n\n\n<p>L&rsquo;adresse qu&rsquo;on veut modifier est l&rsquo;adresse m\u00e9moire du processus cmd.exe, 0x85bb4450 \u00e0 laquelle on ajoute l&rsquo;offset 0xf8 pour atteindre le Token.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"308\" height=\"47\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-7.png\" alt=\"\" class=\"wp-image-541\"\/><\/figure>\n\n\n\n<p>On enl\u00e8ve le break, en continuant (g), et on va sur la VM debugger. L\u00e0 on retourne sur la fen\u00eatre de l&rsquo;invite de commandes qui n&rsquo;oublions pas a \u00e9t\u00e9 lanc\u00e9e en tant que simple utilisateur. <\/p>\n\n\n\n<p>Et voila, on est bien Local System avec un max de privil\u00e8ges.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"284\" src=\"https:\/\/hacktarus.fr\/wp-content\/uploads\/2019\/08\/Windows-Access-Token-8.png\" alt=\"\" class=\"wp-image-542\"\/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avant d&rsquo;entamer une s\u00e9rie d&rsquo;articles sur les privil\u00e8ges sous Windows, on va commencer par une d\u00e9mo, un classique vieux de plus de 10 ans mais qui fait toujours son effet. La d\u00e9mo consiste \u00e0 lancer une invite de commandes en tant que simple utilisateur puis \u00e0 remplacer en m\u00e9moire son Access Token (il contient entre &hellip; <a href=\"https:\/\/hacktarus.fr\/?p=531\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Windows et les privil\u00e8ges &#8211; Usurpation d&rsquo;un Access Token<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-531","post","type-post","status-publish","format-standard","hentry","category-pentest"],"_links":{"self":[{"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/posts\/531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=531"}],"version-history":[{"count":35,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/posts\/531\/revisions"}],"predecessor-version":[{"id":596,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=\/wp\/v2\/posts\/531\/revisions\/596"}],"wp:attachment":[{"href":"https:\/\/hacktarus.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hacktarus.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}