HTTP w00tw00t 공격 다루기 – [29/Mar/2010:10:43:15 +0200] “GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1” 400 392 “-“

나는 아파치가있는 서버를 가지고 있으며 최근에 많은 공격을 받기 때문에 mod_security2를 설치했습니다.

내 아파치 버전은 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는 하루에 서버 시간을 변경하기 때문에 파일이 매우 커질 것이라고 생각합니다.

나는 2 가지 다른 해결책을 생각해 냈습니다. 누군가가 좋은지에 대해 의견을 말할 수 있습니까?

  1. 내 마음에 오는 첫 번째 해결책은 아파치 오류 로그에서 이러한 공격을 제외하는 것입니다. 이렇게하면 다른 긴급한 오류가 발생하기 쉬워지고 긴 통나무를 뱉을 필요가 없습니다.

  2. 두 번째 옵션은 내가 생각하는 것이 더 좋으며 올바른 방식으로 보내지지 않은 호스트를 차단하고 있습니다. 이 예에서 w00tw00t 공격은 호스트 이름없이 전송되므로 올바른 형식이 아닌 호스트를 차단할 수 있다고 생각합니다.

업데이트 2

답을 구한 후 나는 다음 결론에 도달했다.

  1. 아파치에 대한 사용자 정의 로깅을 받으려면 불필요한 도움이 필요하며 실제로 문제가있는 경우 누락되지 않은 전체 로그를보고 싶을 것입니다.

  2. 적중을 무시하고 오류 로그를 분석하는 더 나은 방법에 집중하는 것이 좋습니다. 로그에 필터를 사용하면 이에 대한 좋은 접근 방식입니다.

주제에 대한 최종 생각

위에서 언급 한 공격은 최소한 최신 시스템을 갖추고있어 기본적으로 걱정할 필요가없는 경우 시스템에 도달하지 않습니다.

오류 로그와 액세스 로그가 모두 매우 커지기 때문에 잠시 후 실제 공격의 모든 가짜 공격을 필터링하기가 어려울 수 있습니다.

어떤 식 으로든 이런 일이 발생하지 않도록하려면 리소스 비용이 들며 중요하지 않은 리소스에 리소스를 낭비하지 않는 것이 좋습니다.

내가 지금 사용하는 솔루션은 Linux logwatch 입니다. 로그 요약 정보를 보내며 필터링 및 그룹화됩니다. 이렇게하면 중요하지 않은 것과 중요한 것을 쉽게 분리 할 수 ​​있습니다.

도움을 주셔서 감사합니다.이 게시물이 다른 사람에게도 도움이되기를 바랍니다.



답변

오류 로그에서 Host : 부분의 요청없이 HTTP / 1.1 요청을 보냅니다. 필자가 읽은 내용에서 Apache는 mod_security로 넘기기 전에 400 (잘못된 요청) 오류 로이 요청에 응답합니다. 따라서 규칙이 처리되는 것처럼 보이지 않습니다. (아파치가 mod_security로 넘겨주기 전에 처리합니다)

자신을보십시오 :

텔넷 호스트 이름 80
GET /blahblahblah.html HTTP / 1.1 (입력)
(들어가다)

400 오류가 발생하고 로그에 동일한 오류가 표시됩니다. 이것은 나쁜 요청이며 아파치가 올바른 대답을하고 있습니다.

적절한 요청은 다음과 같아야합니다.

GET /blahblahblah.html HTTP / 1.1
호스트 : blah.com

이 문제의 해결 방법은 mod_uniqueid를 패치하고, 요청이 실패한 경우에도 고유 ID를 생성하여 아파치가 요청을 요청 핸들러로 전달할 수 있습니다. 다음 URL은이 해결 방법에 대한 설명이며 사용할 수있는 mod_uniqueid에 대한 패치를 포함합니다.
http://marc.info/?l=mod-security-users&m=123300133603876&w=2

다른 솔루션을 찾지 못해 실제로 솔루션이 필요한지 궁금합니다.


답변

IP 필터링은 좋은 생각이 아닙니다. 알고있는 문자열을 필터링하지 마십시오.

내말은:

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


답변

