最近几天,我注意到一些服务器受到未知请求的影响。
他们中的大多数是这样的:
60.246.*.* - - [03/Jan/2015:20:59:16 +0200] "GET /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1 HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)
经过一些记录和搜索,我发现一些中国 ISP(根据 whatsmydns.net 的结果可能是 CERNET)和一些土耳其 ISP(可能是 TTNET)响应 dns 查询,例如a.tracker.thepiratebay.org使用与piratebay 无关的各种 IP或种子。换句话说,他们似乎出于某种奇怪的原因进行了某种 DNS 缓存中毒。
因此,这些国家/地区的数百个(如果不是数千个)bittorrent 客户端向我的网络服务器发出大量“通知”,这几乎导致 DDoS 攻击填满了 Apache 的所有连接。
目前,我完全阻止了中国和土耳其,它可以完成工作,但我想找到一种更好的方法来阻止这些请求。
我正在考虑使用基于 HTTP 主机标头的 mod_security 阻止这些请求。
所有这些请求都包含一个 HTTP Host 标头a.tracker.thepiratebay.org(或 thepiratebay.org 域的许多其他子域)。
这是通过 PHP$_SERVER变量的请求标头转储。
DOCUMENT_ROOT: /usr/local/apache/htdocs
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT_ENCODING: gzip
HTTP_CONNECTION: Close
HTTP_HOST: a.tracker.thepiratebay.org
HTTP_USER_AGENT: uTorrent/342(109415286)(35702)
PATH: /bin:/usr/bin
QUERY_STRING: info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1
REDIRECT_STATUS: 200
REMOTE_ADDR: 60.246.*.*
REMOTE_PORT: 3445
REQUEST_METHOD: GET
REQUEST_URI: /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1
SCRIPT_FILENAME: /usr/local/apache/htdocs/announce.php
SCRIPT_NAME: …Run Code Online (Sandbox Code Playgroud) 如何仅针对特定目录禁用 modsecurity。我在 phpMyAdmin 中遇到错误,这是由基于规则的 modsecurity 跳闸引起的。我设置了以下文件:
# /etc/httpd/modsecurity.d/modsecurity_crs_15_customrules.conf
<LocationMatch "^/phpMA/">
SecRuleEngine Off
</LocationMatch>
# /etc/httpd/modsecurity.d/modsecurity_crs_60.custom.conf
<LocationMatch '^/phpMA/*'>
SecRuleRemoveById 950004
SecRuleRemoveById 950005
SecRuleRemoveById 950006
SecRuleRemoveById 960010
SecRuleRemoveById 960012
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
从我可以找到的第一个文件应该禁用它,但它仍然跳闸,所以我尝试添加它跳闸到 60 文件的规则 ID,但它仍然抱怨。
我在 CentOS 5.3 上运行以下软件包:
几乎在每个请求中,我都会收到以下错误:
Rule execution error - PCRE limits exceeded (-8): (null).
经过一堆谷歌搜索后,唯一的解决方案似乎是
a) 在您的 httpd.conf 中添加以下内容
SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
Run Code Online (Sandbox Code Playgroud)
b) 将以下内容添加到您的 php.ini
pcre.backtrack_limit = 10000000
pcre.recursion_limit = 10000000
Run Code Online (Sandbox Code Playgroud)
c) 使用使用-disable-pcre-match-limit选项编译的版本。
我正在运行以下内容:
Apache/2.5.12 ( http://www.modsecurity.org/ ) 的ModSecurity 。
Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze8 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8
对于 ModSec 我的规则,我使用的是 OWASP ModSecurity 核心规则集项目版本 (CRS) 版本 2.2.3,这是本文发布时的最新版本。
我的 httpd.conf 主要包括:
<IfModule security2_module>
SecUploadDir /var/asl/data/suspicious
SecDataDir /var/asl/data/msa
SecTmpDir /tmp
SecAuditLogStorageDir /var/asl/data/audit
Include modsecurity.d/modsecurity_crs_10_config.conf
Include modsecurity.d/activated_rules/*.conf
SecRuleEngine On
# Debug log
SecDebugLog /var/log/apache2/modsec_debug.log
SecDebugLogLevel …Run Code Online (Sandbox Code Playgroud) 在 ModSecurity 中有PCRE limits exceeded错误。
我知道我可以通过设置规则来解决这个问题,例如:
SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000
Run Code Online (Sandbox Code Playgroud)
但是,这些规则实际上在做什么?PCRE 限制递归设置为 150,000 是什么意思?通过将这些设置得如此高,我允许通过哪些安全漏洞?什么是recursion和limit是什么意思?
我知道有文档,但文档实际上并没有告诉我发生了什么,它只是告诉我如何使用指令。
我有一个 RESTful Web 服务,它接受对没有实体主体的资源的 POST 请求,例如空的 POST 请求。默认的 modsecurity 配置要求所有 POST 请求都具有 Content-Length:
# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
Run Code Online (Sandbox Code Playgroud)
modsecurity 控制台将此报告为 PROTOCOL_VIOLATION/EVASION。但是,在阅读HTTP/1.1 RFC 时,我不认为这是真的。允许服务器要求 Content-Length(返回 400 或 411),但我看不到任何内容表明服务器必须(或建议它应该)以这种方式运行。
这可能因浏览器而异,但在没有实体主体的情况下发出 POST 请求的 Flash 客户端不会发送请求标头。当你做'curl -XPOST ...'时也不会卷曲。由于这些原因,并且因为我认为 modsecurity 规则是对 HTTP 规范的误解,我正在考虑在我们的配置中取消对 POST 请求的 Content-Length 标头的要求。
有谁知道是否有特定的漏洞利用此规则来解决?大量的谷歌搜索,我只发现这是库存 modsecurity 配置的一部分。
经过一些调试,我发现 mod_security 的核心规则集会阻止没有(可选!)ACCEPT 标头字段的请求。
这是我在日志中找到的内容:
ModSecurity:警告。需要匹配“rx ^OPTIONS$”与“REQUEST_METHOD”。[文件“/etc/apache2/conf.d/modsecurity/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受头”] [严重性“关键”] [标签“ PROTOCOL_VIOLATION/MISSING_HEADER"] [主机名 "example.com"] [uri "/"] [unique_id "T4F5@H8AAQEAAFU6aPEAAAAL"]
ModSecurity:访问被拒绝,代码为 400(第 2 阶段)。需要匹配“rx ^OPTIONS$”与“REQUEST_METHOD”。[文件“/etc/apache2/conf.d/modsecurity/optional_rules/modsecurity_crs_21_protocol_anomalies.conf”] [行“41”] [id“960015”] [msg“请求缺少接受头”] [严重性“
为什么需要这个标题?我知道“大多数”客户发送这些,但为什么他们的缺席被视为安全威胁?
我第一次在我的登台服务器上运行它,我认为我做的一切都是正确的。当我针对它运行 nikto2 时,我可以在 modsec_audit.log 中看到条目,但在我的一生中,我无法手动使 mod_security 阻止任何内容。我已经将 SQL 放入 URL、表单等中,我刚刚得到了我们典型的用户友好的 HTML 404 页面,而不是来自 mod_security 的块,这应该是 403 错误或完全块。
我担心它只是检测而不是停止。我检查了我的配置,它肯定会阻止攻击,而不仅仅是检测它们。关于如何验证这件事实际上阻止攻击的任何想法?任何人都有测试 URL 或我可以做的事情来向我证明它确实有效?
我目前有一个 CentOS 系统,它成功地将相关的 mod_security 操作记录到审计日志文件中。以下是我的配置:
<IfModule mod_security2.c>
SecRuleEngine On
SecAuditEngine RelevantOnly
SecAuditLog /var/log/httpd/modsec_audit.log
SecDebugLog /var/log/httpd/modsec_debug.log
SecDebugLogLevel 0
SecRequestBodyAccess On
SecDataDir /tmp
SecTmpDir /tmp
SecPcreMatchLimit 250000
SecPcreMatchLimitRecursion 250000
</IfModule>
Run Code Online (Sandbox Code Playgroud)
这会记录 mod_security 由于SecAuditEngine RelevantOnly设置而拦截/阻止请求的所有操作。
但是,我希望它另外记录提交到服务器的所有 POST 数据(无论状态如何)。我可以通过设置来实现这一点,SecAuditEngine On但这会记录所有的 GET 和 POST 数据,这太过分了。除非请求被拦截,否则我基本上想省略所有 GET 数据。
谁能建议如何做到这一点?
我看过官方网站的文档,找到起点有点困难。
对于从未处理过 mod_security 的人来说,是否有易于理解的免费综合指南?
我已将 modsecurity.conf 中的 SecAuditLogParts 设置为仅记录 ABFH,但 modsecurity 审计日志不断记录 -E- 部分(响应正文),这使得审计日志过大。
我该怎么做才能禁用响应正文日志记录?
mod-security ×10
apache-2.2 ×6
http ×3
pcre ×2
bittorrent ×1
centos ×1
httpd ×1
regex ×1
security ×1