Shellshockの脆弱性は、2014年後半に発見されました(正確には、影響は2014年9月24日にCVE-2014-6271に投稿されました)。その後、bashバージョンのアップデートがリリースされました 4.1.2-15 Shellshockの脆弱性が修正されました。さて、全世界がbashを更新し、Shellshockからシェルを保護しましたが、驚くべきことに、私のオフィスの多くのマシンは何らかの理由で更新されませんでした。怖いのは、脆弱なシェルを備えたマシンのいくつかがインターネットで多くのサービスをホストしていたことです。インターネット上のさまざまなブログによると、Shellshockエクスプロイトにより、攻撃者はCGIスクリプトを介してbashで悪意のあるコマンドをリモートで実行できます。
(I know this tutorial is pretty late, but there are many who are not aware of it and still using vulnerable bash on their public servers)
まず、BASHがShellshockに対して脆弱かどうかを確認します 。したがって、4.1.2より前のbashバージョンには必ずこの脆弱性があります。
$ bash --version GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
(または)
$ rpm -qa|grep bash bash-completion-1.3-7.el5 bash-3.2-32.el5_9.1
バージョンがわかったので、以下のコマンドを実行して、Shellshockに対して脆弱であることを確認します。
$ env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock" vulnerable If you see the word vulnerable above, you are vulnerable to shellshock
解決策:
この投稿の一番下にジャンプします。場合によっては、シェルショックがどのように機能するかを知りたい場合は、読んでください。
SHELLのエクスポート変数について:
上記の出力が示すように、SHELLは脆弱ですが、どのように機能するかを見てみましょう。
通常、環境変数を設定してシェルで使用できます。たとえば、次のようになります。
$ test=1 $ echo $test 1
ただし、新しいbashシェルで環境変数「test」を直接使用することはできません。 。チェックしてください:
$ test=1 $ echo $test 1 $ bash $ echo $test
出力が空白です。その理由は、環境変数は同じシェルでのみアクセスできるためです。ただし、環境変数をエクスポートすると、新しいbashシェルでも使用できるようになります。次に例を示します:
$ var="testing" $ export var $ bash $ echo $var testing
これで、変数「$ var」が設定され、1つのシェルにエクスポートされ、別のシェルからアクセスされたことがわかります。もちろん、以下のコマンドを使用していつでもエクスポートを停止できます。
$ export -n var $ bash $ echo $var
同様に、関数を作成して1つのシェルでエクスポートし、エクスポートされた関数に別のシェルからアクセスできます。その例も見てみましょう。
$ fnc() { echo "testing"; } $ fnc testing $ bash $ fnc bash: fnc: command not found
上記の出力では、「 bash:fnc:コマンドが見つかりません」と表示されます。 ‘なぜなら、 fnc エクスポートされた関数ではありません。したがって、別のシェルから呼び出すことはできません。
「fnc」をエクスポートしましょう ‘も。
$ export -f fnc $ fnc testing $ bash $ fnc testing
期待どおりに機能します(「 fnc ‘がエクスポートされ、別のシェルで使用可能になりました。
変数または関数をエクスポートすると、環境変数が設定されます
$ env | grep -A1 fnc fnc=() { echo "testing" }
シェルショックエクスプロイトになりました
上記の例に基づいて、新しいbashシェルが()で始まる環境変数の定義を取り込み、それを関数として解釈することを学びました。 。ただし、ここに脆弱性があります。新しいシェルは、見積もりにあるものをすべて実行します。
例:
以下のコマンドを実行します:
$ export sse_fnc='() { echo "function shellshock exploit" ; }; echo "Not good"; '
「sse_fnc」の環境変数を確認してください:
$ env | grep -A1 sse_fnc sse_fnc=() { echo "function shellshock exploit" ; }; echo "Not good";
新しいbashシェルに移動します:
$ bash Not good
注: 「bash」と入力しました ‘とテキスト‘ Not good が表示されます ‘印刷。つまり、新しいシェルは、環境変数を読み取った後に関数の実行を開始し、後続のコマンドも実行します(「エコー「関数シェルショックエクスプロイト」;」の後に関数ブレースが閉じた場合でも)。
言い換えれば、「エクスポートされた変数sse_fnc
関数sse_fnc
として解釈されたサブシェルに渡されました しかし、後続のコマンドが実行されました(this is bad
)サブシェルが生成されたとき。」
Fixee@StackExchange経由
この脆弱性を悪用するにはどうすればよいですか?
この男(shellshocker.net)よりもうまく説明できる人はいないと思います。ありがとう!
シェルショックを修正する方法
簡単です。bashを更新し、エクスプロイトを試して、脆弱性がなくなったかどうかを確認してください。
$curl https://shellshocker.net/fixbash | sh
上記のコマンドは、約30以上のパッチを自動的にダウンロードし、ソースからbashをコンパイルします。このスクリプトを定期的に実行して、bashを最新のパッチで最新の状態に保つことができます。
インストールが成功したら。以下のようにbashのバージョンを確認してください:
$bash --version GNU bash, version 4.3.42(1)-release (x86_64-unknown-linux-gnu)
シェルショックの脆弱性をテストする:
$env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock If you see the word vulnerable above, you are vulnerable to shellshock
上記の出力から、「脆弱な」単語は出力されませんでした。だから私のbashは安全です!
(または)
$env X='() { (shellshocker.net)=>\' bash -c "echo date"; cat echo; rm ./echo
BASHが脆弱な場合、上記のコマンドは日付を出力します。それ以外の場合、BASHは安全です。