Posséder une imprimante, posséder un réseau avec Point and Print Drive-By

12 juillet 2016
Nick Beauchesne
Ingénieur distingué en recherche sur la sécurité
Posséder une imprimante, posséder un réseau avec Point and Print Drive-By

Introduction

Les imprimantes constituent un cas intéressant dans le monde de l'internet des objets (IdO), car il s'agit d'un matériel très puissant par rapport à la plupart des dispositifs IdO, mais qui n'est généralement pas considéré comme un "véritable" ordinateur par la plupart des administrateurs. Au fil des ans, de nombreux chercheurs en sécurité ont étudié et signalé les vulnérabilités des imprimantes. Cependant, la grande majorité de ces recherches se sont concentrées sur la manière de pirater l'imprimante elle-même afin de faire des choses telles que changer l'affichage de l'imprimante ou voler les documents qui ont été imprimés. Dans le cas présent, nous étudions comment utiliser le rôle particulier que jouent les imprimantes dans la plupart des réseaux pour infecter les appareils des utilisateurs finaux et étendre l'empreinte de leur attaque au sein du réseau.

Contexte

Pour comprendre ce problème, nous devons nous familiariser avec le protocole Microsoft Web Point-and-Print Protocol (MS-WPRN) et comprendre pourquoi il fonctionne de cette manière.

La plupart des organisations essaient d'appliquer le principe du moindre privilège aux appareils de leurs réseaux. Cela fonctionne assez bien pour des appareils tels que les ordinateurs portables ou de bureau, car le matériel qu'ils utilisent ne change pas très souvent. Il en va différemment pour les imprimantes. Bien qu'elles aient toujours besoin de pilotes, les imprimantes doivent prendre en charge pratiquement tous les utilisateurs qui souhaitent s'y connecter. Lorsque les utilisateurs finaux se déplacent dans un bâtiment, ils veulent naturellement utiliser l'imprimante la plus proche d'eux. Les utilisateurs mobiles s'attendent à pouvoir se connecter facilement à une imprimante et à l'utiliser lorsqu'ils se rendent au bureau. En outre, la plupart des organisations ne standardisent pas sur une seule imprimante, et auront plusieurs modèles et fabricants souvent au sein d'un même réseau.

Ainsi, au lieu de demander aux administrateurs système d'envoyer tous les pilotes d'imprimante possibles à tous les postes de travail du réseau, la solution consistait à développer un moyen de fournir le pilote à un périphérique utilisateur juste avant que l'imprimante ne soit utilisée. C'est là qu'est apparu le système Point-and-Print. Cette approche consiste à stocker un pilote partagé sur l'imprimante ou le serveur d'impression, et seuls les utilisateurs de cette imprimante reçoivent le pilote dont ils ont besoin. À première vue, il s'agit d'une solution pratique et simple pour le déploiement de pilotes. L'utilisateur a accès au pilote d'imprimante dont il a besoin sans avoir besoin d'un administrateur - une solution avantageuse pour tous.

La question

Le problème est que pour que ce système fonctionne correctement du point de vue de l'utilisateur final, une exception était nécessaire. Normalement, les contrôles de compte d'utilisateur sont en place pour avertir ou empêcher un utilisateur d'installer un nouveau pilote. Pour faciliter l'impression, une exception a été créée pour éviter ce contrôle. Au final, nous disposons d'un mécanisme qui permet de télécharger des exécutables à partir d'un disque partagé et de les exécuter en tant que système sur un poste de travail sans générer d'avertissement du côté de l'utilisateur. Du point de vue d'un attaquant, c'est presque trop beau pour être vrai, et bien sûr nous devions l'essayer.

L'exploitation

Dans notre cas, nous utilisons une véritable imprimante. Comme la plupart des imprimantes sont dotées de nombreuses fonctionnalités, il n'a pas été trop difficile de trouver un bogue permettant d'accéder au système sous-jacent. Dans ce cas, nous avons pu décompresser une mise à jour du micrologiciel afin de recueillir des informations d'identification et de comprendre la disposition du système de fichiers. Un fichier magique binwalk est fourni dans la section Outils à la fin de cette page, et après quelques recherches, nous avons trouvé le fichier relatif à ces pilotes. Ils doivent se trouver sur un pilote partagé "print$" dans smb, et comprennent généralement plusieurs saveurs pour différents types d'architecture (par exemple x86, x64, ppc, alpha). Recherchez les répertoires nommés : W32X86, x64, IA64, color, etc.

Nous avons simplement retiré le fichier dll x86 de l'imprimante, ce qui peut être fait directement ou par l'intermédiaire de rpcclient[5], et nous l'avons patché avec "the-backdoor-factory"[1].

Cela nous a permis d'obtenir un fichier dll contenant une charge utile injectée.

La remise de la dll dans le répertoire d'origine peut se faire de plusieurs manières. Vous pouvez généralement écrire sur le partage print$ si vous disposez d'une autorisation d'administrateur de domaine. Sinon, avec un accès root local à l'imprimante, vous pouvez écraser le fichier existant avec celui que nous venons de créer. Il est toujours étonnant que les vendeurs laissent les informations d'identification cachées par défaut sur la machine. Si ce n'est pas dans votre dictionnaire de craquage, il est toujours bon d'ajouter root:myroot au cas où.

