HTTP w00tw00t 공격 다루기


82

나는 아파치가있는 서버를 가지고 있으며 최근에 많은 공격을 받기 때문에 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 입니다. 로그 요약 정보를 보내며 필터링 및 그룹화됩니다. 이렇게하면 중요하지 않은 것과 중요한 것을 쉽게 분리 할 수 ​​있습니다.

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

답변:


34

오류 로그에서 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

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


나는 지금 문제를 본다. 기사에 제공된 솔루션을 권장하거나 그대로 두는 것이 더 좋다고 생각합니까? 시스템의 모든 백도어 용 스캐너입니다. 스캔 한 상태로두면 언젠가 공격받을 수 있습니다.
Saif Bechan

1
안녕하세요 Saif, 배포판 (또는 수동) 보안 패치를 사용하여 아파치 설치를 최신 상태로 유지하는 한 괜찮습니다. 구조화 된 HTTP / 1.1 요청 (아시다시피)은 아파치에서 400 오류 이외의 것을 반환해서는 안됩니다. 그것은 것 같습니다 DLINK 라우터에 초점을 맞춘 취약점 검사의 일종이었다. (다른 출처에 따르면)
Imo

내 아파치 에서이 필드를 가져 오는 방법이 적어도 있습니까? error_log
Saif Bechan

당신은 어쩌면 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 비슷한 솔루션이지만 조금 더 자세합니다.
Isaac

방화벽에서 문자열 필터링의 한 가지 문제는 "정말 느리다"는 것입니다.
Alexis Wilke 5

@AlexisWilke iptables 문자열 필터링이 아파치 수준에서 필터링하는 것보다 느리다는 증거가 있습니까?
jrwren

@jrwren 실제로, 검색을 중지하기 위해 패킷 오프셋을 전달하지 않으면 (예 : "--to 60") 속도가 느려질 수 있습니다. 기본적으로 전체 패킷을 검색합니다. 최대 한도는 65,535 바이트로 설정되어 있으며 최대 IP 패킷 길이는 다음과 같습니다. blog.nintechnet.com/… 매뉴얼은 "통과하지 않으면 기본값은 패킷 크기"입니다.
gouessej

이론상 최대입니다. 인터넷을 통한보다 현실적인 최대 길이는 ~ 1500입니다.
jrwren

11

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 =

2
차단할 수는 있지만 요청이 잘못 되었기 때문에 그럴 필요는 없습니다. 그냥 무시하고 작업을 저장하면 더 많은 보상을 얻을 수 있습니다.
Saif Bechan

맞습니다. @Saif Bechan, 누군가 "테스트 공격"이 성공하기를 걱정한다면 시간을 낭비하는 대신 자신의 응용 프로그램을 차단하는 방법을 찾는 것이 좋습니다.
토마스 버거

답을 주셔서 감사합니다.
Saif Bechan

4
@ SaifBechan, 동의하지 않습니다. w00tw00t는 취약성 스캐너이며 이러한 요청을 발행하는 시스템은 다른 유형의 요청을 시도해도 신뢰할 수 없으므로 시스템 관리자 인 경우 한 번에 며칠 동안 해당 클라이언트를 금지하는 데 2 ​​분이 걸립니다. 그렇습니다. 그러나 전체 보안 구현을 이러한 접근 방식에 기반하지는 않습니다.
Isaac

3

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


이러한 취약점 검색은 스푸핑 된 IP 주소를 사용하지 않습니다. 만약 그렇다면, TCP 3-way 핸드 셰이크가 완료되지 않고 Apache는 요청을 기록하지 않습니다. 주의 사항 (불량 ISP, 라우터 사업자 등)을 참조 security.stackexchange.com/q/37481/53422
안토니 문헌 [Geoghegan

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 공격을 막기위한 것입니까
Saif Bechan

예, 아파치 오류 로그에서 "w00tw00t"IP를 스캔하고 존재하지 않는 경우 추가합니다. 단순성을 위해 중복 검사를 추가하지 않았습니다.
Xorlev

이 스크립트는 아마도 테이블을 사용해야 할 것입니다. iptables 체인에 수많은 규칙을 추가하면 처리 속도가 약간 느려집니다.
Eric

테이블을 사용합니다. 그러나 내 시스템에 맞게 조정하여 많은 것을 단순화했습니다.
Xorlev

이것이 mod_security를 ​​사용하는 더 나은 솔루션이라고 생각
하십니까?

2

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는 300 번 시도합니다. 나는 당분간 설정을 그대로 둘 것이라고 생각합니다.
Saif Bechan

1

업데이트 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 조회를 수행한다는 것을 의미합니다.


나는 아파치가 그것들을 거부한다고 생각하지 않으며, 단지 오류를 던지지 만 조회는 여전히 통과합니다. 액세스 로그에 동일한 w00tw00t.at.ISC.SANS.DFind가 있습니다. GET을 수행합니다. 따라서 조회가 완료되고 컴퓨터에 파일이 있으면 실행됩니다. 액세스 로그 항목을 게시 할 수 있지만 GET이있는 오류 로그와 동일하게 보입니다. Apache가 오류를 발생 시키지만 요청은 통과합니다. 그렇기 때문에 호스트 이름없이 이러한 요청을 차단하는 것이 좋은지 물었습니다. 그러나 일반 사용자를 차단하고 싶지 않습니다.
Saif Bechan

1
물론, 액세스 로그에 동일한 항목이 있지만 오류 코드는 ... 400입니다. 처리되지 않습니다. HTTP / 1.1 (호스트 이름)은 아파치에게 요청을 보낼 가상 호스트를 알리는 데 사용됩니다. 다시 클라이언트로.
Imo

직접 시도해보십시오 ... 웹 서버에서 직접 html 페이지를 만들고 "telnet hostname 80"을 사용하여 수동으로 가져 오십시오 ... 다른 단계는 첫 번째 답변입니다. 호스트 이름없이 HTTP / 1.1을 사용하여 html 파일을 표시 할 수 없도록 큰 현상금을 넣었습니다.
Imo

아 그렇습니다. 저에게 지적 해주셔서 감사합니다. 나는 항상 access_log가 오류 로그를 통해 전달되어 실제로 시스템에 입력 된 항목이라고 생각했습니다. 이 내용을 알려 주셔서 감사합니다. 내 게시물을 수정하겠습니다. 도와 주셔서 감사합니다.
Saif Bechan

안녕하세요 Saif, 문제 없습니다, 기꺼이 도와 드리겠습니다. 감사합니다. Imo
Imo

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

따라서 때로는 라우터 규칙 구현, 방화벽 규칙 구현 (네트워크에 하나가 있음), 서버 방화벽 / IP 테이블 구현 등 동일한 공유로 모든 시스템간에 집중 범위를 넓히고 방어 노력을 나누는 데 도움이됩니다. 규칙 및 관련 서비스 (예 : 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

이것은 실제로 좋은 생각이 아닙니다. 당신은 많은 교수형 연결로 끝납니다. 또한 귀하의 사이트에 해당 요청에 대한 토론이있는 경우 오 탐지로 이어질 수 있습니다.
kasperd

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.