网络检测 CVE-2023-20198 漏洞利用及 Cisco IOS XE 设备后渗透的指纹识别。
suricata/ 文件夹包含用于检测 CVE-2023-20198 漏洞利用的 Suricata 检测规则。这些规则监控百分号编码的百分号(%25),该特征可用于绕过未修补 CVE-2023-20198 的 Cisco IOS XE 设备的身份验证。
该目录还包含基于真实环境中观察到的漏洞利用流量的参考 PCAP:
本仓库还包含与 Cisco IOS XE 软件 Web 管理用户界面大规模漏洞利用相关的后渗透活动信息。Cisco Talos 1 发布了一种指纹识别方法,可用于检测 Cisco IOS XE 设备上是否活跃着植入程序。参考命令:
curl -k -X POST "https://DEVICEIP/webui/logoutconfirm.html?logon_hash=1"
如果 HTTP 响应由十六进制字符串组成,则表明该设备很可能已被入侵。然而,正如多个来源 2 3 所提及的,使用此方法能够发现的植入程序数量已显著下降。
对受感染设备的网络流量分析显示,威胁行为者已升级植入程序,增加了额外的标头检查。因此,许多设备上的植入程序仍然活跃,但现在仅在设置了正确的 Authorization HTTP 标头时才会响应。
我们重新审视了 Cisco Talos 的初始博客文章,并注意到植入程序代码中多了一个 location 检查:

基于 Cisco Talos 分享的上述植入程序代码截图,我们发现了另一种可用于检测植入程序存在的方法:
curl -k "https://DEVICEIP/%25"
使用 %25(百分号编码的百分号)即可满足额外 location 检查中指定的条件。这将导致服务器返回与植入程序未运行时不同的 HTTP 响应。
目前已知该植入程序有三个版本。截至 2023 年 11 月 1 日,Cisco Talos 将该植入程序命名为 BadCandy 1。
植入程序运行的一个典型特征是响应正文中包含 <head><title>404 Not Found</title></head>。示例 HTTP 正文如下:
$ 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>
第三个变体返回登录页面而非 404 页面。由于正常情况下应返回 JavaScript 重定向而非此登录页面,因此我们仍可通过检查是否返回登录页面来判断植入程序是否存在:
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>
我们在扫描结果中发现了不同的登录响应,最终将 name="Username" 字符串作为标识符,用于判断是否返回了登录页面。
如果植入程序不存在,则会得到不同的响应。例如:
$ curl -k 'https://DEVICEIP/%25'
<script>window.onload=function(){ url ='/webui';window.location.href=url;}</script>
我们编写了一个小脚本,使用上述指纹方法检查设备是否被入侵。脚本可在此找到:
使用示例:
$ 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 (implant 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!
也可以扫描一个主机列表(每行一个 IP 地址):
$ python3 iocisco.py --file cisco-ips.txt