Contourner un IDS comme un nul(l)

Bonjour à tous !

Comme zorn l’a remarqué dans mon précédent article, une entreprise disposant d’un proxy HTTPS sera toujours en mesure de détecter notre méchant cheval de Troie.

De toute façon, utiliser simplement un autre outil pour contourner telle ou telle restriction, ce n’est pas ce qui nous intéresse.

On est nul(l), on est méchant et on n’a pas peur de la difficulté !

Faisons passer la version reverse_tcp de Meterpreter à travers notre IDS (Système de Détection d’Intrusion… mais un sigle ça fait plus intelligent)  !

hacker

 

Qu’est-ce qui est détecté par notre IDS ?

On l’a vu précédemment, Snort lève une alerte de type :

ET SHELLCODE Possible Call with No Offset TCP Shellcode

Cette alerte est lancée lorsque notre IDS voit passer la séquence suivante d’octets dans un paquet TCP :

E8 00 00 00 00 8F 45 B0 33 C0

Comme indiqué sur networkforensics.com cette suite d’octets est caractéristique d’une injection de code et correspond (attention, sortez votre barbe) au code assembleur suivant :

call dword 0x5
popl -0x50(ebp),eax
xor eax,eax

Il faut aussi remarquer que l’alerte est lancée lorsque Metasploit envoie le « stage 2 » de Meterpreter. J’ai eu un peu de mal à retrouver le fichier correspondant à ce fameux stage alors je vous aide un peu :

/opt/metasploit/msf3/data/meterpreter/metsrv.dll

Comment modifier le DLL comme un nul(l) ?

On peut passer la signature en produisant un code de ce genre :

call dword 0x5
nop
pop dword [ebp-0x50]
xor eax,eax

Voici l’équivalent en octets du code précédent :

E8 00 00 00 00 90 8F 45 B0 33 C0

Nous pouvons à présent ouvrir notre désassembleur préféré (disasm désassemble mal, préférez objdump), convertir metsrv.dll en langage assembleur, ajouter l’instruction nop (no operation) puis réassembler. Snort ne détectera alors plus notre signature.

L’assembleur ça va bien un moment…

Vu qu’on est nul(l), y en a marre de se casser la tête sur de l’assembleur ! En plus on en a déjà fait beaucoup au cours des précédents articles

Y aurait-il une solution plus simple ?

Eh oui ! Beaucoup d’IDS analysent chaque paquet TCP indépendamment, sans prendre la peine de recomposer l’intégralité du trafic.

Il faut savoir que lorsque vous envoyez un gros fichier sur le réseau, celui-ci n’est pas envoyé tel quel. La couche réseau de votre système d’exploitation découpe chaque transfert en petits paquets TCP.

MTU

 

Parce que « les acronymes ça fait bien », la taille de ces paquets est appelée MTU comme Maximum Transmission Unit.

Que se passerait-il si l’on s’arrangeait pour couper le paquet au milieu de la signature ? L’IDS serait alors incapable de détecter quoi que ce soit.

La première chose à faire est de connaître l’emplacement exact de la signature dans notre fichier. Pour cela, ouvrons-le avec VBinDiff puis recherchons la signature :

Je trouve que VBinDiff est très polyvalent et pratique.

Je trouve que VBinDiff est très polyvalent et pratique.

L’adresse du début de la signature est 15A9 soit après 5546 octets de données.

La taille de l’en-tête TCP (en orange sur le schéma) est fixe, elle prendra 40 octets sur la taille maximum de transfert.

Un paquet trop petit sera détecté par notre IDS, nous conserverons notre MTU le plus proche de 1500.

Après un rapide calcul (5546/4+40), nous obtenons une MTU de 1426 octets pour tomber exactement 2 octets AVANT la signature. On ajoute 1 octet pour tomber au milieu de la signature, soit une taille maximum de transfert de 1427.

Configurer cette nouvelle taille sur votre ordinateur de vilain hax0r est très simple :

ifconfig eth0 mtu 1427

Attention, mettre une MTU trop petite rendra votre réseau inopérant, vous devrez alors reconfigurer une MTU acceptable (1500 par exemple) et relancer votre réseau :

sudo service networking restart

Test avec Snort

Je n’ai pas testé la solution consistant à désassembler / réassembler, car j’ai déjà traité ce genre de sujet lors de précédents articles. La démarche est ici identique mais il se peut que la solution que je propose ne soit pas viable, à vous de chercher un peu 🙂

Jouer sur la taille des segments TCP est déjà une solution bien plus amusante, sans compter que je n’en avais pas encore parlé !

Malheureusement, Snort détecte toujours Meterpreter… Néanmoins, on remarque que le paquet TCP incriminé a bien été coupé où on le souhaitait :

Voyez les dernier octets : "E8 00 00" correspondant au début de la signature.

Voyez les dernier octets : « E8 00 00 » correspondant au début de la signature.

La règle ayant lancé l’alerte reste toujours la même. Il se peut que Snort soit capable de recouper des paquets TCP différents pour détecter une signature… J’arrête là mes investigations, mais vous disposez maintenant d’un nouveau mécanisme pour contourner les IDS, bien qu’il ne soit pas applicable à toutes les situations : la taille maximum de votre fenêtre TCP (MTU)

Conclusion

Un IDS fonctionne comme un antivirus. On peut utiliser les mêmes méthodes pour contourner un antivirus ou un Système de détection d’intrusion.

Par contre, ces méthodes peuvent être assez difficiles à mettre en oeuvre. On peut s’intéresser aux multiples solutions (ex : jouer sur la taille maximale de transfert) plus simples pour contourner une sécurité réseau.

Comme d’habitude, contourner une sécurité prend du temps et est spécialisé pour un IDS ou un antivirus en particulier. Si vous voulez pénétrer un réseau, assurez-vous de ne pas bâcler la phase de reconnaissance, afin de connaître si possible l’IDS utilisé (s’il y en a un), ainsi que l’antivirus.

Parce que je n’ai pas la science infuse : les sources

Cet article m’a permis de trouver metsrv.dll, alors merci : http://eldeeb.net/wrdprs/?p=71

Les questions bêtes, mais importantes, trouvent souvent une réponse dans un forum : http://www.linuxforums.org/forum/networking/67955-how-do-i-change-mtu-help.html

Merci à Snort qui donne une explication de ses règles, nous permettant ainsi de les contourner plus facilement : http://www.networkforensics.com/2010/05/16/network-detection-of-x86-buffer-overflow-shellcode/

Pour chercher des caractères non imprimables avec grep : http://www.debian-fr.org/grep-et-caracteres-non-imprimables-t14865.html

Publicités
À propos

Un informaticien, qui tente de faire comprendre au public que l'informatique n'est pas si compliquée, malgré des acronymes et autres termes obscurs pour faire croire que c'est difficile (et que c'est de votre faute si "ça ne marche pas")

Tagged with: , , , , , , , , ,
Publié dans Algorithmie, Cracking, Informatique, Intrusion, Metasploit, Piratage

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

MystCaster
janvier 2013
L M M J V S D
« Déc   Fév »
 123456
78910111213
14151617181920
21222324252627
28293031  
Catégories
Archives
%d blogueurs aiment cette page :