构建ModSecurity与DVWA的Web应用防火墙实验环境

本文详细介绍了如何在Debian系统上搭建包含ModSecurity和DVWA的实验环境,包括安装配置Apache、ModSecurity规则集、处理日志警告及自定义规则排除干扰项,适合网络安全学习者实践。

设置包含ModSecurity、Apache和DVWA的实验室

我一直想搭建一个ModSecurity实验室,趁着有空,决定动手实现并记录下来与大家分享。

我构建的实验室使用了最新版本的ModSecurity,规则集来自SpiderLabs的GitHub仓库,并包含了DVWA(Damn Vulnerable Web Application)作为攻击目标。

这是我第一次安装ModSecurity,可能不够完美,但基于我阅读的指南,它应该能正常工作,并且接近非专家管理员采用默认安装的服务器配置。

实验室建立在Debian testing(jessie)服务器上。最初我选择了稳定版(wheezy),但发现其ModSecurity版本较旧,无法与当前规则集兼容。因此,你需要一个可运行的jessie安装。我全新安装时,在软件选择部分只选了标准包和SSH服务器,未选Web服务器,因为我喜欢自己配置。

安装完成后,需要安装以下基本包:

1
apt-get install apache2 php5 mysql-server libapache2-modsecurity git php5-mysql

我还添加了vim、screen和sudo,这些不是必需的,但很好用。

开始配置。首先,安装默认的ModSecurity配置文件:

1
2
cd /etc/modsecurity/
cp modsecurity.conf-recommended modsecurity.conf

接下来,需要核心规则集(CRS)。Debian包自带一份,但我选择从SpiderLabs GitHub仓库获取,这样可以轻松更新到最新规则。

在modsecurity目录中克隆仓库:

1
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs

现在需要配置。首先,启用初始配置文件:

1
2
cd owasp-modsecurity-crs/
cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

这打开了配置文件,但尚未实际使用。CRS包含五个规则目录:

  • base_rules
  • experimental_rules
  • optional_rules
  • slr_rules
  • activated_rules

前四个包含实际规则,activated_rules是你选择运行的规则存放处,类似于Debian Apache的sites-available和sites-enabled系统。

要启用规则,需要从它们的存放位置创建符号链接到activated_rules目录,并添加主配置文件。

