
Analyse et détection d'implant Cisco IOS XE (CVE-2023-20198, CVE-2023-20273)
Détection réseau de l'exploitation de CVE-2023-20198 et prise d'empreinte (fingerprinting) de la post-exploitation des appareils Cisco IOS XE.
Le dossier suricata/ contient des règles de détection Suricata pour l'exploitation de CVE-2023-20198. Ces règles surveillent un pourcentage encodé en pourcentage (percent-encoded-percent) qui peut être utilisé pour contourner l'authentification sur les appareils Cisco IOS XE non corrigés pour CVE-2023-20198.
Ce répertoire contient également des PCAP de référence basés sur le trafic d'exploitation observé en conditions réelles :
Ce dépôt contient également des informations concernant les activités de post-exploitation liées aux exploitations massives de l'interface utilisateur de gestion Web du logiciel Cisco IOS XE. Cisco Talos 1 a publié une empreinte (fingerprint) permettant de vérifier si l'implant était actif sur les appareils Cisco IOS XE. Pour référence :
curl -k -X POST "https://DEVICEIP/webui/logoutconfirm.html?logon_hash=1"
Si la réponse HTTP consiste en une chaîne hexadécimale, c'est un indicateur de haute confiance que l'appareil est compromis. Cependant, comme plusieurs sources l'ont mentionné 2 3, le nombre d'implants pouvant être découverts à l'aide de cette méthode a considérablement diminué.
L'examen du trafic réseau vers un appareil compromis a montré que l'acteur de la menace a amélioré l'implant pour effectuer une vérification d'en-tête supplémentaire. Par conséquent, pour de nombreux appareils, l'implant est toujours actif, mais ne répond désormais que si l'en-tête HTTP Authorization correct est défini.
Nous avons réexaminé le billet de blog initial de Cisco Talos et remarqué une vérification d'emplacement supplémentaire dans le code de l'implant :

En nous basant sur la capture d'écran ci-dessus du code de l'implant partagée par Cisco Talos, nous avons trouvé une autre méthode de fingerprinting permettant de détecter la présence de l'implant.
curl -k "https://DEVICEIP/%25"
En utilisant %25 (pourcentage encodé en pourcentage), nous satisfaisons les conditions spécifiées dans la vérification d'emplacement supplémentaire. Cela amène le serveur à répondre avec une réponse HTTP différente de celle qu'il renvoie normalement lorsque l'implant n'est pas actif.
Il existe actuellement trois versions connues de l'implant. Depuis le 1er novembre 2023, l'implant est nommé BadCandy par Cisco Talos 1.
Un signe caractéristique du fonctionnement de l'implant est la présence d'un <head><title>404 Not Found</title></head> dans le corps. Un exemple de corps HTTP est le suivant :
$ curl -k 'https://DEVICEIP/%25'
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
La troisième variante renvoie la page de connexion plutôt que la 404. Comme on s'attendrait normalement à une redirection JavaScript plutôt qu'à cette page de connexion, nous pouvons toujours déterminer la présence de l'implant en vérifiant si une page de connexion est renvoyée :
curl -k 'https://DEVICEIP/%25'
<!DOCTYPE html>
<html>
<!--
Copyright (c) 2015-2019 by Cisco Systems, Inc.
All rights reserved.
-->
<head lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title id="loginTitle"></title>
Nous avons trouvé différentes réponses de connexion dans nos résultats d'analyse, et avons finalement retenu la chaîne name="Username" comme identifiant pour déterminer si une page de connexion est renvoyée ou non.
Si l'implant n'est pas présent, vous obtiendrez une réponse différente. Par exemple :
$ curl -k 'https://DEVICEIP/%25'
<script>window.onload=function(){ url ='/webui';window.location.href=url;}</script>
Nous avons créé un petit script qui vérifie la compromission à l'aide de la méthode d'empreinte ci-dessus. Le script se trouve ici :
Exemple d'utilisation :
$ pip3 install requests
$ python3 iocisco.py 192.168.1.1
[!] Checking http://192.168.1.1/%25
WARNING: Possible implant found for 192.168.1.1 (impant v3)! Please perform a forensic investigation!
[!] Checking https://192.168.1.1/%25
WARNING: Possible implant found for 192.168.1.1 (implant v3)! Please perform a forensic investigation!
Il est également possible d'analyser une liste d'hôtes, séparés par des sauts de ligne.
$ python3 iocisco.py --file cisco-ips.txt