
Varredura e detecção de implantes no Cisco IOS XE (CVE-2023-20198, CVE-2023-20273)
Detecção de rede da exploração de CVE-2023-20198 e identificação de pós-exploração de dispositivos Cisco IOS XE.
A pasta suricata/ contém regras de detecção Suricata para exploração de CVE-2023-20198. Essas regras monitoram um percentual codificado em percentual que pode ser usado para contornar a autenticação em dispositivos Cisco IOS XE não corrigidos para CVE-2023-20198.
Este diretório também contém PCAPs de referência baseados em tráfego de exploração observado na natureza:
Este repositório também contém informações sobre atividades de pós-exploração ligadas às explorações em massa da Interface de Gerenciamento Web do Software Cisco IOS XE. A Cisco Talos 1 publicou uma impressão digital que poderia verificar se a implantação estava ativa em dispositivos Cisco IOS XE. Para referência:
curl -k -X POST "https://DEVICEIP/webui/logoutconfirm.html?logon_hash=1"
Se a resposta HTTP consistir em uma string hexadecimal, este é um indicador de alta confiança de que o dispositivo está comprometido. No entanto, como várias fontes mencionaram 2 3, o número de implantações que podem ser descobertas usando este método diminuiu significativamente.
O tráfego de rede investigado para um dispositivo comprometido mostrou que o ator da ameaça atualizou a implantação para fazer uma verificação extra de cabeçalho. Assim, para muitos dispositivos, a implantação ainda está ativa, mas agora só responde se o cabeçalho HTTP Authorization correto estiver definido.
Demos outra olhada no post inicial do blog da Cisco Talos e notamos uma verificação extra de localização no código da implantação:

Com base na captura de tela acima do código da implantação compartilhado pela Cisco Talos, encontramos outro método que pode ser usado para identificar a presença da implantação.
curl -k "https://DEVICEIP/%25"
Usando o %25 (percentual codificado em percentual), atendemos às condições especificadas na verificação extra de localização. Isso fará com que o servidor responda com uma resposta HTTP diferente da que normalmente faria quando a implantação não está em execução.
Existem atualmente três versões conhecidas da implantação. Em 1 de novembro de 2023, a implantação é nomeada BadCandy pela Cisco Talos 1.
Um sinal revelador da operação da implantação é um <head><title>404 Not Found</title></head> no corpo. Um exemplo de corpo HTTP é o seguinte:
$ 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>
A terceira variante retorna a página de login em vez do 404. Como normalmente ainda se esperaria um redirecionamento javascript em vez desta página de login, ainda podemos determinar a presença da implantação verificando se uma página de login é retornada:
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>
Encontramos diferentes respostas de login em nossos resultados de varredura e acabamos usando a string name="Username" como identificador para determinar se uma página de login está sendo retornada.
Se a implantação não estiver presente, você receberá uma resposta diferente. Por exemplo:
$ curl -k 'https://DEVICEIP/%25'
<script>window.onload=function(){ url ='/webui';window.location.href=url;}</script>
Criamos um pequeno script que verifica comprometimento usando o método de identificação acima. O script pode ser encontrado aqui:
Exemplo de uso:
$ 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!
Também é possível escanear uma lista de hosts, separados por novas linhas.
$ python3 iocisco.py --file cisco-ips.txt