欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Miniupnpc Miniwget缓冲区溢出漏洞再分析

来源:本站整理 作者:佚名 时间:2019-04-17 TAG: 我要投稿

由于最近在挖掘一款程序漏洞, 看到此程序调用了 miniupnpc.dll 1.6.xxx 所以下载了个相应版本的miniupnpc 进行了代码审计, 发现存在几处安全漏洞, 查找相关漏洞库, 发现这是已存在并且已在高版本中修复的安全问题, 本篇我们重点分析如何发现和如何验证的一些方法。
0×01 如何发现
在源码审计的过程中,使用关键字查找、输入流跟踪等方式进行初步的审计,当到Miniwget.c 的时候, 发现了此安全问题。
漏洞存在位置: miniwget.cgetHTTPResponse函数memcpy(content_buf + content_buf_used, buf + i, bytestocopy);中。
其中 bytestocopy是可以控制的, 而这次的安全问题也是出现在这, bytestocopy

我们把bytestocopy 直接赋值 0×8000000。
运行结果:

发生 segmentation fault 。
我们来看下bytestocopy的整个数据流:
unsigned int bytestocopy = 0;
...
bytestocopy = ((int)chunksize
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);
然而bytestocopy 是 chunksize, 我们看下chunksize的数据流:
unsigned int chunksize = 0;
...
for(j = 0; j
if(chunksize_buf[j] >= '0' && chunksize_buf[j] '9')
chunksize = (chunksize 4) + (chunksize_buf[j] - '0');
else
chunksize = (chunksize 4) + ((chunksize_buf[j] | 32) - 'a' + 10);
}
...
从中我们可以看出 chunksize 会通过一些运算来最终得到 chunksize, 而且运算也比较容易得出。
0×02 漏洞调试和验证
至此, 我们已经找到那个问题点, 然后这个点也是可以控制的, 那我们如何构造这个数据让原始程序可以走到并且产生问题呢?
从源码中也可以看到chunksize 是从Body中获取的:


通过阅读他的源代码, 发现他解析的是http 的 response 响应体, 并且需要有几个必须的字段:
Content-Type: text/html
Transfer-Encoding: chunked
Content-Length: 1
然后是Body数据, 而我们需要控制的是 Body中的数据。
那我们如何来构造数据呢?
构造如下response 响应体:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Length: 1
Content-Type: text/html
f
test
80000000
Test
即可出发漏洞, 为了验证漏洞, 我吧getHTTPResponse函数进行了单独编译, 并制作成socket服务方便调试。

编译运行此文件:

使用python 编写一个POC:

运行此POC:

同样出现了 segmentation fault。
0×03 结语
最后查询了一些相关文档,发现此漏洞早已存在,并且新版本已经修复,但由于很多应用会使用低版本的miniupnpc, 同样会出现这个漏洞。漏洞的具体利用就不在阐述, 可以查看CVE-2017-8798。
所编写的代码:
链接:https://pan.baidu.com/s/1PcT09Td3BB14rLbHBVb98A 提取码:q69e
 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载