Author Archives: kanetech

2017-06-28

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先頭のマジックナンバーをチェックしていれば防げていた問題です)。

 

 

2016-12-20

プリント基板を作ってみよう!

GMOインサイトのアプリエンジニア カネテックです。
みなさん半田ごて握ってますか?ユニバーサル基盤を使っていると、小型化に限界を感じませんか?

今回はレーザープリンタを用いて、家庭で簡単にプリント基板を作ってみたいと思います。
生基板がお手元に無い方は、予め注文しておくとよいでしょう。Ebayで「Copper Clad Laminate Board」などで検索すると、数百円程度で色々出てくると思います。

概要

  • 回路設計
  • レイアウト画像作成
  • 印刷
  • 転写
  • エッチング
  • 穴あけ
  • 実装

回路設計

今回はプリント基板自体が目的なので、回路は適当に2石の発信回路でLEDが点滅するものにします。

スクリーンショット 2016-12-20 18.27.01
【Upverterの回路図画面】

レイアウト画像作成

白黒画像が作れればソフトは何でも良いです。以下のような画像を作ります。今回はUpverterというWebベースのPCBレイアウトツールを使いました。

最初は成功確率を上げるために、パターンは太めにしておくと良いでしょう。

スクリーンショット 2016-12-20 18.28.22
【Upvaterのレイアウト画面】

このようなパターンを作って、Gimpを使って2値画像化しました。

モノクロ
【Gimpで白黒画像化したもの】

これにベタを追加します。ベタを追加することでエッチングされる面積が減り、より多くの基板をエッチングすることができます。

印刷

光沢紙にレーザープリンタで印刷します。この後トナーを転写してマスクとしますので、インクジェットプリンタではいけません。

img_8828jpg_31582864346_o
【光沢紙に印刷後切り出したもの】

転写

光沢紙を切り取り、生基板を同じ大きさで切り出します。切り出した基板は軽くやすっておくと定着が良いです。

img_8830jpg_30810250863_o
【形を合わせて切り出します】

img_8838jpg_31247688420_o
【やすった後の状態】

ある程度加熱すると張り付いてずれなくなるので、まずは光沢紙を濡らして張り付かせ、その後アイロンを当てて熱で貼り付けるとずれる事故が少ないです。
押し付けるように数分ほどアイロンを当てます。押しすぎるとトナーが潰れ、押す力が弱いと転写に失敗します。ここが一番難しいかもしれません。

img_8844jpg_31504305851_o
【アイロン加熱中】

転写したら、よく水に浸して紙をふやかします。

img_8845jpg_31620197465_o
【納豆容器で浸水中】

しっかりふやけたら、優しく剥がしましょう。残った繊維はトナー上のものは無視して大丈夫です。銅パターン上のものは指や爪楊枝などでしっかり落としておきましょう。

img_8849jpg_31247701780_o
【剥がした後の状態。一見きれいだが……】

しっかり処理したつもりでも、乾燥させると以下のように紙繊維が残っていたりします。乾燥後の状態をよく確認し、しっかり繊維を取り除いてください。

img_8851jpg_30810308083_o
【殆どの穴に紙繊維が残ってしまっている】

 

エッチング

以下を混合してエッチング液を作ります。

  • オキシドール
  • クエン酸

img_8856jpg_31504341821_o
【エッチングセット(塩写し忘れ)】

このとき、塩とクエン酸はだいたい1:4くらい(この二つを反応させるわけではないのでアバウトで大丈夫)とし、ぎりぎり溶け切るくらいのオキシドールを入れて混ぜます。

エッチング液はチャック付きのビニール袋に入れると扱いが楽ですし、液の量も少なくて済みます。

エッチング液に基板を投入します。

img_8858jpg_30778640414_o
【投入!】

50度くらいのお湯で湯煎しながら、見守ります。環境によって違うと思いますが、今回は3分程度の湯煎で溶けきりました。

img_8860jpg_31582951126_o
【湯煎しています】

img_8862jpg_31504352451_o
【3分後。露出している部分の銅が溶けています】

エッチングできたら、トナーパターンを落とします。除光液を使うと簡単に落とすことができます。

img_8864jpg_30810354843_o
【エッチング後】

img_8866jpg_31504360711_o
【トナー除去後。きれいに銅が残っています】

エッチング後の液はへたるまで繰り返し使えます。使い終わったら十分な量のアルミニウムを入れて反応させ、銅を析出させてから金属を濾し取り、液と金属をそれぞれ自治体のルールに従って廃棄してください。アルミニウムを投入すると反応熱が出ますので、少量ずつ、冷やしながら入れることをお勧めします。

