Ideias, informações e conhecimentos compartilhados pela equipe
de Investigação, Desenvolvimento e Inovação da BASE4 Security.
Recentemente surgiu uma nova vulnerabilidade que afectava os Roteadores NR1800X (CVE-2022-41525). Em particular, afecta a versão V9.1.0u.6279_B20210910. Procurando compreender o contexto desta vulnerabilidade, podemos proceder a alguns testes, tais como emular o firmware e executar alguns scripts em Ghidra para identificar outras funções potencialmente perigosas que permitem a execução de código ou o excesso de buffer overflows. Como resultado, obtemos uma grande lista de funções que podemos identificar como promissoras (tais como strcpy, system, sprintf, e outras).
Neste caso, vamos focar especificamente a função cujo estado é realçado a vermelho (ver imagem) com o endereço 0x0041a68c, o que aponta para a função que contém a vulnerabilidade.
Depois de termos feito uma pré-análise com guiões (Ghidra) continuamos a analisar o binário cstecgi.cgi no IDA. Deve-se notar que a utilização de múltiplas ferramentas é apenas por conveniência. Começamos então com a análise estática na função 0x0041a68c, onde podemos ver rapidamente a vulnerabilidade no buffer v17 sendo formatada na linha 26 e depois enviada como parâmetro para a função system() que executa a string. Isto pode ser visto abaixo:
A fim de avançar no processo e entrar em mais detalhes, veremos como os parâmetros são passados para a memória, depurando o firmware em modo de sistema e com uma análise dinâmica. Como primeiro passo, colocamos um ponto de ruptura na função websGetVar(), que é responsável pela obtenção dos valores enviados no corpo do pedido. Neste caso, valida que o valor enviado é ussd.
A cadeia é então formatada com snprintf() e armazenada em buffer 0x7fff5230.
Aqui podemos ver como é que a corda formatada se parece finalmente no buffer.
Finalmente, a chamada à função sistema() é feita com o buffer como parâmetro.
Para que a execução do comando seja possível, é necessário identificar o nome setUssd que desencadeia a acção, com isto podemos recriar uma carga útil para iniciar o serviço telnetd no router.
Considerando tudo isto, é possível desenvolver uma exploração ao concatenar duas vulnerabilidades. O primeiro corresponde a um pedido para contornar a autenticação, o que faz com que a sessão seja enviada para o segundo pedido, que é o que explora a execução do próprio código. A exploração final pode ser vista na imagem seguinte.
Para o ver em acção em tempo real, convidamo-lo a ver o seguinte vídeo, onde é feito em apenas alguns segundos.
Como vemos frequentemente, é sempre possível encontrar novas vulnerabilidades em sistemas que já tenham sido analisados. Embora todos os fabricantes e equipamentos possam ser vulneráveis em algum momento, em alguns casos, como este em que a marca afirma ter "Os Dispositivos de Rede mais inteligentes", podemos referir-nos à "Lei de Hypponen", que vale sempre a pena recordar: "Se é anunciada como inteligente, é vulnerável".