IV는 또한 내 로그 파일에서 이러한 유형의 메시지를보기 시작했습니다. 이러한 유형의 공격을 방지하는 한 가지 방법은 fail2ban ( http://www.fail2ban.org/ )을 설정하고 iptables 규칙에서 이러한 IP 주소를 블랙리스트에 표시하도록 특정 필터를 설정하는 것입니다.

다음은 이러한 메시지 작성과 관련된 IP 주소를 차단하는 필터의 예입니다.

[화 8 월 16 일 02:35:23 2011] [오류] [클라이언트] 파일이 없습니다 : /var/www/skraps/w00tw00t.at.blackhats.romanian.anti-sec 🙂 === 아파치 w00t w00t 메시지 감옥 -정규 표현식 및 필터 === 감옥

 [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 =


답변

w00tw00t.at.blackhats.romanian.anti-sec는 해킹 시도이며 스푸핑 IP를 사용하므로 VisualRoute와 같은 조회에서 해당 시간의 IP에 따라 중국, 폴란드, 덴마크 등을보고합니다. 따라서 IP 거부 또는 호스트 이름을 설정하는 것은 한 시간 안에 변경되므로 불가능합니다.


답변

개인적으로 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)


답변

mod_security가 작동하지 않는 이유는 Apache가 요청 자체를 구문 분석 할 수 없었으며 사양이 맞지 않기 때문입니다. 나는 당신이 여기에 문제가 있다는 것을 확신하지 못합니다-아파치는 그물에서 발생하는 이상한 똥을 기록하고 있습니다. 요청을 기록하는 데 필요한 리소스는 최소한 일 것입니다. 누군가 로그를 채우는 것에 대한 불만을 알고 있습니다. 그러나 실제로 필요한 경우에만 로깅을 사용하지 않으면 더욱 실망 스러울 것입니다. 누군가가 웹 서버에 침입 한 것처럼 어떻게 침입했는지를 보여주는 로그가 필요합니다.

한 가지 해결책은 syslog를 통해 ErrorLogging을 설정 한 다음 rsyslog 또는 syslog-ng를 사용하여 w00tw00t와 관련된 RFC 위반을 구체적으로 필터링하고 버릴 수 있습니다. 또는 기본 오류 로그를 쉽게 읽을 수 있도록 별도의 로그 파일로 필터링 할 수도 있습니다. 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 %가 있어야합니다.


답변

업데이트 2에서 말합니다.

여전히 남아있는 문제 여전히 남아있는 문제는 다음과 같습니다. 이러한 공격은 서버에서 특정 파일을 검색하는 봇으로부터의 공격입니다. 이 특정 스캐너는 /w00tw00t.at.ISC.SANS.DFind 🙂 파일을 검색합니다.

이제 가장 권장되는 것을 무시할 수 있습니다. 문제는 언젠가 서버에이 파일이 있으면 언젠가 문제가 있다는 것입니다.

이전 답변에서 HTML 1.1 쿼리의 형식이 잘못되어 Apache가 오류 메시지를 반환한다는 것을 알았습니다. HTTP / 1.1을 지원하는 모든 웹 서버는이 메시지를받을 때 오류를 반환해야합니다 (RFC를 두 번 확인하지 않았을 수도 있습니다-아마도 RFC2616이 알려줍니다).

w00tw00t.at.ISC.SANS.DFind가있는 경우 : 서버에서 “문제가 있습니다”라는 말이 아닌 일부 서버에서 … w00tw00t.at.ISC.SANS.DFind : 파일을 DocumentRoot에 작성하거나 DefaultDocumentRoot 그것은 중요하지 않습니다 … 스캐너가 깨진 HTTP / 1.1 요청을 보내고 아파치가 “아니요, 나쁜 요청입니다 … 안녕히 가세요”라고 말합니다. w00tw00t.at.ISC.SANS.DFind : 파일의 데이터는 제공되지 않습니다.

이 경우에 실제로 mod_security를 ​​사용하지 않으려는 경우 (필요하지 않습니까?) …이 경우 수동으로 패치하는 것을 볼 수 있습니다 (다른 답변의 링크).

사용할 수있는 또 다른 것은 mod_security의 RBL 기능입니다. 아마도 w00tw00t IP (또는 다른 알려진 악성 IP)를 제공하는 RBL 온라인이있을 수 있습니다. 그러나 이것은 mod_security가 모든 요청에 ​​대해 DNS 조회를 수행한다는 것을 의미합니다.