Dans notre exemple, nous avons utilisé un mélange de Windows XP 32bit, Windows 7 32bit, Windows 7 64 bit, Windows 2008 R2 AD 64, Ubuntu CUPS, le serveur d'impression Windows 2008 R2 64 et une imprimante sans nom. Pour que Windows 7 fonctionne correctement avec Point-and-Print, il a fallu le configurer du côté de l'Active Directory et le pousser en tant que stratégie. Vous trouverez plus d'informations à ce sujet dans la section Protocole d'impression Internet ci-dessous.

Après avoir effectué la procédure normale d'ajout d'imprimante avec découverte automatique et sélectionné notre imprimante (avec la dll cachée), le système Windows suit la procédure normale d'acquisition et d'installation des pilotes.

Cette étape permet l'installation d'un pilote d'imprimante sans avertissement de l'utilisateur, sans vérification de l'uac ou même de la signature binaire, et tout cela sous les droits du système.

Cela nous a donné les résultats suivants du côté de msfconsole :

Autres vecteurs possibles

Compte tenu de la nature de ce problème, l'exécution de code à distance peut être utilisée de nombreuses façons. Dans l'exemple ci-dessus, nous avons procédé à l'ingénierie inverse d'une imprimante de bureau, mais la même fonction de chargement de pilote pourrait être réalisée avec une pile logicielle différente et utilisée dans différents scénarios. Certains de ces scénarios incluent, mais ne sont pas limités à :

  • Attaques contre les points d'eau
  • Backdooring d'une imprimante ou d'un serveur d'impression existant.
  • Serveur d'impression Microsoft : chemin d'accès du pilote : c:\windows\system32\spool\drivers\*\3\...
  • Serveur Linux cups : vérifier la présence du pilote de partage print$ dans la configuration.
  • De nombreux fournisseurs prennent en charge le système Point-and-Printon de l'imprimante elle-même.
  • Re-flash printer with backdoored drivers.
  • Créer un faux serveur d'impression et le diffuser avec la découverte automatique.
  • L'escalade des privilèges
  • Utiliser l'imprimante d'appoint comme mécanisme d'escalade des privilèges pour obtenir un accès au système.
  • Mitm attack to the printer and inject the backdoored driver instead of the real one.
  • Une approche plus globale avec IPP et Webpnp.

Infection à distance à l'aide du protocole d'impression Internet et de Web PointNPrint

Jusqu'à présent, nous nous sommes limités à un réseau interne où un appareil était soit inséré, soit infecté et utilisé pour infecter à son tour les appareils qui s'y connectaient. Le protocole d'impression Internet (IPP) de Microsoft et Web PointNprint nous permettent d'étendre ce problème au-delà de l'intranet et de l'Internet. Microsoft IPP permet le même mécanisme de chargement du pilote de l'imprimante. Cela peut être fait avec le morceau de code suivant du serveur d'impression MS.

Cette url contient un fichier de type ".webpnp" ou webpointNprint.

Voyons le contenu de ce beau fichier binaire de 10 Mo.

C'est là que résident les fichiers qui vont être chargés. Les fichiers que nous avons corrigés lors de l'attaque précédente fonctionnaient tout aussi bien, qu'ils soient transmis par smb, Point-and-Print ou par webpnp.

Cause profonde du problème

La recherche du problème nous amène à la bibliothèque ntprint.dll, et plus particulièrement à la fonction "PSetupDownloadAndInstallLegacyDriver". Il s'agit plus précisément de la fonction responsable de la vérification de la politique et de l'exécution de l'installation avec des privilèges élevés.

Bien qu'il existe des raisons valables de déploiement pour autoriser l'installation de pilotes sans droits d'administrateur, un avertissement devrait probablement toujours être activé et la signature binaire devrait probablement toujours être vérifiée pour tenter de réduire la surface d'attaque.

Remédiations

Vectra et Microsoft ont collaboré lors de l'investigation de ce problème, et Microsoft a fourni un correctif pour CVE-2016-3238 (MS16-087), et CVE-2016-3239 dans le cadre du bulletin de sécurité MS16-087, qui est disponible ici.

Le comportement de Point-and-Print peut être défini avec GPO à un niveau de granularité qui devrait permettre à l'administrateur de contrôler le risque. Bien qu'il soit possible de désactiver Point-and-Print ou d'ajouter un avertissement et de demander l'UAC, cela nous ramène au premier problème, à savoir comment gérer les pilotes pour que l'utilisateur puisse installer le pilote sans avoir à contacter le service informatique à chaque fois.

Microsoft fournit la documentation nécessaire à l'adresse [3],[4], et le développement de enhancedPoint-and-Print(v4), tente de remédier à certains de ces problèmes. La migration vers une imprimante prenant en charge la version la plus récente du protocole et la version la plus récente de Windows pourrait minimiser une partie de la surface d'attaque. Nous n'avons pas examiné les caractéristiques de sécurité de la v4 / enhanced Point-and-Print au-delà de leur spécification à ce stade, mais la compatibilité ascendante pourrait rendre ces efforts inutiles.

Vérifier vos réseaux

Registre de l'hôte pour l'activation dePoint-and-Print

Recherche du pilote Point n Print dans votre réseau