穴あけ

PCB用のドリルビットを用意して、電動ドリルで空けました。1.2mm程度のものが良さそうです。太い足のものを使う箇所がある場合は、それに合わせてビットを選んでください。

穴あけ後は酸化を防ぐためにフラックスを塗布しておきます。

実装

普通にはんだ付けしていきます。自分で作った基板に普通にはんだ付けできるって感動です!!

img_8867jpg_31344125080_o
【裏面。せっかくなので一部チップ抵抗を使用】

img_8870jpg_31679839876_o
【表面。すっきり】

なお、線の部分もマスクされてないので普通にハンダが乗ってしまいます。見栄えが悪くなるので、ランドからハンダがはみ出ないよう注意して作業するとよいです。

 

 

いかがでしたでしょうか?
プリンタの種類、光沢紙の種類、アイロンの種類、エッチング液の混合比などに影響されて仕上がりが異なってくると思います。
みなさん最強の組み合わせを模索してみてください!

2016-09-13

Let’s Encryptを利用して、無料でHTTPSサーバを構築

こんにちは、JWordのゲーム開発エンジニア カネテックです。

みなさんWebの情報はSSLで公開していますか?「会社は大丈夫だけど、趣味で持っているサーバはSSLに対応させてないなぁ、高いし」なんて方はいませんか?(ぼくのことです)
今回は、無料で簡単にHTTPS対応できるLet’s Encryptをご紹介いたします。


概要

  • 前提
  • Certbotを導入
  • SSLの設定
  • 自動更新の設定
  • 二つ目以降のドメインの設定

前提

  • OS: Ubuntu 14.04
  • HTTPデーモン: Apache(apt-getでインストールしたもの)
  • Ubuntu、Apacheはインストールおよび設定済み
  • Apacheは立ち上がった状態
  • kanetech.ddns.netでhttpアクセスが行える状態
  • IPv4 グローバルアドレスを持ち、ufwコマンドでTCP 80/443ポートは解放済み

Certbotを導入

Let’s Encryptでは、Certbotというツールを使った導入、更新を推奨しています(他にも対応ツールはいっぱいあります!)ので
今回はCertbotを使って進めていきます。

まず、公式サイトを開きます。
https://certbot.eff.org/

スクリーンショット 2016-09-10 11.32.04

デーモンの種類とディストリビューションを選択すると導入ガイドが表示されるので、それに従って導入します。
今回はUbuntu14.04上のApacheを選択しました。

なお、処理の途中でroot権限が必要になります。都度パスワードを入力しても良いのですが、最終的に証明書を自動更新する場合は
rootでの更新処理を設定することになりますので、導入からroot環境で実施すると良いでしょう。

SSLの設定

certbot-autoコマンドを使って、対話的に設定していきます。

設定したいドメイン名、メールアドレスを記入してライセンスを確認し、同意の場合は次の画面に進みます。

スクリーンショット 2016-09-10 10.59.36

スクリーンショット 2016-09-10 11.00.08

スクリーンショット 2016-09-10 11.00.20

HTTPをどうするか設定します。

スクリーンショット 2016-09-10 11.00.38

Easy: HTTPとHTTPS両方で動作
Secure: HTTPアクセスはHTTPSへリダイレクト

今回はHTTPも残したかったのでEasyを選択しました。

お疲れ様でした。これでSSLでのアクセスが可能です。
最後に、以下のURLで検証するよう勧められるので見てみます。

https://www.ssllabs.com/ssltest/analyze.html?d=kanetech.ddns.net

スクリーンショット 2016-09-10 11.19.37

詳しくない方は、ここで上部に表示されるサマリーがAになっていれば良いと思います。
詳しい方は、下に詳細が記載されています。環境ごとのSNI対応状況などもわかるので、
目を通しておくと良いでしょう。
Let’s Encryptの特徴として有効期限が大変に短く、90日しかありません。
ここで確認する証明書も期限が90日であることがわかると思います。
Let’s Encryptは自動更新が前提ですので、次の章で自動更新の方法について説明します。

自動更新の設定

まずは、証明書を手動で更新してみます。

certbotには更新が正常に走るかテストするドライラン機能があります。まずはこれを使って問題ないか確認しておきましょう。

本当に更新する場合は、–dry-runオプションなしで実行します。

期限が30日を切ったもののみが更新されます。毎日実行するとよいでしょう。

また、Apacheの場合は証明書が変更された際に設定の再読み込みが必要になります。

とすることで、自動的に更新が反映されます。サーバの運用ポリシーを確認した上で設定してください。

これをcrontabに

