可能重复:
我该如何处理受到感染的服务器?
此进程正在我的 Linux 服务器上运行并发送垃圾邮件(使用随机 IP 连接到端口 25 和端口 80)。
top - 12:28:42 up 108 days, 2:24, 1 user, load average: 0.08, 0.22, 0.37
Tasks: 116 total, 2 running, 114 sleeping, 0 stopped, 0 zombie
Cpu(s): 12.3% us, 1.7% sy, 0.0% ni, 86.1% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 499540k total, 477096k used, 22444k free, 7916k buffers
Swap: 1015800k total, 1664k used, 1014136k free, 231476k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27850 <userid> 15 0 9808 5616 1400 S 9.3 1.1 47:14.62 perl
在 top 运行时按 c 键显示:
27850 <userid> 15 0 9808 5616 1400 S 9.3 1.1 47:31.52 ./mail
我知道运行该进程的用户 ID。它似乎是一个定期启动的自动进程(但并非一直运行)。
我该怎么做才能确切地找出它的启动位置(什么脚本文件等)?如果我使用进程 ID 查看 /proc,它会显示:
-r--r--r-- 1 <userid> users 0 Jan 5 12:22 statm
-r--r--r-- 1 <userid> users 0 Jan 5 12:22 stat
-r--r--r-- 1 <userid> users 0 Jan 5 12:23 cmdline
-r--r--r-- 1 <userid> users 0 Jan 5 12:31 wchan
dr-xr-xr-x 3 <userid> users 0 Jan 5 12:31 task
-r--r--r-- 1 <userid> users 0 Jan 5 12:31 status
-r-------- 1 <userid> users 0 Jan 5 12:31 smaps
lrwxrwxrwx 1 <userid> users 0 Jan 5 12:31 root -> /
-r-------- 1 <userid> users 0 Jan 5 12:31 mountstats
-r--r--r-- 1 <userid> users 0 Jan 5 12:31 mounts
-rw------- 1 <userid> users 0 Jan 5 12:31 mem
-r--r--r-- 1 <userid> users 0 Jan 5 12:31 maps
-rw-r--r-- 1 <userid> users 0 Jan 5 12:31 loginuid
-r-------- 1 <userid> users 0 Jan 5 12:31 limits
-r--r--r-- 1 <userid> users 0 Jan 5 12:31 io
dr-x------ 2 <userid> users 0 Jan 5 12:31 fd
lrwxrwxrwx 1 <userid> users 0 Jan 5 12:31 exe -> /usr/bin/perl
-r-------- 1 <userid> users 0 Jan 5 12:31 environ
lrwxrwxrwx 1 <userid> users 0 Jan 5 12:31 cwd -> /
-rw-r--r-- 1 <userid> users 0 Jan 5 12:31 coredump_filter
-r-------- 1 <userid> users 0 Jan 5 12:31 auxv
dr-xr-xr-x 2 <userid> users 0 Jan 5 12:31 attr
答案1
在以下所有命令中,<PID>
应替换为垃圾邮件发送进程的进程 ID。在开始之前,请阅读评论中的相关规范答案。
首先,阻止垃圾邮件,方法是iptables
阻止端口 25 和 80 出站,或者使用 暂停该过程kill -STOP <PID>
。
找出它是如何启动的cat /proc/<PID>/cmdline
。这将告诉你究竟执行了什么命令来启动该进程。的内容ls -l /proc/<PID>/fd/
通常也很有趣。
下一步是找到启动它的程序ps -ef | grep <PID>
。这类垃圾邮件发送脚本通常会创建一个执行发送的文件,然后执行它,然后删除它。这样,尽管工作目录是/
,命令行是./mail
,但您不会/mail
在文件系统上找到文件,即使找到了,删除它也不会有帮助。输出的第二列是 PID,第三列是其父级的 PID。找到父级的命令行并找出它是如何启动该进程的。它可能类似于守护进程cron
,在这种情况下应该有一些登录信息/var/log/cron
来指示哪个 crontab 负责。
一旦你知道了每次启动该进程的方式,你就可以进一步追溯它,并弄清楚那发生了。最终,一旦你追溯得足够远,你应该找到最初的妥协。这是主要目标。此时,你可以防止妥协再次发生(升级受影响的服务或将其防火墙关闭或更改其配置以禁止允许妥协的任何内容)。
最后一步是清除服务器并从备份中重新安装。由于您现在知道了最初的入侵发生的时间,因此您可以放心地从入侵发生前进行的干净备份中进行恢复。
虽然你能只需清理文件并删除脚本,您永远无法确定是否已删除所有内容,并且无法为下一次入侵做好准备。删除并重新安装路线是明智的选择。
答案2
尝试lsof
在进程上使用。这将至少提供所有打开文件的 inode(如果可能,还提供全名)。这将帮助您找出程序所在的位置。
lsof
并不总是安装在 Linux 安装上,因此您可能必须获取该包并将其安装到您的系统上。
还要确保分析整个进程树,而不一定是单个进程本身。