设置包含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请求和响应头。
现在重启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"]
|
以及规则所在的行:
你可以进去删除或注释掉该规则。但这样做的问题是,如果通过git pull升级规则,你不会获得该文件的最新版本,因为修改了本地副本。更好的方法是创建自己的规则文件来覆盖不喜欢的规则。需要知道要删除规则的id,也包含在日志文件中,对于第一个条目是:
为此,首先需要创建一个目录来存储自定义规则和一个文件来放置它们:
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(仅记录)。这将启用对坏请求的阻止:
结论
这篇博客是我在学习设置过程中编写的,可能不包含最佳实践方式,肯定不足以设置生产环境,但应该至少给你一个起点。
快乐黑客攻击,记住,如果你找到绕过任何规则的方法,ModSecurity或SpiderLabs团队可能会非常感兴趣听到你是怎么做的。
链接
以下链接帮助我完成了这篇博客文章:
如果你没有时间通过所有这些来构建实验室,或者想要第二个,OWASP Broken Web Applications Project是一个VM,包含许多易受攻击的应用程序,也运行ModSecurity。
感谢BruCON
创建这个项目的时间由BruCON 5x5奖项慷慨赞助。