ImageMagickを攻撃して任意のコードを実行してみる

GMOインサイトのカネテックです。
皆さんImageMagick使ってますか?画像の加工、生成に大変便利ですよね。
僕はしょっちゅう使ってます。
ところで、こういう外部プログラムをWebスクリプト言語などから呼び出すことも多いと思いますが、外部プログラムにもセキュリティホールが存在し攻撃されうるのです。怖いですね。

今回はImageMagickにあったImageTragickという脆弱性について、実際に攻撃して確認してみます。

 

アジェンダ

  • 攻撃側構築
  • やられ側構築
  • 攻撃してみる
  • 対策
  • 最後に

 

攻撃側構築

Metasploitというフレームワークを使って攻撃を行うのですが、Mac上にイチから構築するのは大変なので、すでに構築済みになっているKali linuxというディストリビューションを仮想環境でCDブートさせて使います。

(可能であればTorrentでのダウンロードをお勧めします)

VirtualBoxでISOから仮想PCを起動します。

起動する前に、ネットワーク設定をNATからブリッジアダプターに変更しておきましょう。
やられサーバから攻撃サーバに向けてTCP接続が発生するため、NATだとうまくいきません。

VirtualBox - ネットワークアダプタ設定
VirtualBox – ネットワークアダプタ設定

起動します。今回はGrubメニューからLiveを選択してLiveCD的に使います。

Kali Linux - Grub
Kali Linux – Grub

やられ側構築

架空のサービスとして、PNG画像をアップすると100×100にリサイズして返してくれるものを作り、これが攻撃されるシナリオで実験します。

6.9.3-10より後のImageMagickは対策コードが入っているため、それ以前のバージョンを用意する必要があります。
今回はバージョン6.9.2を使ってみます。

次に、これを使う画像縮小サービスをPHPで書きます。

FORMで画像を送って、PHP側でsystem()関数を使ってImageMagickに画像処理させる簡単なものです。

攻撃してみる

以下のアイコンをクリックし、Metasploitのコンソールを起動します。

Kali Linux - サイドメニュー
Kali Linux – サイドメニュー

攻撃方法として、exploit/unix/fileformat/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番を選択します。

次に、exploitコマンドで攻撃用のmvgファイル(拡張子はpng)を生成しサーバモードで待ち受けます。

/root/.msf4/local/msf.png にファイルが生成されているので、これをやられサーバにアップします。

Kali Linux - Firefoxで画像アップ
Kali Linux – Firefoxで画像アップ

すると、ブラウザ側はWaiting for [host name]…という表示で停止します。
一方、Metasploitのコンソールには以下のような表示が出るかと思います。

この瞬間、侵入に成功しています。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を適切に落としていればこの改ざんは失敗します)

Kali Linux - HTML改ざんデモ
Kali Linux – HTML改ざんデモ

対策

本件はCVE-2016-3714として広く周知されており、現時点での対策はImageMagickのバージョンを最新のものにするだけで大丈夫です。以下のバージョンに本問題が含まれますので、お手元のImageMagickのバージョンが以下よりも大きいことを確認してください。

  • ImageMagick 6.9.3-10 未満
  • ImageMagick 7.0.1-1 未満の 7.x

最後に

受け取った文字列についてはサニタイズが必要とわかっていても、データについては意識から漏れがちですよね。

つねに変なデータを食わされるつもりで、「本当にこのデータはノーチェックで外部コマンドに食わせて大丈夫だっけ?」と自問自答する癖をつけたいものです(実際、この問題はPNG先頭のマジックナンバーをチェックしていれば防げていた問題です)。