WordPress站点垃圾邮件未触发wp_mail钩子 如何记录msmtp执行日志
问题根因
你碰到的钩子不触发的核心原因是:这些垃圾邮件根本没有走WordPress原生的邮件发送流程,你日志里高频请求的/wp-content/plugins/google-site-kit/third-party/google/apiclient-services/src/Google/Service/Pagespeedonline/Resource/table.php是攻击者上传的webshell,该脚本直接调用系统msmtp命令发送邮件,没有加载WordPress核心,自然无法触发phpmailer_init、wp_mail这类WP原生钩子。
msmtp执行情况记录方案
方案1:修改msmtp原生配置输出日志
编辑全局msmtp配置文件/etc/msmtprc,追加以下配置即可开启原生日志记录,日志会包含发件人、收件人、邮件发送结果、服务器返回信息等内容:
执行以下命令创建日志目录并配置权限:# 日志存储路径,需提前创建目录并给www-data读写权限 logfile /var/log/msmtp/msmtp.log # 同时输出到系统syslog syslog LOG_MAIL # 记录邮件头信息 from_header onmkdir -p /var/log/msmtp chown www-data:www-data /var/log/msmtp chmod 750 /var/log/msmtp方案2:使用wrapper脚本记录全量调用信息
要获取调用msmtp的进程、来源IP、请求路径等溯源信息,可以替换msmtp二进制为自定义包装脚本:- 重命名原msmtp二进制文件:
mv /usr/bin/msmtp /usr/bin/msmtp.orig - 新建
/usr/bin/msmtp脚本,内容如下:#!/bin/bash LOG_PATH="/var/log/msmtp/exec.log" MAIL_CONTENT_LOG="/var/log/msmtp/mail.log" # 记录基础调用信息 echo "===== $(date '+%Y-%m-%d %H:%M:%S') =====" >> $LOG_PATH echo "调用UID: $UID" >> $LOG_PATH echo "父进程ID: $PPID" >> $LOG_PATH echo "当前工作目录: $(pwd)" >> $LOG_PATH echo "调用参数: $*" >> $LOG_PATH # 提取当前请求的IP、URI、UA等信息 cat /proc/$PPID/environ | tr '\0' '\n' | grep -E "REMOTE_ADDR|REQUEST_URI|HTTP_USER_AGENT" >> $LOG_PATH echo -e "\n" >> $LOG_PATH # 可选:记录完整邮件内容 cat - | tee -a $MAIL_CONTENT_LOG | /usr/bin/msmtp.orig "$@" - 给脚本加执行权限:
chmod +x /usr/bin/msmtp
- 重命名原msmtp二进制文件:
方案3:用auditd审计所有msmtp调用
安装auditd后添加监控规则,可持久化记录所有msmtp的执行行为:
后续需要查询时执行apt install auditd auditctl -a exit,always -F path=/usr/bin/msmtp -F perm=x -k msmtp_execausearch -k msmtp_exec即可调出所有调用记录。
紧急修复建议
你当前的入侵特征非常明确,先做以下操作止损:
- 直接删除
/wp-content/plugins/google-site-kit/third-party/google/apiclient-services/src/Google/Service/Pagespeedonline/Resource/table.php这个恶意文件 - 下载对应版本的google-site-kit官方插件包,全量对比插件目录,清除所有篡改、新增的异常文件
- Nginx配置层禁止插件目录下PHP文件执行,添加规则:
若有插件确实需要执行PHP,单独给对应路径加白名单即可location ~* ^/wp-content/plugins/.*\.php$ { deny all; } - 全站点扫描webshell,升级所有插件、主题、WordPress核心到最新版本
内容的提问来源于stack exchange,提问作者controlol
相关产品推荐
相关产品推荐

