首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
IoT安全
发新帖
9
9
D-Link 摄像头栈溢出漏洞复现
发表于: 2026-3-25 21:18
15243
D-Link 摄像头栈溢出漏洞复现
Rad1an
2026-3-25 21:18
15243
# D-Link DCS-935L 栈溢出漏洞复现 ## 0x00 前言 - 本文是对 D-Link DCS-935L 网络摄像头已知栈溢出漏洞的复现与学习记录。 漏洞作者为某不愿意透露姓名的师傅,在此感谢原作者的分享。 - 本文主要侧重于分析过程,如**逐步追踪调用链,通过逆向分析手动推导偏移量,调试验证Poc等环节**以便于大家可以更直观地看到漏洞从发现到利用的全链路分析思路。 - **声明**:本文仅用于网络安全技术学习与研究,所有测试均在本地 QEMU 模拟环境中进行。设备已经停产,且该漏洞已有对应编号,以及补丁,请用户及时更新固件。 ## 0x01 环境与工具 - 固件:`DCS-935L_A1_FW_1.10.01_20161128_r4156.bin` - 分析工具:Binwalk、IDA Pro - 调试环境:QEMU (qemu-mips) + chroot + GDB ## 0x02 信息收集与固件提取 ### 2.1 信息收集 - 在找设备漏洞时,首先要查询"用户量",利用FOFA搜索设备确定用户量,以用户量来判断是否有价值,FOFA搜索语法 `app="D_Link-DCS-935L" && after="2026-01-01"` - 固件下载站:<a href="elink@fbfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3N6S2j5%4W2X3K9h3I4W2M7#2)9J5k6i4g2K6i4K6u0W2k6r3I4A6L8X3E0Q4x3X3g2U0L8$3#2Q4x3V1k6p5b7#2y4Q4x3X3b7&6x3K6g2x3i4K6u0r3f1V1g2h3b7g2)9J5c8V1k6u0f1V1#2i4b7g2u0q4i4K6u0r3"><mark class="encrypted">f8eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3N6S2j5%4W2X3K9h3I4W2M7#2)9J5k6i4g2K6i4K6u0W2k6r3I4A6L8X3E0Q4x3X3g2U0L8$3#2Q4x3V1k6p5b7#2y4Q4x3X3b7&6x3K6g2x3i4K6u0r3f1V1g2h3b7g2)9J5c8V1k6u0f1V1#2i4b7g2u0q4i4K6u0r3</mark></a> ### 2.2 Binwalk解析 1. 下载好后得到一个*.bin的文件,*.bin虽然能用7z查看,但是直接解压会出问题,还是需要工具 2. 使用命令`binwalk -e ./DCS-935L_A1_FW_1.10.01_20161128_r4156.bin`,对固件进行解包,得到解包后的文件  - `squashfs-root`:是分析固件功能、漏洞、配置的核心目录。通常包含:二进制文件,配置文件,Web界面文件,初始化脚本,驱动、库文件 - `squashfs-root-0`, `squashfs-root-1`:额外的SquashFS 文件系统镜像。 - `2818`:原始数据块,通常是 binwalk 识别出但无法归类为特定文件系统的二进制数据。 - `2818.7z`:由 binwalk 自动重命名并尝试解压的 7-Zip 压缩文件。说明在偏移量 2818 处有一个 7z 压缩包被识别出来。可能有固件的一些敏感信息 - `161422.squashfs`:是一个完整的 SquashFS 文件系统镜像文件。在偏移量 161422 字节处 ### 2.3 squashfs-root 目录 - 看文件结构,Linux 的文件目录,所以下一步很明确,就是从这个"mini Linux"中找到"可执行文件"  ### 2.4 找到程序 - 文件目录已经看到web了,打开以后发现`cgi-bin`,其中包含了`hnap`文件夹,在D-Link、TP-Link、Linksys等多家厂商的嵌入式设备中,HNAP是一个非常常见的Web管理协议。HNAP通常由hnap_service、hnap_main、hnap_cgi等程序实现。在这里我们找到了`hnap_service`.  ## 0x03 找到pwn调用链 ### 3.1 查找漏洞点 1. 搜索栈溢出漏洞常见的API ,如sprint、fstrcpy、sprintf+system 2. 对strcpy查看交叉引用,得到调用位置,一个个找看看有没有符合溢出条件的  3. 找到其中的一个strcpy - V12来自于HNAP_AUTH  - 没检查长度  - 目的地址haystack仅256字节,且是局部变量在栈上  - 综上,可判断此处或存在栈溢出漏洞,将V12重命名为input_HNAP_AUTH ### 3.2 追踪调用链 从溢出点开始向上逐步追踪 1. 条件1:`COOKIE="uid="`——if(V16),需要v16=strstr(haystack,"uid=")所以需要包含"uid="  2. 条件2:此处不能返回所以HNAP_AUTH和COOKIE都不能为空  3. 条件3:要给个xml文档。需要包含<soap:Body>标签,并且<soap:Body>标签内的第一个子标签不能是 GetMultipleHNAPs,PushDCHEvent,PushDCHEventList,Login,DoAction  4. 条件4:xml具体路径在调用方给了`/tmp/.hnap_in.xml`,并且会从stdin中读取  5. 条件5:`CONTENT_LENGTH < 0x20000 且 ==sizeof(stdin)`,`SOAP_ACTION` 需要有内容,`REQUEST_METHOD=="POST"`  6. 根据上述的追踪内容,可以确定调用链如下 1. REQUEST_METHOD=="POST" 2. SOAP_ACTION需要有内容 3. CONTENT_LENGTH < 0x20000并且是xml的大小 4. xml文档需要使用stdin输入(http_body) 5. HNAP_AUTH==导致栈溢出的数据 6. COOKIE=="uid=XXXXX"  ## 0x04 调试和运行验证 ### 4.1 配置qemu 1. 将qemu-mips拷贝到当前固件的目录`cp /usr/bin/qemu-mips ./` 2. 设置当前目录为根目录,`chroot . ./bin/sh` 3. 尝试运行之前分析的程序`./qemu-mips /web/cgi-bin/hnap/hnap_service`,无提示说明已运行 4. 尝试修改`REQUEST_METHOD=="POST"` 命令:`export REQUEST_METHOD="POST"`  输出了之前代码分析里的内容,说明程序正常运行  ### 4.2 调试与验证 1. 按照之前的分析设置好参数 1. 标准输入构造的xml,命名为stdin.txt 2. `export REQUEST_METHOD="POST"` 3. `export SOAP_ACTION="1"` 3. `export CONTENT_LENGTH="210"` 4. `export HNAP_AUTH=溢出` 5. `export COOKIE="uid=1234567890a"` 2. 设置完成后调试`./qemu-mips -g 1234 /web/cgi-bin/hnap/hnap_service < /stdin.txt `  3. 开启调试,在main函数下断点,单步验证我们之前的分析,可以看到栈被破坏,由此可确定此处确实存在溢出   ## 0x05 调利用漏洞验证 ### 5.1 覆盖返回地址 1. 编写python脚本(在本文最后),方便我们进行调试。调试时发现,覆盖缓冲区后,未执行到return就崩了,找一下崩溃原因,V20是空指针,因为HNAP_AUTH是很多A,没有空格,所以没法分割,所以给俩空格让strtok能分割  2. 确定返回地址在栈上的位置:由于产生栈溢出的函数是非叶子函数,所以ra寄存器会存到栈上 位置为`2B28B70C`而haystack地址是`2B28B2DC`(栈地址不是每次固定,这里只是为了算偏移量)  3. 计算出两个地址在栈上的偏移量为十进制的1072,修改一下poc  4. 再次运行,此次ra寄存器在栈上位置为2B28B64C,可以观察到返回地址被覆盖为了BBBB,且返回后PC指向了42424242,程序崩溃。接下来修改BBBB即可控制PC  ### 5.2 命令执行 1. 确定有没有开启NX,RWE,说明栈是可以执行的  2. 但是由于栈地址随机,无法直接在栈里写入shellcode(地址未知),所以需要找跳板,而在这个程序中没有找到合适的跳板,但是程序本身调用了system(直接调用)和memcpy(固定shellcode),所以可以直接跳过去进行调用 3. `00431248`:是存储http_body给的XML文档中<soap:Body>标签第一个子标签的全局变量,可以用于传递 system的参数  4. 观察调用`system`的地方,s0可以通过栈溢出控制,偏移量`1036`。所以让 `RA=004033CC`,`S0=00431248`,http_body传入参数ls让system调用,即可实现RCE  5. 修改poc运行,成功执行ls命令  ### 5.3 部分Poc代码 ```python #http_body = xml格式 REQUEST_METHOD = b"POST" SOAP_ACTION = b"1" CONTENT_LENGTH = str(len(http_body)).encode() #HNAP_AUTH = b"A"*1072+b"B"*4+b" "+b" "+b"CCCCCCCC" #HNAP_AUTH = b"A"*200+b"B"*4+b" "+b" "+b"CCCCCCCC" #HNAP_AUTH = b"A"*1072+b" "+b"\x40\x35\xA0"+b"CCCC"+b" "+b" "+b"DDDDDDD" #HNAP_AUTH = b"A"*1072+b" "+b"\x40\x33\xCC"+b"CCCC"+b" "+b" "+b"D"*52+b"EEEE" HNAP_AUTH = b"A"*1036+b" "+b"\x43\x12\x48"+b"B"*32+b" "+b"\x40\x33\xCC"+b" "+b" "+b"DDDD" COOKIE = b"uid=1234567890a" ```
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
最后于
2026-3-25 23:16 被Rad1an编辑 ,原因:
#安全研究
#漏洞分析
#家用设备
收藏
・
9
点赞
・
9
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
limeee
感谢你分享这么好的资源!
2026-9-10 09:07
SX_DomOne
感谢你的贡献,论坛因你而更加精彩!
2026-9-2 14:09
nulles
你的分享对大家帮助很大,非常感谢!
2026-4-10 22:13
xblhw
为你点赞!
2026-4-7 16:22
Li1nkl3e
感谢你分享这么好的资源!
2026-3-31 13:07
Ally Switch
谢谢你的细致分析,受益匪浅!
2026-3-28 17:11
lvcoffee
你的分享对大家帮助很大,非常感谢!
2026-3-28 10:32
mb_auhgzcrh
感谢你分享这么好的资源!
2026-3-27 22:27
付诸笑谈
非常支持你的观点!
2026-3-25 22:14
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
7
)
k4y0z
雪 币:
306
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
143
粉丝
1
关注
私信
k4y0z
2
楼
666
2026-3-26 17:27
0
PPTV
雪 币:
11423
活跃值:
(4532)
能力值:
( LV2,RANK:10 )
在线值:
发帖
4
回帖
214
粉丝
0
关注
私信
PPTV
3
楼
很6,这样也行
2026-3-27 11:31
0
lvcoffee
雪 币:
228
活跃值:
(1382)
能力值:
( LV2,RANK:10 )
在线值:
发帖
3
回帖
28
粉丝
6
关注
私信
lvcoffee
4
楼
牛鼻PLUS
2026-3-28 10:32
1
呆萌的小白
雪 币:
1377
活跃值:
(1279)
能力值:
( LV2,RANK:10 )
在线值:
发帖
1
回帖
90
粉丝
1
关注
私信
呆萌的小白
5
楼
安全不可忽视,感谢您的付出
2026-3-29 08:13
1
wx_沐殇
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
2
粉丝
0
关注
私信
wx_沐殇
6
楼
请问system执行参数的时候是ls还是<aa>ls</aa>
2026-4-9 17:01
0
Rad1an
雪 币:
440
活跃值:
(105)
能力值:
( LV2,RANK:10 )
在线值:
发帖
1
回帖
1
粉丝
5
关注
私信
Rad1an
7
楼
wx_沐殇
请问system执行参数的时候是ls还是ls
<xx>ls</xx>,代码里获取的是<soap:Body>标签的第一个子节点,你可以测试一下
2026-4-11 18:37
0
wx_沐殇
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
2
粉丝
0
关注
私信
wx_沐殇
8
楼
Rad1an
ls,代码里获取的是标签的第一个子节点,你可以测试一下
好的 感谢
2026-4-15 08:59
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
Rad1an
1
发帖
1
回帖
10
RANK
关注
私信
他的文章
D-Link 摄像头栈溢出漏洞复现
15243
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部