HTTP w00tw00t攻撃への対処


82

私はApacheを備えたサーバーを持っていますが、最近mod_security2をインストールしました。

私のApacheバージョンはApache v2.2.3であり、mod_security2.cを使用しています

これはエラーログからのエントリでした:

[Wed Mar 24 02:35:41 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:31 2010] [error] 
[client 202.75.211.90] client sent HTTP/1.1 request without hostname 
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:47:49 2010] [error]
[client 95.228.153.177] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

[Wed Mar 24 02:48:03 2010] [error] 
[client 88.191.109.38] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

access_logからのエラーはここにあります:

202.75.211.90 - - 
[29/Mar/2010:10:43:15 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:11:40:41 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-"
211.155.228.169 - - 
[29/Mar/2010:12:37:19 +0200] 
"GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 392 "-" "-" 

このようにmod_security2を設定してみました:

SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecFilterSelective REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecFilterSelective REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

mod_security2のことは、SecFilterSelectiveを使用できず、エラーが発生することです。代わりに、次のようなルールを使用します。

SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind"
SecRule REQUEST_URI "\w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:"
SecRule REQUEST_URI "w00tw00t\.at\.ISC\.SANS\.DFind:\)"

これでも機能しません。私はもう何をすべきかわかりません。誰にもアドバイスがありますか?

アップデート1

mod_securityを使用してこの問題を解決できる人はいないことがわかります。これまでのところ、ip-tablesを使用するのがこれを行うための最良のオプションのように思えますが、ipは1日数回サーバーを変更するため、ファイルは非常に大きくなると思います。

私は2つの他の解決策を思いついた、誰かがそれらについて良いかどうかについてコメントすることができます。

  1. 私の頭に浮かぶ最初の解決策は、Apacheエラーログからこれらの攻撃を除外することです。これにより、他の緊急エラーが発生したときに簡単に見つけることができ、長いログを吐き出す必要がなくなります。

  2. 2番目のオプションの方が良いと思います。それは、正しい方法で送信されないホストをブロックすることです。この例では、w00tw00t攻撃はホスト名なしで送信されるため、正しい形式ではないホストをブロックできると思います。

更新2

答えをたどった後、私は次の結論に達しました。

  1. Apacheのカスタムロギングを使用するには、いくつかの不必要なリソースが消費されます。本当に問題がある場合は、おそらく何も欠落していない完全なログを確認する必要があります。

  2. ヒットを無視して、エラーログを分析するより良い方法に集中することをお勧めします。ログにフィルターを使用することは、これに適したアプローチです。

主題に関する最終的な考え

上記の攻撃は、少なくとも最新のシステムがあればマシンには届かないので、基本的に心配はありません。

エラーログとアクセスログの両方が非常に大きくなるため、しばらくしてから実際の攻撃からすべての偽の攻撃を除外することは困難です。

これが何らかの形で発生するのを防ぐと、リソースが消費されます。重要でないものにリソースを無駄にしないことをお勧めします。

現在使用しているソリューションはLinux logwatchです。ログの概要が送信され、それらはフィルタリングされてグループ化されます。これにより、重要なものと重要でないものを簡単に分離できます。

助けてくれてありがとう、そしてこの投稿が他の誰かにも役立つことを願っています。

回答:


34

エラーログから、リクエストのHost:部分なしでHTTP / 1.1リクエストを送信しています。私が読んだことから、Apacheはmod_securityに引き渡す前に、この要求に対して400(悪い要求)エラーで応答します。したがって、ルールが処理されるようには見えません。(mod_securityに引き渡す必要がある前にそれを処理するApache)

自分で試してください:

telnetホスト名80
GET /blahblahblah.html HTTP / 1.1(入力)
(入る)

400エラーが表示され、ログに同じエラーが表示されるはずです。これは悪いリクエストであり、Apacheは正しい答えを提供しています。

適切なリクエストは次のようになります。

GET /blahblahblah.html HTTP / 1.1
ホスト:blah.com

この問題を回避するには、mod_uniqueidにパッチを適用して、失敗したリクエストに対しても一意のIDを生成し、Apacheがリクエストをリクエストハンドラに渡すようにします。以下のURLは、この回避策についての議論で、あなたが使用することができmod_uniqueidためのパッチが含まれています http://marc.info/?l=mod-security-users&m=123300133603876&w=2

他の解決策が見つからず、実際に解決策が必要かどうか疑問に思いました。


今、問題が見えます。記事で提供されているソリューションを推奨しますか、それともそのままにしておく方が良いと思いますか。システム内のバックドア用のスキャナーです。スキャンだけを続けると、いつか攻撃を受ける可能性があります。
サイフBechan

1
Saifこんにちは、Apacheのインストールをディストリビューション(または手動)セキュリティパッチで最新に保つ限り、問題ないはずです。構造が不十分なHTTP / 1.1リクエスト(これまで見てきた)は、apacheからの400エラー以外は何も返すべきではありません。DLinkルーターに焦点を当てたある種の脆弱性スキャンである可能性があります。(他の情報源による)
イモ

私のApache error_logからこれらのフィールドを取得する方法が少なくともありますか
サイフ・ベチャン

あなた多分 mod_log ::経由でそれを行うことができるhttpd.apache.org/docs/2.2/mod/mod_log_config.html#customlog

追加のヒントは、実際に使用している仮想ホストの隣にデフォルトの仮想ホストを構成することです。上記の試みは、デフォルトの仮想ホストのログに記録されます
クースヴァンデンハウト

16

IPをフィルタリングするのは得策ではありません。知っている文字列をフィルタリングしてみませんか?

というのは:

iptables -I INPUT -p tcp --dport 80 -m string --to 60 --algo bm --string 'GET /w00tw00t' -j DROP

spamcleaner.org/en/misc/w00tw00t.html同様のソリューションですが、もう少し詳細です。
アイザック

ファイアウォールでの文字列フィルタリングの問題の1つは、「かなり遅い」ということです。
アレクシスウィルケ

@AlexisWilke iptables文字列フィルタリングは、Apacheレベルでのフィルタリングよりも遅いことを示唆する証拠がありますか?
-jrwren

@jrwren実際、検索を停止するためにパケットオフセットを渡さない場合、つまり「--to 60」の場合のみ、かなり遅くなります。デフォルトでは、パケット全体を検索します。最大制限は65,535バイト、最大IPパケット長はblog.nintechnet.com/…に設定されています。
gouessej

それは理論上の最大値です。インターネットでのより現実的な最大長は〜1500です。
jrwren

11

Ivはまた、ログファイルでこれらのタイプのメッセージを見始めました。これらのタイプの攻撃を防ぐ1つの方法は、fail2ban(http://www.fail2ban.org/)をセットアップし、iptablesルールでこれらのIPアドレスをブラックリストに登録する特定のフィルターをセットアップすることです。

これらのメッセージの作成に関連するIPアドレスをブロックするフィルターの例を次に示します

[Tue Aug 16 02:35:23 2011] [error] [client]ファイルが存在しません:/var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec :) === apache w00t w00t messages jail -正規表現とフィルター===刑務所

 [apache-wootwoot]
 enabled  = true
 filter   = apache-wootwoot
 action   = iptables[name=HTTP, port="80,443", protocol=tcp]
 logpath  = /var/log/apache2/error.log
 maxretry = 1
 bantime  = 864000
 findtime = 3600

フィルタ

 # Fail2Ban configuration file
 #
 # Author: Jackie Craig Sparks
 #
 # $Revision: 728 $
 #
 [Definition]
 #Woot woot messages
 failregex = ^\[\w{1,3} \w{1,3} \d{1,2} \d{1,2}:\d{1,2}:\d{1,2} \d{1,4}] \[error] \[client 195.140.144.30] File does not exist: \/.{1,20}\/(w00tw00t|wootwoot|WootWoot|WooTWooT).{1,250}
 ignoreregex =

2
それらをブロックできるのは事実ですが、それらは単に不正なリクエストであるため、必要はありません。それらを無視し、作業を保存すると、いくつかのリソースを解放できます。
サイフBechan

右@Saif Bechan、誰かがその「テスト攻撃」が成功することを心配するなら、彼/彼女はそれをブロックする方法を見つけるために時間を浪費する代わりに自身のアプリケーションを修正するべきです。
トーマスバーガー

+1してくれた。答えてくれてありがとう。
サイフBechan

4
@SaifBechan、私は同意しません。w00tw00tは脆弱性スキャナーであり、そのようなリクエストを発行しているマシンは他のタイプのリクエストの試行に対して信頼できないため、システム管理者であり、そのようなクライアントを一度に2日間禁止する場合、そうします。ただし、セキュリティの実装全体をこのようなアプローチに基づいているわけではありません。
アイザック

3

w00tw00t.at.blackhats.romanian.anti-secはハッキングの試みであり、スプーフィングIPを使用するため、VisualRouteなどのルックアップは、その時点で出向しているIPに従ってChina、Poland、Denmarkなどを報告します。そのため、Deny IPまたは解決可能なホスト名のセットアップは1時間以内に変更されるため、ほとんど不可能です。


これらの脆弱性スキャンでは、スプーフィングされたIPアドレスは使用されません。そうした場合、TCP 3ウェイハンドシェイクは完了せず、Apacheは要求をログに記録しません。警告(不正なISP、ルーターオペレーターなど)については、security.stackexchange.com
q / 37481/53422

2

私は個人的にIPtablesルールを自動追加するPythonスクリプトを書きました。

これは、ログやその他のジャンクのないわずかに短縮されたバージョンです。

#!/usr/bin/python
from subprocess import *
import re
import shlex
import sys

def find_dscan():
        p1 = Popen(['tail', '-n', '5000', '/usr/local/apache/logs/error_log'], stdout=PIPE)
        p2 = Popen(['grep', 'w00t'], stdin=p1.stdout, stdout=PIPE)

        output = p2.communicate()[0].split('\n')

        ip_list = []

        for i in output:
                result = re.findall(r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b", i)
                if len(result):
                        ip_list.append(result[0])

        return set(ip_list)

for ip in find_dscan():
        input = "iptables -A INPUT -s " + ip + " -j DROP"
        output = "iptables -A OUTPUT -d " + ip + " -j DROP"
        Popen(shlex.split(input))
        Popen(shlex.split(output))

sys.exit(0)

w00tw00t攻撃を防ぐために、これはある
サイフBechan

はい、Apacheエラーログで「w00tw00t」IPをスキャンし、存在しない場合は追加しますが、簡単にするために重複のチェックは追加しませんでした。
-Xorlev

このスクリプトはおそらくテーブルを使用する必要があります。iptablesチェーンに大量の追加ルールを追加すると、処理がかなり遅くなります。
エリック

テーブルを使用します。しかし、私のシステムに合わせて調整されたため、多くを単純化しました。
-Xorlev

これはmod_securityを使用するより良いソリューションだと思いますか
サイフBechan

2

mod_securityが機能しない理由は、Apacheがリクエスト自体を解析できず、リクエストが仕様外であるためだと思います。ここで問題があるかどうかはわかりません-apacheはネット上で発生している奇妙なたわごとをログに記録します。ログに記録しない場合は、その発生さえ認識できません。要求を記録するために必要なリソースはおそらく最小限です。誰かがあなたのログをいっぱいにしていることにイライラすることは理解していますが、本当に必要な場合にのみログを無効にすると、さらにイライラするでしょう。誰かがあなたのウェブサーバーに侵入したように、あなたは彼らがどのように侵入したかを示すためにログが必要です。

1つの解決策は、syslogを介してErrorLoggingをセットアップし、rsyslogまたはsyslog-ngを使用して、w00tw00tに関するこれらのRFC違反を明確にフィルタリングおよび破棄することです。または、メインのErrorLogを読みやすくするために、単純に別のログファイルにフィルターすることもできます。この点で、Rsyslogは非常に強力で柔軟です。

したがって、httpd.confで次のことを実行できます。

ErrorLog syslog:user 

次に、rsyslog.confに以下が含まれている可能性があります。

:msg, contains, "w00tw00t.at.ISC.SANS.DFind" /var/log/httpd/w00tw00t_attacks.log

このアプローチは、実際にファイルへの直接のログ記録に使用されていたよりも実際に何倍ものリソースを使用することに注意してください。ウェブサーバーが非常に混雑している場合、これが問題になる可能性があります。

とにかく、できるだけ早くすべてのログをリモートロギングサーバーに送信することをお勧めします。これは、行われたことの監査証跡を消去するのがはるかに難しいため、侵入された場合に役立ちます。

IPTablesブロックはアイデアですが、パフォーマンスに影響を与える可能性のある非常に大きなiptablesブロックリストが作成される場合があります。IPアドレスにパターンがありますか、それとも大規模な分散ボットネットからのものですか?iptablesから利益を得るには、重複のX%が必要になります。


いい答えです、私はさまざまなアプローチが好きです。考えてみると、カスタムロギングを使用すると、すべてのリソースを最初にチェックする必要があるため、より多くのリソースを使用することになります。このオプションも無効になると思います。ログウォッチを有効にしました。これにより、システム全体の概要を含むレポートが1日に2回送信されます。Apacheログもチェックされ、w00tw00tが300回試行したと表示されます。とりあえずセットアップはそのままにしておきます。
サイフBechan

1

あなたはアップデート2で言います:

まだ残っている問題残っている問題は次のとおりです。これらの攻撃は、サーバー上の特定のファイルを検索するボットによるものです。この特定のスキャナーは、ファイル/w00tw00t.at.ISC.SANS.DFind :)を検索します。

これで、最も推奨される無視することができます。問題は、いつか何らかの形でこのファイルをサーバー上に置いた場合、何らかのトラブルが発生することです。

前回の返信から、Apacheが不適切な形式のHTML 1.1クエリのためにエラーメッセージを返していることがわかりました。HTTP / 1.1をサポートするすべてのWebサーバーは、おそらくこのメッセージを受信するとエラーを返すはずです(RFCを二重にチェックしたことはありません-おそらくRFC2616が教えてくれます)。

w00tw00t.at.ISC.SANS.DFind:を持っているサーバー上で、「トラブルに巻き込まれている」という神秘的な意味がない場所... DocumentRootまたはDefaultDocumentRoot関係ありません...スキャナーは壊れたHTTP / 1.1リクエストを送信しており、Apacheは「いいえ、それは悪いリクエストです...さようなら」と言っています。w00tw00t.at.ISC.SANS.DFind:ファイルのデータは提供されません。

この場合にmod_securityを使用する必要はありません(本当に必要ないのですか)。

使用する可能性があるもう1つのことは、mod_securityのRBL機能です。おそらく、w00tw00t IP(または他の既知の悪意のあるIP)を提供するRBLオンラインがあります。ただし、これはmod_securityがすべてのリクエストに対してDNSルックアップを行うことを意味します。


私はApacheがそれらを拒否するとは思わない、それはただエラーを投げるが、ルックアップはまだ通過する。アクセスログに同じw00tw00t.at.ISC.SANS.DFindがあります。GETを実行します。したがって、ルックアップは完了し、マシンにファイルがある場合は実行されます。アクセスログエントリを投稿できますが、エラーログと同じように見えますが、その前にGETがあります。Apacheはエラーをスローしますが、リクエストはパスします。そのため、ホスト名なしでこれらの要求をブロックすることをお勧めします。しかし、私は通常のユーザーをブロックしたくありません。
サイフBechan

1
確かに、アクセスログに同じエントリが表示されますが、エラーコードを確認してください...400。処理されません。HTTP / 1.1(ホスト名)は、HTTP / 1.1リクエストのホスト名の部分がない場合、リクエストを送信する仮想ホストをApacheに指示するために使用されます。Apacheはリクエストの送信先を認識せず、クライアントに戻ります。
イモ

自分で試してみてください...自分のウェブサーバーでhtmlページを作成し、「telnet hostname 80」を使用して手動でアクセスしてみてください...他の手順は最初の答えです。ホスト名なしでHTTP / 1.1を使用して表示するhtmlファイルを取得できないという大きな賞金をかけます。
イモ

ああ、はいはい、それを私に指摘してくれました。access_logは、エラーログを介して渡され、実際にマシンに入ったエントリであると常に考えていました。これを指摘してくれてありがとう。投稿を編集します。本当にありがとうございます。
サイフBechan

こんにちはサイフ、問題なく、助けてくれてうれしいです。よろしく、イモ
イモ

1

modsecurityにルールを追加するのはどうですか?このようなもの:

   SecRule REQUEST_URI "@rx (?i)\/(php-?My-?Admin[^\/]*|mysqlmanager
   |myadmin|pma2005|pma\/scripts|w00tw00t[^\/]+)\/"
   "severity:alert,id:'0000013',deny,log,status:400,
   msg:'Unacceptable folder.',severity:'2'"

1

ほとんどのソリューションはすでに上記で説明されていますが、ホスト名攻撃なしでHTTP / 1.1リクエストを送信したすべてのクライアントがサーバーに直接向けられているわけではないことを指摘したいと思います。サーバーの前のネットワークシステムをフィンガープリントおよび/または悪用しようとするさまざまな試みがあります。

client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /tmUnblock.cgi

Linksysルーターなどをターゲットとするために、時折、焦点を広げて、等しいシェアを持つすべてのシステム間で防御努力を分割するのに役立ちます。すなわち、ルータールールを実装し、ファイアウォールルールを実装しますmod_security、fail2banなどのルールと関連サービス。


1

これはどう ?

iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.DFind' -j DROP
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /w00tw00t.at.ISC.SANS.DFind' -j LOG --log-level 4 --log-prefix Hacktool.DFind:DROP:

私にとってはうまくいきます。


mod_securityにOWASP_CRS / 2.2.5またはグレータールールセットを推奨
Urbach-Webhosting

これは本当に良い考えではありません。多くの接続がハングアップすることになります。さらに、サイトでこれらのリクエストに関する議論がある場合は、誤検知が発生する可能性があります。
カスペルド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.