1
2
3
4
cd activated_rules/
ln -s ../modsecurity_crs_10_setup.conf .
ln -s ../base_rules/* .
ln -s ../optional_rules/* .

大多数示例使用for循环,但通配符也可以。如果失败,可以使用:

1
2
3
cd ..
for f in `ls base_rules/` ; do sudo ln -s /etc/modsecurity/owasp-modsecurity-crs/base_rules/$f activated_rules/$f ; done
for f in `ls optional_rules/ | grep comment_spam` ; do sudo ln -s /etc/modsecurity/owasp-modsecurity-crs/optional_rules/$f activated_rules/$f ; done

现在,activated_rules目录应充满指向base_rules和optional_rules文件的符号链接。你也可以链接其他两个规则目录,但我遵循指南,认为这是大多数服务器的配置。

即使做了这些,Apache尚未承认任何内容,因为未主动包含在配置中。需要使用Include语句包含active_rules目录。

当前,ModSecurity配置文件/etc/apache2/mods-enabled/security2.conf包含以下行:

1
IncludeOptional /etc/modsecurity/*.conf

你可以在此添加另一行来包含activated_rules目录,但由于文件可能在包升级时更新,这不是好主意。相反,我在开始时创建的modsecurity.conf文件中添加了包含。

需要添加的行:

1
Include /etc/modsecurity/owasp-modsecurity-crs/activated_rules/*conf

同时添加以下行:

1
SecDisableBackendCompression On

没有它,日志文件创建时,压缩的请求会记录为压缩数据,使文件不可读。

最后需要启用Apache的headers模块,允许ModSecurity控制和修改HTTP请求和响应头。

1
a2enmod headers

现在重启Apache,应该有一个正常工作的安装。

1
service apache2 restart

测试

查看配置是否生效,开始跟踪日志文件:

1
tail -f /var/log/apache2/modsec_audit.log

通过IP浏览站点,应该看到类似以下条目:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
--d5274346-H--
Message: Warning. Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/etc/modsecurity/owasp-modsecurity-crs/activated_rules/modsecurity_crs_21_protocol_anomalies.conf"] [line "98"] [id "960017"] [rev "2"] [msg "Host header is a numeric IP address"] [data "192.168.0.68"] [severity "WARNING"] [ver "OWASP_CRS/2.2.8"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [tag "http://technet.microsoft.com/en-us/magazine/2005.01.hackerbasher.aspx"]
Message: Warning. Pattern match "^(?i:0|allow)$" at RESPONSE_HEADERS. [file "/etc/modsecurity/owasp-modsecurity-crs/activated_rules/modsecurity_crs_55_application_defects.conf"] [line "151"] [id "981405"] [msg "AppDefect: X-FRAME-OPTIONS Response Header is Missing or not set to Deny."] [data "X-FRAME-OPTIONS: "] [tag "WASCTC/WASC-15"] [tag "MISCONFIGURATION"] [tag "http://websecuritytool.codeplex.com/wikipage?title=Checks#http-header-x-frame-options"]
Message: Warning. Operator LT matched 5 at TX:inbound_anomaly_score. [file "/etc/modsecurity/owasp-modsecurity-crs/activated_rules/modsecurity_crs_60_correlation.conf"] [line "33"] [id "981203"] [msg "Inbound Anomaly Score (Total Inbound Score: 3, SQLi=0, XSS=0): Host header is a numeric IP address"]
Stopwatch: 1376483251361382 39821 (- - -)
Stopwatch2: 1376483251361382 39821; combined=26192, p1=477, p2=24676, p3=85, p4=400, p5=437, sr=135, sw=117, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.4 (http://www.modsecurity.org/); OWASP_CRS/2.2.8.
Server: Apache/2.4.6 (Debian)
Engine-Mode: "DETECTION_ONLY"
--d5274346-Z--

以及其他调试信息,这里有三个消息,每个以Message:开头。第一个和最后一个评论了通过IP访问站点的事实,中间一个指出没有设置X-FRAME-OPTIONS值。

如果你主要通过IP访问实验室,这可能变得烦人并堵塞日志文件,因此可以禁用规则。最简单的方法是从原始规则文件中删除它们,消息告诉你哪个文件包含规则:

1
[file "/etc/modsecurity/owasp-modsecurity-crs/activated_rules/modsecurity_crs_55_application_defects.conf"]

以及规则所在的行:

1
[line "151"]

你可以进去删除或注释掉该规则。但这样做的问题是,如果通过git pull升级规则,你不会获得该文件的最新版本,因为修改了本地副本。更好的方法是创建自己的规则文件来覆盖不喜欢的规则。需要知道要删除规则的id,也包含在日志文件中,对于第一个条目是:

1
[id "960017"]

为此,首先需要创建一个目录来存储自定义规则和一个文件来放置它们:

1
2
cd /etc/modsecurity/owasp-modsecurity-crs
mkdir custom_rules

规则文件的名称需要确保在activated_rules目录中按字母顺序最后被选取。当前目录中最后一个文件是modsecurity_crs_60_correlation.conf,因此将我们的文件命名为modsecurity_crs_99_custom.conf确保有足够的空间。

编辑文件:

1
vi custom_rules/modsecurity_crs_99_custom.conf

添加以下行:

1
SecRuleRemoveById 960017

然后将其链接到actived_rules目录:

1
2
cd activated_rules
ln -s ../custom_rules/modsecurity_crs_99_custom.conf .

现在重启Apache,跟踪日志文件并再次访问页面,消息应该不再出现。

我发现需要完全刷新页面来检查是否正常工作,因为返回304的刷新有时不会触发传感器。

通过向此自定义文件添加条目,可以禁用任何干扰测试的规则,我将在DVWA安装后建议更多。

DVWA

安装DVWA相当简单,从GitHub仓库获取文件,设置数据库连接详细信息,然后浏览并让它创建所需的数据库条目。

1
2
3
4
5
cd /var
rm -rf www/
git clone https://github.com/RandomStorm/DVWA.git www
cd www
vi config/config.inc.php

设置凭据后,浏览站点,应该看到DVWA欢迎屏幕,告诉你数据库不存在。按照其演练,它会为你设置一切。

一切设置好后,只需单击菜单链接之一,就会转到登录页面。使用凭据admin:password登录并开始黑客攻击。观看ModSecurity日志,看看你会在多少地方被捕获——提示,可能很多!

你可能会在日志中看到很多以下消息:

1
2
Message: Warning. Pattern match "^(?i:0|allow)$" at RESPONSE_HEADERS. [file "/etc/modsecurity/owasp-modsecurity-crs-git/activated_rules/modsecurity_crs_55_application_defects.conf"] [line "151"] [id "981405"] [msg "AppDefect: X-FRAME-OPTIONS Response Header is Missing or not set to Deny."] [data "X-FRAME-OPTIONS: "] [tag "WASCTC/WASC-15"] [tag "MISCONFIGURATION"] [tag "http://websecuritytool.codeplex.com/wikipage?title=Checks#http-header-x-frame-options"]
Message: Warning. Match of "contains no-store" against "RESPONSE_HEADERS:Cache-Control" required. [file "/etc/modsecurity/owasp-modsecurity-crs/activated_rules/modsecurity_crs_55_application_defects.conf"] [line "121"] [id "900046"] [msg "AppDefect: Cache-Control Response Header Missing 'no-store' flag."] [data "Cache-Control: no-cache, must-revalidate"] [tag "WASCTC/WASC-15"] [tag "MISCONFIGURATION"] [tag "http://websecuritytool.codeplex.com/wikipage?title=Checks#http-cache-control-header-no-store"]

与通过IP地址检测一样,这些是实验室环境中无需担心的消息,可以通过将它们的ID添加到自定义文件来禁用:

1
2
SecRuleRemoveById 900046
SecRuleRemoveById 981054

重启Apache,就这样,你现在有一个实验室,包含故意易受攻击的Web应用程序,但有一个非常好的Web应用程序防火墙保护它。

最后一件事,默认情况下,ModSecurity只报告问题,不阻止它们。如果想启用阻止,需要编辑主配置文件/etc/modsecurity/modsecurity.conf并更改SecRuleEngine条目。有效选项是On、Off和DetectionOnly(仅记录)。这将启用对坏请求的阻止:

1
SecRuleEngine On

结论

这篇博客是我在学习设置过程中编写的,可能不包含最佳实践方式,肯定不足以设置生产环境,但应该至少给你一个起点。

快乐黑客攻击,记住,如果你找到绕过任何规则的方法,ModSecurity或SpiderLabs团队可能会非常感兴趣听到你是怎么做的。

链接

以下链接帮助我完成了这篇博客文章:

如果你没有时间通过所有这些来构建实验室,或者想要第二个,OWASP Broken Web Applications Project是一个VM,包含许多易受攻击的应用程序,也运行ModSecurity。

感谢BruCON

创建这个项目的时间由BruCON 5x5奖项慷慨赞助。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计