问题
我认为我的服务器被用来通过 sendmail 发送垃圾邮件,我收到很多排队的我不认识的邮件,而且我的 mail.log 和 syslog 变得越来越大。
我已经关闭了 sendmail,所以没有任何邮件发出去,但我无法弄清楚它是从哪里来的。
迄今为止的调查:
其目的是从添加邮件的任何地方添加标题并将所有邮件记录到文件中,因此我在 php.ini 文件中更改了以下几行:
mail.add_x_header = On
mail.log = /var/log/phpmail.log
但 phpmail.log 中没有出现任何内容。
我在这里使用命令来调查所有用户的 cron 任务都运行正常,但一切正常。唯一运行的 cron 任务是网站的 cron 任务。
然后我调出了过去 30 天内修改过的所有 php 文件,但没有一个看起来可疑。
我还能做什么来找出问题的根源?
Mail.log 报告
再次打开 sendmail。以下是报告的一小部分样本:
Jun 10 14:40:30 ubuntu12 sm-mta[13684]: s5ADeQdp013684: from=<>, size=2431, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
Jun 10 14:40:30 ubuntu12 sm-msp-queue[13674]: s5ACK1cC011438: to=www-data, delay=01:20:14, xdelay=00:00:00, mailer=relay, pri=571670, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (s5ADeQdp013684 Message accepted for delivery)
Jun 10 14:40:30 ubuntu12 sm-mta[13719]: s5ADeQdp013684: to=<[email protected]>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=32683, dsn=2.0.0, stat=Sent
Jun 10 14:40:30 ubuntu12 sm-mta[13684]: s5ADeQdr013684: from=<[email protected]>, size=677, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
Jun 10 14:40:31 ubuntu12 sm-msp-queue[13674]: s5AC0gpi011125: to=www-data, ctladdr=www-data (33/33), delay=01:39:49, xdelay=00:00:01, mailer=relay, pri=660349, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (s5ADeQdr013684 Message accepted for delivery)
Jun 10 14:40:31 ubuntu12 sm-mta[13721]: s5ADeQdr013684: to=<[email protected]>, ctladdr=<[email protected]> (33/33), delay=00:00:01, xdelay=00:00:00, mailer=local, pri=30946, dsn=2.0.0, stat=Sent
Jun 10 14:40:31 ubuntu12 sm-mta[13684]: s5ADeQdt013684: from=<[email protected]>, size=677, class=0, nrcpts=1, msgid=<[email protected]>, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
Jun 10 14:40:31 ubuntu12 sm-msp-queue[13674]: s5ACF2Nq011240: to=www-data, ctladdr=www-data (33/33), delay=01:25:29, xdelay=00:00:00, mailer=relay, pri=660349, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (s5ADeQdt013684 Message accepted for delivery)
Jun 10 14:40:31 ubuntu12 sm-mta[13723]: s5ADeQdt013684: to=<[email protected]>, ctladdr=<[email protected]> (33/33), delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30946, dsn=2.0.0, stat=Sent
Ju
进一步的调查
发现过去一天注册了 4 个垃圾账户,这些账户很可疑,但它们都具有正常的用户权限。
网站上没有联系表格,但有许多表格,它们可以接受过滤文本输入或纯文本输入。
由于网站已切换到维护模式,除管理员外,其他人都无法登录,因此邮件仍然在排队。
好的,经过进一步调查,电子邮件似乎是由我网站的 cron 发送的,它每 5 分钟运行一次。但是,我设置的 cron 作业没有每小时运行一次以上,也没有显示在网站日志中,所以大概有人设法以某种方式编辑了我的 cron。
问题结束:
事实证明,这大部分都是我的无知。Cron 在运行时会尝试发送电子邮件。由于 cron 由 www-data 运行,因此它尝试将其发送到 www-data。地址很奇怪,因为我从未更改过服务器默认的 dnshostname,出于某种奇怪的原因,默认的 dnshostname 是 pcsmarthosting.co.uk。(很奇怪,因为它与我的主机完全无关。)
我发现 www-data 的默认地址格式是 hostname@dnshostname。
电子邮件副本:
V8
T1402410301
K1402411201
N2
P120349
I253/1/369045
MDeferred: Connection refused by [127.0.0.1]
Fbs
$_www-data@localhost
${daemon_flags}c u
Swww-data
[email protected]
MDeferred: Connection refused by [127.0.0.1]
C:www-data
rRFC822; [email protected]
RPFD:www-data
H?P?Return-Path: <�g>
H??Received: (from www-data@localhost)
by ubuntu12.pcsmarthosting.co.uk (8.14.4/8.14.4/Submit) id s5AEP13T015507
for www-data; Tue, 10 Jun 2014 15:25:01 +0100
H?D?Date: Tue, 10 Jun 2014 15:25:01 +0100
H?x?Full-Name: CronDaemon
H?M?Message-Id: <[email protected]>
H??From: root (Cron Daemon)
H??To: www-data
H??Subject: Cron <www-data@ubuntu12> /usr/bin/drush @main elysia-cron
H??Content-Type: text/plain; charset=ANSI_X3.4-1968
H??X-Cron-Env: <PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin>
H??X-Cron-Env: <COLUMNS=80>
H??X-Cron-Env: <SHELL=/bin/sh>
H??X-Cron-Env: <HOME=/var/www>
H??X-Cron-Env: <LOGNAME=www-data>
答案1
正如 Alien Life Form 所指出的,该邮件似乎来自 www-data 用户。您没有提供足够的信息来断定问题是否是“编码不当的联系表单”。
某些 Web 应用程序可能被滥用或配置错误,并试图向您发出警告。电子邮件的内容应该会让您明白这一点。如果无法通过其他方式轻松获取副本,请查看邮件池中的几个文件。
这些条目出现的频率非常高,这一点值得注意,因为 www-data 似乎在自己发送邮件。这是一个邮件循环吗?如果您每秒没有处理多个 php 请求,那么这种情况尤其可能出现。此外,www-data 似乎不是垃圾邮件最有可能的目标。
确保 www-data 帐户的别名为合理的别名。例如,您可以使用 /etc/aliases(并在编辑该文件后运行 newaliases)。根据您的发行版,它可能位于不同的位置,如 /etc/mail/aliases。
如果问题不是邮件循环,那么你大概会收到与生成的电子邮件相关的高速网络请求。你可以使用 tcpdump 捕获一些网络流量,然后查看它(例如,也许使用 wireshark)以查找所涉及的网络请求(例如,查找当时电子邮件中的一些内容)。除非它是通过 https 发送的,否则你将获得原始 IP 和 URL。
您可能还可以根据请求的时间从 http 访问日志中获取 IP 和 URL。每秒有多少个 URL 被访问多次?除非您的服务器流量非常大,否则这可能比捕获流量更容易。它还可能让您快速排除 Web 访问是电子邮件的来源。
--
我看到您在 Alien Life Form 的回答中评论说邮件排队的频率是“大约每 5 分钟一次”,这比您提供的日志中的频率要低得多。鉴于此,我希望将这些邮件提交的时间与访问日志中同一 URL 的点击次数对齐(特别是查看 POST 请求,因为它们更有可能)。
请求是否每 5 分钟准确一次?您有 5 分钟的 cron 作业吗?
了解一些电子邮件的内容将有助于我们了解首先要寻找什么。
答案2
99% 的把握表明,这些垃圾邮件来自托管网站上部署的编码不当的联系表单。
ctl-addr=www-data
行是一个明显的特征(提示:www-data 是运行 Web 服务器的用户的名称。在类似 RH 的机器上它将是 apache)。
关闭网络服务器,查看其日志,找出谁在点击联系表单。这可能是更复杂的攻击(命令/sql 注入)或完整的网站劫持/破解,但这是我首先要检查的,因为没有其他证据。
答案3
我调试此问题时使用的命令和有用的地方(除了以上答案中给出的所有内容之外)
将标题添加到 php 以跟踪此处显示的所有电子邮件博客文章并且这个服务器故障线。
使用此命令检查正在运行的所有 cron 作业这里。
/var/spool/mqueue
您可以在或中找到所有 sendmails 电子邮件/var/spool/mqueue-client
您可以使用 查看您的邮件队列mail -q
。
如果 sendmail 电子邮件是从 www-data 发送的,则其发件人地址可能是您的机器 hostname@dnshostname,命令如下:
hostname
dnshostname
你可以通过在 cronjob>/dev/null 2>&1
末尾添加以下内容来关闭所有电子邮件:例如
*/5 * * * * /usr/bin/drush @main elysia-cron >/dev/null 2>&1
来测试它来自哪里。
您可以设置变量
MAILTO="[email protected]"
在 cron 作业的顶部,将来自该特定 cron 的所有电子邮件发送给您。