查找发送垃圾邮件的人

查找发送垃圾邮件的人

我有一台 LAMP Ubuntu 10.04 服务器。有许多(>140)用户和许多不同的 PHP 网站(自定义、不同的 PHP 框架、CMS 等)。

问题是:有时服务器会发送“垃圾邮件”。本地进出口银行不用于此目的。我发现了如下奇怪的活动:

/usr/bin/lsof -ni | grep smtp |grep -v ^exim4

perl      15177    www-data  510u  IPv4 1101127040      0t0  TCP server_ip:46401->65.55.37.72:smtp (SYN_SENT)
perl      15178    www-data  510u  IPv4 1101127059      0t0  TCP server_ip:51002->98.136.217.202:smtp (SYN_SENT)
perl      15179    www-data  510u  IPv4 1101126982      0t0  TCP server_ip:39232->74.125.205.26:smtp (SYN_SENT)
perl      15180    www-data  510u  IPv4 1101126975      0t0  TCP server_ip:53339->65.55.37.72:smtp (SYN_SENT)
perl      15181    www-data  510u  IPv4 1101127014      0t0  TCP server_ip:45429->65.55.37.72:smtp (SYN_SENT)
perl      15182    www-data  510u  IPv4 1101126984      0t0  TCP server_ip:49985->74.125.205.26:smtp (SYN_SENT)
perl      15183    www-data  510u  IPv4 1101126971      0t0  TCP server_ip:42199->65.55.37.72:smtp (SYN_SENT)
..........
...........
perl      15184    www-data  510u  IPv4 1101126968      0t0  TCP server_ip:36641->74.125.205.26:smtp (SYN_SENT)
perl      15186    www-data  510u  IPv4 1101126979      0t0  TCP server_ip:57690->98.138.112.32:smtp (SYN_SENT)
...........

我无法发现谁运行这些 Perl 进程或它们是如何运行的。我尝试分析这些进程(例如 pid 15179): /proc/15179/cmdline - 为空

/proc/15179/status

Name:   perl
State:  S (sleeping)
Tgid:   15179
Pid:    15179
PPid:   15176
TracerPid:  0
Uid:    33  33  33  33
Gid:    33  33  33  33
FDSize: 1024
Groups: 33 
VmPeak:    10400 kB
VmSize:    10372 kB
VmLck:         0 kB
VmHWM:      8140 kB
VmRSS:      8092 kB
VmData:     6980 kB
VmStk:        88 kB
VmExe:      1200 kB
VmLib:      1980 kB
VmPTE:        32 kB
Threads:    1
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180017427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:  0-3
Mems_allowed:   1
Mems_allowed_list:  0
voluntary_ctxt_switches:    6431
nonvoluntary_ctxt_switches: 34

lsof -n -p 15179 - 这里 在此输入链接描述

我试图找到父进程:15179的父进程pid是15176:

/proc/15176/cmdline - 也为空

/proc/15176/status

Name:   perl
State:  S (sleeping)
Tgid:   15176
Pid:    15176
PPid:   1
TracerPid:  0
Uid:    33  33  33  33
Gid:    33  33  33  33
FDSize: 1024
Groups: 33 
VmPeak:    11116 kB
VmSize:    11116 kB
VmLck:         0 kB
VmHWM:      8712 kB
VmRSS:      8692 kB
VmData:     7772 kB
VmStk:        88 kB
VmExe:      1200 kB
VmLib:      1940 kB
VmPTE:        32 kB
Threads:    1
SigQ:   0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000010080
SigCgt: 0000000180007427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:  0-3
Mems_allowed:   1
Mems_allowed_list:  0
voluntary_ctxt_switches:    14467

这种情况很少发生(每两天一次)并且持续几分钟。因此很难获得更多信息。所有这些信息均使用监控 smtp 连接的 cron 作业记录。我不知道如何识别谁运行这些进程或它们是如何运行的。有什么策略可以找到他们吗?

答案1

您显示的数据已经包含很多信息:用户的UID是33,在我的系统上对应于www-数据,我认为这很可能同样适用于您的系统,因为您显示的套接字属于www-数据

另外,我怀疑命令行会给你带来更多信息:perl程序的PPID是15176,但是15176的PPID是1(IE,在里面)。这中间没有 shell,也没有会话。

所联系的 IP 地址并不是特别令人担忧:它们属于微软和谷歌,而这些人知道如何保护自己。

那么,犯规行为的证据在哪里呢?我同意连接的 SYN_SENT 状态确实值得关注,因为这意味着您的连接尚未收到正确的 SYN/ACK,并且您处于挂起状态。

那么,您可以做什么来挖掘更多信息呢?您无法尝试直接识别用户:您的帖子已经表明该用户是www-数据,并且该进程不直接连接到终端或会话。

但你首先可以确定你的IP是否被列入黑名单,例如这里:如果是,那就是垃圾邮件的证据。

其次,您应该检查邮件程序的日志,是否有任何异常情况:站点拒绝连接,因为您位于黑名单中,来自同一站点的多个连接,被用作中继的证据,......

第三,您可以使用以下方式监控您的端口

 ss -lntp

这会告诉您在任何给定时刻使用 (TCP) 端口的进程的 pid,并再次检查多个连接。您可以将上述命令编写为每秒重复一次,并存储其输出(也许与用户)和时间戳,以了解有关可疑连接时发生的情况的更多信息。这可以是互相关的尸检用户已登录或连接到您的站点。

有关更多信息,您可以简单地将所有数据包转储到经常出现的 Microsoft 站点,例如

  nohup tcpdump -n -i eth0 host 65.52.0.0/14 -w outfile & 

IP 地址范围是属于 Microsoft 的整个块,根据输出世界卫生组织 65.55.37.72;上面的命令可能会生成相当多的输出,因此准备好磨练您过滤表达式的技能线鲨

如果所有这些都失败了,请准备好强制您的用户更改密码。

答案2

只是一个想法。 Grep 浏览您的 apache 日志。如果您有时间,当邮件发送后,很容易找到它们。特别寻找 perl 脚本。

答案3

获取用户

通常是uid字段显示uid启动该进程的用户的。

在你的情况下,这将是 iser 与uid 33

用于getent passwd 33查看用户的名称。

追踪用户

您可以使用一个小的 C 守护进程轻松监视和记录用户的活动,

使用/proc/pid/status用于读取文件并在用户之后进行搜索的小库。

这可以帮助您避免服务器运行时出现问题。

(你也可以让守护进程处理kill这些进程)

相关内容