Apache2 で CGI を許可する

Metasploitable2-LinuxでCGIを動かそうとしたらソースコードが表示されるのみで動かなかった。

#!/bin/sh
echo "Content-type: text/plain"
echo
echo "Hi! I'm an ordinary CGI script which is executed by /bin/sh"


『一行のメッセージを出力するだけの CGIスクリプトを設置します。いっけん、なんの入力もクライアント側から受け付けていないため危険のありようもなく見えます。』
BASHの脆弱性でCGIスクリプトにアレさせてみました | ワルブリックス株式会社

CGI を許可するように Apache を設定する

# apache2 -v
Server version: Apache/2.2.8 (Ubuntu)
Server built:   Mar  9 2010 20:45:36

『Apache が共有モジュール機能付きでビルドされている場合、 モジュールがロードされていることを確認してください。』
LoadModule cgi_module modules/mod_cgi.so
(以降『』書きは Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server Version 2.4 より引用)

# vi /etc/apache2/apache2.conf
~(中略)~
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

上記ディレクトリでモジュールを読み込んでいる。

/etc/apache2/mods-enabled# ls -l
lrwxrwxrwx 1 root root 26 May 14  2012 cgi.load -> ../mods-available/cgi.load

mods-enabled内のファイルはmods-availableへのシンボリックリンクとなっています。(リンクが無い場合は後述を参考にリンクを作ってください)

/etc/apache2/mods-available# ls -l
-rw-r--r-- 1 root root   58 Feb  1  2008 cgi.load

/etc/apache2/mods-available# cat cgi.load 
LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so

問題なく設定されていた。

CGI の実行を可能にするために Options を明示的に使用する

『サーバのメインの設定ファイル中で Options ディレクティブを明示的に使用することで、特定のディレクトリ配下で CGI の実行を許可するように指定することができます』
Options +ExecCGI

/etc/apache2# vi sites-available/default

<Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
            ↓ +ExecCGI を追記
        Options Indexes FollowSymLinks MultiViews +ExecCGI
        AllowOverride None
        Order allow,deny
        allow from all
</Directory>

『上記ディレクティブは、CGI ファイルの実行を可能にするよう Apache に伝えます。また、どのファイルが CGI ファイルかを サーバに伝える必要があります。次の AddHandler ディレクティブの例では、cgi または pl を拡張子に持つすべてのファイルを CGI プログラムとしてみなすことをサーバに伝えます』
AddHandler cgi-script .cgi .pl

/etc/apache2/mods-available# vi mime.conf
~(中略)~
#AddHandler cgi-script .cgi
 ↓ コメントを外す
AddHandler cgi-script .cgi

設定ファイルの再読み込み

# service apache2 reload

動いた。

補足

mods-enabled: 有効になっているモジュールの設定を格納
mods-available: 有効または有効にできるモジュールの設定を格納
a2enmod a2dismodコマンドで有効・無効を切り替えシンボリックリンクが張られる。

/etc/apache2/mods-enabled# ls -l
lrwxrwxrwx 1 root root 26 May 14  2012 cgi.load -> ../mods-available/cgi.load

/etc/apache2# a2dismod cgi
Module cgi disabled; run /etc/init.d/apache2 force-reload to fully disable.

/etc/apache2/mods-enabled# ls -l
cgi.loadのシンボリックリンクが消える

# service apache2 force-reload
 * Reloading web server config apache2

再度有効にする
/etc/apache2# a2enmod cgi
Module cgi installed; run /etc/init.d/apache2 force-reload to enable.

/etc/apache2# ls -l mods-enabled/
lrwxrwxrwx 1 root root 26 Oct 29 11:14 cgi.load -> ../mods-available/cgi.load
シンボリックリンクが追加された

# service apache2 force-reload
 * Reloading web server config apache2
/* -----codeの行番号----- */