Comment les logiciels espions contournent Google Chrome

| sécurité

Au cours des dernières versions, les navigateurs Internet ont ajoutés de plus en plus de protection contre l’installation de modules tierce malveillant.  Notamment Google qui a décidé de bloquer toutes extensions n’étant pas en provenance de leur Chrome Store.  Par contre, Au cours d’une investigation récente j’ai eu l’occasion d’analyser pourquoi un de ces modules s’était installé malgré tout… Encore une fois, l’utilisateur demeure le maillon faible, mais cette fois ci, ce maillon est automatisé.

Dans le cadre de ce billet, je vais me concentrer sur la méthode d’exploitation par des logiciels malveillant/espion du navigateur de Google Chrome™ qui est souvent vu comme « plus sécuritaire », le code a été simplifié pour ne pas être trop techniques et des demandes de suppression ont été demandées donc je n’inclurai pas de lien direct.

La technique est intéressante (d’un point de vue malicieux), et la même technique peut-être facilement adaptés dans plusieurs situations.

Tout commence par le lancement du logiciel malveillant. Lors de son démarrage,  le logiciel tente d’identifier les différents navigateurs et de localiser les installations de Google Chrome

Process process = new Process();
string str = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\Google\\Chrome\\Application\\chrome.exe";
if (!File.Exists(str))
str = Environment.GetEnvironmentVariable("localappdata") + "\\Google\\Chrome\\Application\\chrome.exe";

 

Lorsqu’il est localisé, le logiciel fait ouvrir une fenêtre en mode invisible et accède directement à Chrome Web Store via une URL sous la forme : https://chrome.google.com/webstore/detail/xxxxx/yyyyyyyy ( ou x représente la nom de la plugin, et y son identifiant)

process.StartInfo = new ProcessStartInfo(str, i_url)
{
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true
};
process.Start();

Par la suite le logiciel malveillant utilise le temps et l’utilisation processeur pour attendre que le navigateur soit exécuté, il identifie la fenêtre via son titre (windowCaption.Contains(« Google Chrome ») ) et par la suite, simule des actions utilisateur via les fonctions SendMessage() Windows.

sendMessage(s_chromeHandle, "007", "0", "0");
sendMessage(s_chromeHandle, "006", "00000001", "0");
sendMessage(s_chromeHandle, "0100", "9", "000F0001");
sendMessage(s_chromeHandle, "0100", "D", "001C0001");
sendMessage(s_chromeHandle, "0102", "D", "001C0001");

Ce qui correspond à donner le focus, activer la fenêtre, simuler la touche « tabulation » et simuler la touche « enter ».   Visuellement cela correspond la cliquer sur le bouton « Ajouter à Chrome »

ajout-nouvelle-extension

Même logique pour récupérer les informations de la nouvelle fenètre, et par la suite deux nouvelles touches sont envoyés.

sendMessage(s_confirmNewExtensionWindows, "0100", "25", "014B0001");
sendMessage(s_confirmNewExtensionWindows, "0100", "D", "011C001");

Flèche vers le gauche pour sélectionner « Ajouter » et ensuite « enter » pour confirmer la nouvelle extension.

Mais que venons-nous d’accepter…

confirmation-nouvelle-extension

Ainsi la totalité des privilèges a été octroyé à cette extension.

Le logiciel malicieux installe de plus, un service sur le poste de travail qui démarre un processus en écoute sur le port 60000 sur localhost accessible via le protocole websocket, cette interface est accéder à partir de plugin qui l’utilise comme moyen de communication.

websocketServerLocation = 'ws://127.0.0.1:60000';

L’API de web service plugin est aussi intéressante (encore une fois, d’un point de vue malveillant), car elle permet d’exécuter des commandes dans le contexte du poste

  • GetMacAddress
  • IsBhoInstalled
  • GetRegistryValue
  • IsUserAdmin
  • LunchProcess (j’ignore si l’erreur typographique est volontaire ou non…)

Ce service permet aussi de conserver les informations de navigations dans des bases de données sqlite externe (temporairement stocké dans le dossier %TEMP%.  À l’inverse, la gestion des messages du côté de l’extension permet plusieurs méthodes de contrôle et de manipulation de contenu et conformément à son « manifest » est automatiquement exécuté lors des accès http/https et lors de l’ouverture de nouveaux onglets.

"content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["js/------------.js" ],
      "run_at": "document_start"
    },
	{
	  "matches": ["http://*/*", "https://*/*"],
      "js": ["js/-------------.js" ],
      "run_at": "document_end"
	}
  ],

D’un point de vue « pentester », ce genre de logiciel devient intéressant, car il est probablement exploitable dans des contextes d’escalade via une falsification de résolution DNS et une Policy redirigeant vers le localhost.   Simplement développer une page vulnérable à l’externe, et faire un code javascript utilisant le web socket pour  exploiter la méthode d’exécution d’un processus LunchProcess

Au final, ce genre d’exploitation démontre qu’il est encore trop simple contourner des infrastructures sécuritaires et la nécessitée d’avoir des spécialiste en sécurité opérationnel dans les organisations.  Cela soulève aussi différents questionnement.

  • Pourquoi ce genre d’application est autorisé dans le chrome store (la réponse simple étant l’absence d’assurance qualité et d’audit) ?
  • Pourquoi un seul logiciel de sécurité sur virustotal détectait ce logiciel comme malicieux ?
  • Pourquoi il n’a toujours de plusieurs sur l’utilisation de l’UAC (Contrôle de compte Utilisateur Windows) du coté applicatif (qui mitige pourtant ce genre d’attaque par message) ? (Et oui, le premier site retourné quand on recherche UAC est comment le désactiver… malheureusement…)
  • Combien d’autres logiciels malveillants similaires sont en circulation ?
  • Pourquoi il n’a pas un service de signature à la authenticode qui vérifi la légitimité des logiciels avant d’émettre un certificat ?

Malheureusement, il n’a pas de solution miracle à ce type d’attaque.  L’application white listing est toujours une solution, mais sera toujours trop couteux en termes d’efficacité opérationnels.  Avoir un peu plus de temps, j’en profiterai  pour vérifier l’analyse comportemental des antivirus dans un contexte ou des simulations de saisie utilisateurs sont envoyés à un autre processus ou pour vérifier si tous les flux sont bien interceptés par des systèmes de détection « Command & Control »