Introduction
Pour faire suite au premier article sur Les dossiers spéciaux et le stockage de fichiers invisibles du dossier Trick Or T(h)reat ? L’invisibilité et le camouflage sous Windows, ce nouvel article détaille une structure arborescente de dossier sous Windows assez atypique. Celle-ci permet :
- De camoufler des fichiers/processus dans un répertoire difficile d’accès
- L’accès au répertoire est grandement restreint via l’explorer.exe et même via la console
- Les processus exécutés dans cette arborescence disposent d’un chemin d’accès obfusqué, les rendant difficile à supprimer.
La technique est nouvelle et proviens d’un article de PaulDotCom par Mark Baggett.
L’idée est d’exploiter des répertoires créés et nommés de manière similaire au répertoire courant, noté « . » et répertoire parent, noté « .. ». De tels répertoires permettent le stockage de données (fichier/exécutable), ainsi que leur exécution. Toutefois, l’interpréteur de commande ou même l’explorateur graphique auront de grandes difficultés à y accéder.
Création de l’arborescence
Création d’une arborescence à base de répertoire « . » et « .. » sous C:\test\ :
c:\>md test c:\>cd test c:\test>md ". \.. \" c:\test>dir Le volume dans le lecteur C s'appelle OS Le numéro de série du volume est CE03-DF19 Répertoire de c:\test 25/02/2013 15:00 <REP> . 25/02/2013 15:00 <REP> .. 25/02/2013 15:00 <REP> . 0 fichier(s) 0 octets 3 Rép(s) 34 137 341 952 octets libres
Le répertoire C:\test\ contient donc un répertoire « . » (avec un espace à la suite du point) qui lui même contient un répertoire « .. » (avec un espace à la suite des deux points). Au niveau de l’affichage du contenu du répertoire C:\test\, on note le répertoire courant « . », le répertoire parent « .. » et notre répertoire « . » qui vient d’être créé.
Accès aux répertoires de nom « . «
Pour déplacer son prompt en ligne de commande dans le répertoire « C:\test\. « , les syntaxes suivantes sembleraient légitimes.
- Essai 1 [infructueux] – Interprété comme un déplacement dans le répertoire courant :
c:\test>cd . c:\test>echo %cd% c:\test
- Essai 2 [infructueux] – Utilisation du nom complet du répertoire entre double-quotes, déplacement dans le répertoire courant :
c:\test>cd ". " c:\test>echo %cd% c:\test
- Essai 3 [infructueux] – Forcer l’interprétation en tant que répertoire, déplacement dans le répertoire courant :
c:\test>cd ". \" c:\test>echo %cd% c:\test
- Essai 4 [fonctionnel] – Accès au premier sous-répertoire de « . » :
c:\test>cd ". \.. \" c:\test\. >echo %cd% c:\test\. c:\test\. >dir Le volume dans le lecteur C s'appelle OS Le numéro de série du volume est CE03-DF19 Répertoire de c:\test\. 25/02/2013 15:00 <REP> . 25/02/2013 15:00 <REP> .. 25/02/2013 15:14 <REP> .. 0 fichier(s) 0 octets 3 Rép(s) 34 136 424 448 octets libres
La syntaxe du changement de répertoire indique la volonté d’accéder au répertoire « . \.. « , pourtant il en résulte un accès à « . » uniquement. Le nom du répertoire « .. » est interprété par l’invité de commande et non pas comme un véritable nom de dossier.
Accès aux répertoires de nom « .. «
Placer son prompt dans un répertoire nommé « .. » ne semble pas être faisable. Il est possible de lister le contenu d’un tel répertoire, mais pas d’y accéder directement. Comme vu dans le dernier essai fructueux ci-dessus, l’accès à « . \.. » renvoi vers « . » et non pas « . \.. » bien que demandé. Pour tenter d’accéder à « . \.. « , on peut tester via un nouveau sous-sous-répertoire :
- Essai 5 [infructueux] – Tentative d’accès à « . \.. » à partir d’un sous-sous-répertoire :
c:\test>md ". \.. \test2" c:\test>cd ". \.. \test2" c:\test\. \.. \test2>echo %cd% c:\test\. \.. \test2 c:\test\. \.. \test2>cd .. c:\test>echo %cd% c:\test
Dans cet exemple il est possible de placer son prompt dans un sous-répertoire avec un nom lambda derrière une arborescence de « . » et « .. « . Toutefois, en tentant de remonter d’un répertoire, un retour à la racine est effectué.
Le répertoire « .. » semble définitivement inaccessible.
Liste de sous-répertoires « . » et « .. «
Un « dir /s » suffit pour lister l’ensemble des données de ces répertoires magiques :
c:\test>cd ". \.. \" c:\test\. >dir /S Le volume dans le lecteur C s'appelle OS Le numéro de série du volume est CE03-DF19 Répertoire de c:\test\. 25/02/2013 15:00 <REP> . 25/02/2013 15:00 <REP> .. 25/02/2013 15:26 <REP> .. 0 fichier(s) 0 octets Répertoire de c:\test\. \.. 25/02/2013 15:26 <REP> . 25/02/2013 15:26 <REP> .. 25/02/2013 15:23 <REP> test2 0 fichier(s) 0 octets Répertoire de c:\test\. \.. \test2 25/02/2013 15:23 <REP> . 25/02/2013 15:23 <REP> .. 0 fichier(s) 0 octets Total des fichiers listés : 0 fichier(s) 0 octets 8 Rép(s) 34 104 004 608 octets libres
Stockage protégé de fichier et exécution
Au travers de ce répertoire « .. » difficile d’accès, il est possible de stocker des fichiers et d’exécuter ceux-ci.
c:\test>copy nc.exe ". \.. \nc.exe" 1 fichier(s) copié(s).
Pour l’exécution, la création d’un lien symbolique permet aisément d’accéder à l’exécutable camouflé :
c:\test>mklink nc.exe c:\test\". \.. \nc.exe" Lien symbolique créé pour nc.exe <<===>> c:\test\. \.. \nc.exe c:\test>dir Le volume dans le lecteur C s'appelle OS Le numéro de série du volume est CE03-DF19 Répertoire de c:\test 25/02/2013 15:51 <REP> . 25/02/2013 15:51 <REP> .. 25/02/2013 15:00 <REP> . 25/02/2013 15:51 <SYMLINK> nc.exe 1 1 fichier(s) 0 octets 3 Rép(s) 34 105 311 232 octets libres c:\test>nc.exe Cmd line:
Processus camouflé de wmic
Une fois un exécutable de placé dans le répertoire spécial « .. » et lancé via un lien symbolique à partir d’un autre répertoire, le chemin d’accès de l’exécutable et lié à son instance en tant que processus s’avère camouflé (via l’utilitaire wmic en ligne de commande) :
c:\test>wmic process where name="nc.exe" list full CommandLine=nc.exe CSName=X Description=nc.exe ExecutablePath=c:\test\nc.exe ExecutionState= Handle=5336 HandleCount=83 InstallDate= KernelModeTime=468003 MaximumWorkingSetSize=1380 MinimumWorkingSetSize=200 Name=putty.exe OSName=Microsoft Windows 7 Professionnel |C:\Windows|\Device\Harddisk1\Partition3 OtherOperationCount=380 OtherTransferCount=11312 PageFaults=2172 PageFileUsage=2336 ParentProcessId=8648 PeakPageFileUsage=2336 PeakVirtualSize=95428608 PeakWorkingSetSize=8472 Priority=8 PrivatePageCount=2392064 ProcessId=5336 QuotaNonPagedPoolUsage=11 QuotaPagedPoolUsage=174 QuotaPeakNonPagedPoolUsage=11 QuotaPeakPagedPoolUsage=176 ReadOperationCount=15 ReadTransferCount=284 SessionId=1 Status= TerminationDate= ThreadCount=1 UserModeTime=0 VirtualSize=95424512 WindowsVersion=6.1.7601 WorkingSetSize=8675328 WriteOperationCount=0 WriteTransferCount=0
Le chemin indiqué pour l’exécutable est protégé via le lien symbolique :
ExecutablePath=c:\test\nc.exe
Le lien symbolique peut donc être effacé en toute sécurité.
Le gestionnaire de tâches affiche cependant bien le bon chemin d’accès :
Accès réseau et partage de répertoires spéciaux « . » et « .. «
De tels répertoires peuvent être créés via la syntaxe d’accès réseau de Windows (SMB-like). Toutefois, ils ne semblent pas être accessibles et ne peuvent être associés à un quelconque point de montage.
c:\test>md \\?\c:\test\". \.. \" c:\test>net share testx="c:\test\. \.. \" # ERROR c:\test>net use x: \\?\c:\test\". \.. \" # ERROR
Idem via l’interface graphique de connexion à un lecteur réseau.
Accès aux répertoires « . » et « .. » via l’explorateur graphique
Tout comme pour l’interpréteur de commande, le répertoire « .. » ne semble pas être accessible via l’explorer.exe.
Si l’on se dirige dans C:\test\ avec l’explorateur, on visualise bien le répertoire « . » :
A l’ouverture de celui-ci, un drôle de comportement survient puisque l’explorateur redirige vers le même répertoire, tout en modifiant la barre d’adresse :
En ouvrant à nouveau ce second répertoire « . « , le répertoire « .. » devient alors visible, mais s’avère inaccessible :
En plus d’être inaccessible, celui-ci ne peut être supprimé via l’explorateur. Comme celui-ci est protégé contre la suppression, il en découle que toute l’arborescence est également protégée :
La méthode pour supprimer une telle arborescence consiste à passer par l’interpréteur de commande :
c:\test>del ". \.. "\* c:\test\. \.. \*, êtes-vous sûr (O/N) ? O c:\test>rmdir ". \.. \" c:\test>rmdir ". \" c:\test> # Ou un "rmdir /s"
Vidéo de démonstration
Au sein de son article sur PaulDotCom, Mark Baggett illustre cette technique au travers d’une vidéo/PoC de démonstration :
Conclusion
Cette technique de camouflage de données au sein d’une structure de répertoire atypique permet à un assaillant d’accroître son emprise sur le système tout en restant le moins repérable possible. Couplée aux autres techniques déjà présentées, cette méthode qu’offre Windows nativement peut vite se retourner contre des administrateurs systèmes ; d’où cette sensibilisation.
Il convient que dans cet article, seule deux répertoires et sous-répertoires avec « . » et « .. » ont été créés. Toutefois ce procédé peut être répété sur une profondeur bien plus grande, toujours pour complexifier l’accès à des données/binaires à cacher.