被挂webshell
凌晨两点,被挂手机在床头柜上震了三下。被挂我翻了个身没理,被挂接着又震了五下。被挂做运维的被挂朋友都知道,这个点连续来电,被挂不是被挂机房断电就是被入侵了。
“老张,被挂你那个客户站点被挂webshell了。被挂”电话那头是被挂安全组的老陈,声音哑得像砂纸磨铁皮,被挂“我扫了一下,被挂至少三个变种,被挂还有一个是被挂内存马。”
我打开电脑连上VPN,被挂登录那台CentOS 7的服务器。第一眼看到的是/www/wwwroot/xxx.com/upload/目录下多了个叫1.php的文件,创建时间显示为三天前。用cat看了一眼,内容是一行经过base64编码的PHP代码,解码后是典型的一句话木马:@eval($_POST['cmd']);。文件权限是644,属主是www,跟正常上传的图片混在一起,肉眼不仔细翻根本发现不了。
这还没完。老陈说的内存马才是麻烦事。它不落地文件,直接注入到PHP-FPM进程里,重启服务都杀不掉,除非重启整个服务器。我查了ps aux,果然有个异常进程,CPU占用不高,但网络连接里有一条持续向境外IP发送心跳的TCP长连接。那个IP归属地显示是荷兰。
怎么进来的?我翻了一遍Nginx的access.log,很快找到了入口。三天前凌晨四点零七分,有一个来自越南IP的POST请求打到了/upload.php,上传了一个伪装成JPG的文件。上传接口的校验只检查了Content-Type,没验证文件头。攻击者把PHP代码写在了图片的EXIF注释里,然后配合另一个本地文件包含漏洞执行了它。
两个漏洞叠加,一个上传绕过加一个LFI,就这么简单。
清理过程比想象中恶心。那个内存马每隔十秒会检测一次自身是否还在运行,如果发现被kill了,它会从远程拉取新的payload重新注入。我先用strace跟了一下它的系统调用,找到了它用来存储配置的临时文件/tmp/.ICE-unix/.cache,一个隐藏得很深的目录。删掉这个文件,再kill掉进程,才彻底断掉它的复活链。
但数据已经被拖走了。数据库里多了一个叫_backup_2024的表,里面是用户表的完整导出,包括手机号和密码哈希。攻击者还留了一个后门管理员账号,用户名是admin_,权限拉满。我删掉这个账号的时候,后台日志显示它已经登录过两次。
事后复盘,问题出在三个地方。第一,上传接口的校验逻辑写得太糙,只信Content-Type。第二,服务器上装了两个CMS,一个三年没更新,另一个是开发自己写的,连基本的输入过滤都没有。第三,PHP-FPM以root权限运行,内存马直接拿到了最高权限。
我见过太多这种案例了。很多人觉得webshell离自己很远,觉得小站没人盯。但自动化扫描工具每天在互联网上跑几十亿次请求,你的IP只要暴露过,就会被记录。攻击者不挑目标,他们只挑漏洞。一个未修补的组件、一个偷懒的校验函数、一个权限过高的服务进程,任意一个都能成为入口。
那天晚上我干到早上七点。清理完webshell,打了补丁,把PHP-FPM降权到www用户,又加了一层WAF规则。临走前看了一眼监控面板,那个荷兰IP还在尝试连接,每三十秒一次,持续了整整两个小时才停。
它知道后门没了,但它不在乎。它只是在等下一个机会。
相关文章:
