研究所搬家后运行了一段时间,日常维护时发现了几个异常文件,文件名很可疑且上传时间博主并不在使用主机。直觉研究所被攻击者恶意植入了文件,赶紧暂停网站分析情况。
1. 检查被攻击痕迹
一眼定位到的是陌生的bypo.php和byp.php,代码段里打开发现有“bypass”的字样和github下载链接,判断网站被植入后门。
1.1 隔离
马上隔离环境并封存现文件夹。将被攻击的网站文件夹整块移动到web环境之外的目录下,并锁定权限为只有root账号能看。
// 创建文件夹存放旧站点
mkdir -p /root/forensic/
// 迁移旧站点并限制权限
mv /www/wwwroot/old_site /root/forensic/old_site_backup
chmod 000 -R /root/forensic/old_site_backup
1.2 溯源
移动到迁移后的文件目录,从首先在意到的文件查起,看到bypo.php上传的时间。往前再推几天检索有修改的文件。
// 调查bypo.php的时间
stat bypo.php
// 检索7天内有编辑或添加记录的文件
find -type f -mtime -7 -printf "%T+ %p\n" | sort | more
证据显示在上传bypo.php之前,最先被修改的文件是wordpress/wp-config.php。下一步,在/wordpress/wp-content/plugins/目录上传了一个wp-file-manager插件。经过搜索,这个插件有过知名漏洞(CVE-2020-25213),可以用来上传文件,例如这次攻击的后门文件。
接下来的时间,攻击者利用已上传的存在已知漏洞的插件进一步上传恶意文件。byp.php可以实现安装一个Web控制面板,获取服务器文件;同目录上传的index.php是另一个带认证功能的文件上传器。
简要概括一下,这次攻击属于自动化路径扫描的攻击,攻击者利用了未清理的/wordpress/目录作为突破口。首先攻击者篡改了配置文件wp-config.php获取初步执行权,后上传或写入了WP File Manager 插件,利用已知漏洞进行后门文件的上传。由于博主及时发现并封锁权限,攻击者还没有完成向主站数据库或其它文件的横向渗透。
2. 全新环境重新搭建
溯源部分看了个大概,毕竟不用真的出一份分析报告,确认存在恶意行为即可。因为陌生文件较多且杂乱,手动删除有遗留隐藏后门的风险,把原网站的关键数据存下来开全新的纯净版更安全。
2.1 迁移
uploads
检查文件夹和图片,编辑时间没有最近的,都是之前的博客内上传文件。直接打包导出,到新网站文件目录下上传。保险起见确认文件夹内没有被上传可疑php文件:
find /wp-content/uploads/ -type f -name "*.php"
数据库
为防止攻击者篡改部分内容或添加账号,只导出部分关键表。在phpMyAdmin页面勾选下列表:
wp_posts(文章与页面)wp_postmeta(文章元数据)wp_comments(评论)wp_commentmeta(评论元数据)wp_terms(分类/标签名)wp_term_taxonomy(分类说明)wp_term_relationships(文章与分类的对应关系)
勾选完成后点击导出,在Object creation options编辑自定义设置:Add statements下打开Add DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER statement这一项,确保在导入到新库表时先删除原有的同名表,然后填入旧数据。
确认表前缀相同(wordpress一般自带都是wp_,也可编辑成相同的自定义前缀),点击底部的Export按钮下载sql文件。
WordPress
后续的步骤和服务器上新建网站流程相同,上传网站的uploads文件夹、数据库、主题后访问网站,可以恢复正常的访问了。
2.2 加固
网站恢复运行了,开始根据原始配置查漏补缺。下面将针对这次攻击对网站进行加固。
wp-config.php
在 /* That's all, stop editing! Happy publishing. */ 这一行的上方粘贴以下代码:
// 禁止后台编辑主题和插件代码
define('DISALLOW_FILE_EDIT', true);
// 强制后台页面使用SSL
define('FORCE_SSL_ADMIN', true);
// 禁止后台安装插件和主题(调试期间需要手动改为flase)
define('DISALLOW_FILE_MODS', true);
// 禁止网页显示具体报错
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);
ini_set('display_errors', 0);
目录权限
为降低因权限过大导致的安全风险,修改网站目录下的文件权限符合安全需要:
// 所有目录设置为所有者读写执行,其它可读可进入
find /www/wwwroot/site.com -type d -exec chmod 755 {} \;
// 所有文件设置为所有者读写,其它可读可进入
find /www/wwwroot/site.com -type f -exec chmod 644 {} \;
//wp-config.php设为只读
chmod 440 /www/wwwroot/site.com/wp-config.php
Nginx
Nginx安全增强配置,在网站设置config的server部分直接编辑:
// 禁止在wp-content目录执行PHP
location ~* /wp-content/.*\.php$ { deny all; }
// 禁用xmlrpc.php
location = /xmlrpc.php { deny all; }
// 禁止访问敏感文件
location ~* /\.(env|git|htaccess|ini|log|sh|sql|bak|old|txt)$ { deny all; }
隐藏登录地址
在日志里还看到了针对登录页面的扫描,简单直接的防护方法:安装并启用WPS Hide Login插件。插件功能为隐藏默认的 WordPress 登录页面路径(/wp-login.php),并将其替换为自定义 URL,访问原登录页面会返回404页面。
删除多余文件
网站遭到恶意攻击的源头是解压后未删除的WordPress官方安装包,因为默认内容和未添加安全配置,攻击者很容易扫到目录并利用已知漏洞进行攻击。
现网站部署结束后检查一遍文件目录,把默认安装包删除,不用的插件和主题也删除,现状态留存备份或快照。
3. 后话
好久没写过那么长的文章了(博主吐槽:完全是好久没写过文章了),上线维护完成后边查边写了几天。年初的研究所搬家也是因为类似的原因,写这篇的重点是记录一下迁移和加固的步骤,有空把恶意文件拿出来单独分析写一篇(一般这么说可能要等很久了)。
ฅ(Slack有话要喵)ฅ
研究所修了好久的围栏,久得本喵都要在新找到的角落纸盒里睡着了喵
COMMENTS | NOTHING