安全攻防 / 运维笔记

Fail2ban防止WordPress受到xmlrpc.php CC攻击

Einic Yeo · 3月23日 · 2019年 · ·

WordPress本身是一个非常强大的CMS(内容管理系统),功能强大。但是也正是因为其强大的特性,使其很容易被利用,造成服务器的不稳定甚至崩溃。最容易遭受攻击的就是xmlrpc.php这个文件,攻击者只要每秒发送1个post请求到此文件,不出1分钟,一台512M内存Linux系统的VPS就会崩溃,php进程和Mysql占用内存过高而导致无法访问。在尝试了网上流传的多个防攻击手段之后,fail2ban是效果最好的一个,下面就简单记录一下过程,供大家参考:

分析日志

在服务器出现异常的时候,首先去分析Nginx日志, /data/wwwlogs/infvie.com_access.log ,从代码中可以发现如下可以IP不断发送Post请求到xmlrpc.php,每个IP的发送频率大概在2秒钟一次,严格来说频率并不高但足以让php和mysql进程崩溃。

185.188.204.16 - - [15/March/2019:23:51:07 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.6 - - [15/March/2019:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.8 - - [15/March/2019:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.14 - - [15/March/2019:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.16 - - [15/March/2019:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.7 - - [15/March/2019:23:51:08 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.12 - - [15/March/2019:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 499 0 "-" "*****"
185.188.204.11 - - [15/March/2019:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.15 - - [15/March/2019:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"
185.188.204.11 - - [15/March/2019:23:51:09 -0400] "POST /xmlrpc.php HTTP/1.0" 502 574 "-" "*****"

安装fail2ban和iptables

安装fail2ban和iptable版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!s,这样能使用ipotables对攻击进行防御,想对于其它js和php的防御方式自动化更高,更为高效。

#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban iptables

安装完成后,服务配置目录为:/etc/fail2ban
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/rc.d/init.d/fail2ban #启动脚本文件

自定义j版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!ail.local

使用jail.local设定,覆盖默认配置

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[DEFAULT] #全局设置
ignoreip = 127.0.0.1 #忽略的IP列表,多个IP以空格分割或IP段127.0.0.1/8不受设置限制(白名单)
bantime = 600 #屏蔽时间,单位:秒
findtime = 600 #这个时间段内超过规定次数会被ban掉
maxretry = 3 #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)
[xmlrpc]
enabled = true
Port  = http,https
filter = xmlrpc
action = iptables-multiport[name=xmlrpc, protocol=tcp]
sendmail-whois[name=xmlrpc, dest=root, [email protected]]
logpath = /data/wwwlogs/infvie.com_access.log
bantime = 43600
maxretry = 2
findtime  = 20

自定义filter规则

vi /etc/fail2ban/filter.d/xmlrpc.conf
[Definition]
failregex = ^<HOST> .*POST .*xmlrpc\.php.*
ignoreregex =

修改action规则

cat /etc/fail2ban/action.d/iptables-blocktype.local | grep --color --color -v ^# | less 

[INCLUDES]
after = iptables-blocktype.local
port = 80,443
protocol =tcp
[Init]
returntype = RETURN
lockingopt = -w
iptables = iptables <lockingopt>
blocktype = DROP

fail2ban 重启验证

service fail2ban restart
查看iptables规则是否生效 
iptables -nL --line-number(注意查看f2b-模块名nginx所在行)

查看fail2ban日志查看防御情况

tail -f /var/log/fail2ban.log
2019-03-15 23:51:45,350 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.8
2019-03-15 23:51:45,361 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.9
2019-03-15 23:51:45,368 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.6
2019-03-15 23:51:45,376 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.7
2019-03-15 23:51:45,382 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.16
2019-03-15 23:51:45,387 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.14
2019-03-15 23:51:45,392 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.15
2019-03-15 23:51:45,400 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.12
2019-03-15 23:51:45,415 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.10
2019-03-15 23:51:45,426 fail2ban.actions: WARNING [xmlrpc] Ban 185.188.204.11
# 以上日志则显示成功防御对xmlrpc进行攻击的IP等情况

常用命令

查看黑名单状态
fail2ban-client status xmlrpc(模块名)
黑名单移除IP
fail2ban-client set xmlrpc unbanip IP地址
过滤规则检查
fail2ban-regex 日志文件.log 规则文件../filter.d/xmlrpc.conf

防火墙规则查看与清理
iptables -nL --line-number(注意查看f2b-模块名xmlrpc所在行)
iptables -D f2b-xmlrpc num(-D清理 防火墙模块名 编号)

注:

1.重启iptables 后需要重启fail2ban ,以此重新加载fail2版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!ban黑名单规则到iptables,不然iptables规则为空;

2.原理:匹配到规则后先将IP加入黑名单—-再加入防火墙规则中;若防火墙规则已经删除,未清理黑名单,再次触发则不会加入防火墙

参考文献

https://github.com/fail2ban/fail2ban
https:版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!//www.fail2ban.org/
http:/版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!/ https://rbgeek.wordpress.com/2014/09/11/block-wordpress-xmlprc-php-ddos-attacks-using-fail2ban/

0 条回应