といった形で記載しておくとよいでしょう(設定は一例です。運用ポリシーにしたがって設定してください)。

二つ目以降のドメインの設定

複数のドメインをホストしている場合、この後二つ目以降のドメインを追加設定していきます。追加時は、最初の設定コマンドの後ろに-d [ドメイン名]と指定します。

更新についてはrenewコマンドで全ての証明書を管理してくれますので、そのままで大丈夫です。

以上です。

いかがでしたでしょうか。
ウィザード実行後、すぐさまHTTPSが機能するというのは感動的ですよね。
一方で、更新処理が正しく動かなくなると、90日以内にサービス障害が発生しますので
サーバの役割に合わせて障害対策を考えてみると良いと思います。

2016-05-31

本家Linux カーネルをコンパイルして仮想PCで起動する

こんにちは、JWordのゲーム開発エンジニア カネテックです。

みなさんカーネルコンパイルしてますか?kernel.orgからソースコードをダウンロードしても
使い方がよくわからない、なんて思ったことはないですか?
今回は本家Linuxカーネル(kernel.orgで公開されているもの)をダウンロードして
仮想PC上で起動させる手順を共有いたします。

概要

  • ソースコードの入手、展開
  • カーネルコンパイル
  • 仮想イメージの作成
  • カーネルの設置
  • ブートローダのインストール
  • 起動

ソースコードの入手、展開

何はともあれ、ソースを入手して展開しないことには始まりません。
ちょうど執筆時点(2016/05/31現在)では4.7-rc1というリリース候補版がありますので、
これを仮想PCで動作させて動作確認する、というシナリオにします。

kernelorg

日付の右にある[tar.xz]というリンクをクリックしてソースコードをダウンロードします。
ダウンロードしたファイルはtarコマンドを使って展開しておきます。

 

カーネルコンパイル

x86の64bitアーキテクチャ向け(amd64)のカーネルを作ります。

コンパイルオプションをx86_64のデフォルトで設定

カーネルイメージのタイプとしてbzImageを指定してコンパイル実行

 

コンパイルがうまくいくと、以下のようにカーネルイメージファイルが得られます。

 

仮想イメージの作成

今回はVirtualBoxで起動させることにします。
ただし、専用の形式であるVDIのファイルは編集しづらいので、rawイメージを作成して
データを全て置いてから、最後にVDIに変換する手順にします。

100MBのrawイメージの作成

 

パーティショニング(プライマリパーティションに全領域を割り当てる)

 

ext3ファイルシステムの構築

 

カーネルの設置

マウントしてカーネルを設置します。ついでに後で必要になるbootディレクトリも
ここで作っておきます。

 

ブートローダのインストール

続いて、作った仮想ディスクにブートローダをインストールしていきます。
これは既存のLinuxが動いている環境に接続した方が簡単なので、CentOSの
インストールディスクに収録されているレスキューモードをVirtualBoxで
動かして、その環境の中でsda.rawにGRUB2をインストールします。

まずはsda.rawをVirtualBoxで認識させるために、VDI形式にコンバートします。

 

続いて、VirtualBoxで新規仮想PCを作成し、CentOSのISOイメージとsda.vdiを
接続した状態で立ち上げます。

ストレージ設定

スクリーンショット 2016-05-31 11.15.12

インストールディスクが起動したら、「Troubleshooting」を選択し「Rescure a CentOS system」
を選択します。(CentOS7の場合)

スクリーンショット 2016-05-31 11.18.49

起動が完了すると以下のメニューが表示されるので、「3) Skip to shell」を選択してシェルを
起動します。

スクリーンショット 2016-05-31 11.22.57

接続した仮想ディスク(sda.vdi)にGRUB2をインストールします。

 

ここまでできたら、いったん仮想PCはシャットダウンしておきます。

起動

VirtualBoxのストレージ設定を開き、CentOSのISOイメージを取り除きます。

スクリーンショット 2016-05-31 12.13.14

仮想PCを再度起動します。うまくいくと、以下のようにGRUBのプロンプトが表示されます。

スクリーンショット 2016-05-31 12.14.29

以下のようにカーネルの場所をGRUB2に教えて、起動してみます。

 

長かったですね、お疲れ様でした。無事起動することができました。

スクリーンショット 2016-05-31 12.16.45

起動に要した時間は0.98秒!速いですね!
カーネルは起動完了後に/sbin/initを実行しますが、まだ/sbin/initを用意していないため
カーネルパニックで停止しています。

もちろん、sda.rawの中にinitを置くことでこの先の動作をさせることも可能です。
余力がある人は是非チャレンジしてみてください!