前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Miniupnpc Miniwget缓冲区溢出漏洞二次分析

Miniupnpc Miniwget缓冲区溢出漏洞二次分析

作者头像
C4rpeDime
发布2020-01-20 14:38:57
5680
发布2020-01-20 14:38:57
举报
文章被收录于专栏:黑白安全黑白安全

0×00 引言

由于最近在挖掘一款程序漏洞, 看到此程序调用了 miniupnpc.dll 1.6.xxx 所以下载了个相应版本的miniupnpc 进行了代码审计, 发现存在几处安全漏洞, 查找相关漏洞库, 发现这是已存在并且已在高版本中修复的安全问题, 本篇我们重点分析如何发现和如何验证的一些方法。

0×01 如何发现

在源码审计的过程中,使用关键字查找、输入流跟踪等方式进行初步的审计,当到Miniwget.c 的时候, 发现了此安全问题。

漏洞存在位置: miniwget.cgetHTTPResponse函数memcpy(content_buf + content_buf_used, buf + i, bytestocopy);中。

其中 bytestocopy是可以控制的, 而这次的安全问题也是出现在这, bytestocopy < 0 则会产生漏洞。我们县验证下是否会产出fault。

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

我们把bytestocopy 直接赋值 0×8000000。

运行结果:

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

发生 segmentation fault 。

我们来看下bytestocopy的整个数据流:

代码语言:javascript
复制
unsigned int bytestocopy = 0;...bytestocopy = ((int)chunksize < n - i)?chunksize:(n - i);
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);

然而bytestocopy 是 chunksize, 我们看下chunksize的数据流:

代码语言:javascript
复制
unsigned int chunksize = 0;...for(j = 0; j < chunksize_buf_index; j++) {if(chunksize_buf[j] >= '0' && 
chunksize_buf[j] <= '9')chunksize = (chunksize << 4) + (chunksize_buf[j] - '0');
elsechunksize = (chunksize << 4) + ((chunksize_buf[j] | 32) - 'a' + 10);}...

从中我们可以看出 chunksize 会通过一些运算来最终得到 chunksize, 而且运算也比较容易得出。

0×02 漏洞调试和验证

至此, 我们已经找到那个问题点, 然后这个点也是可以控制的, 那我们如何构造这个数据让原始程序可以走到并且产生问题呢?

从源码中也可以看到chunksize 是从Body中获取的:

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

通过阅读他的源代码, 发现他解析的是http 的 response 响应体, 并且需要有几个必须的字段:

代码语言:javascript
复制
Content-Type: text/htmlTransfer-Encoding: chunkedContent-Length: 1

然后是Body数据, 而我们需要控制的是 Body中的数据。

那我们如何来构造数据呢?

构造如下response 响应体:

代码语言:javascript
复制
HTTP/1.1 200 OKTransfer-Encoding: chunkedContent-Length: 1Content-Type:
 text/htmlf<xml>test</xml>80000000Test

即可出发漏洞, 为了验证漏洞, 我吧getHTTPResponse函数进行了单独编译, 并制作成socket服务方便调试。

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

编译运行此文件:

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

使用python 编写一个POC:

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

运行此POC:

Miniupnpc Miniwget缓冲区溢出漏洞二次分析
Miniupnpc Miniwget缓冲区溢出漏洞二次分析

同样出现了 segmentation fault。

0×03 结语

最后查询了一些相关文档,发现此漏洞早已存在,并且新版本已经修复,但由于很多应用会使用低版本的miniupnpc, 同样会出现这个漏洞。漏洞的具体利用就不在阐述, 可以查看CVE-2017-8798。

所编写的代码:

链接:https://pan.baidu.com/s/1PcT09Td3BB14rLbHBVb98A 提取码:q69e

*本文作者:j0hnShi

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-04-185,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0×00 引言
  • 0×01 如何发现
  • 0×02 漏洞调试和验证
  • 0×03 结语
相关产品与服务
代码审计
代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档