linux服务器排查病毒纪实

7,677 阅读12分钟
原文链接: www.geekjc.com

1. 前言

昨天邮件收到如下图所示: image.png 啊,天啊,对于一个做前端开发的人来说,对服务器端的知识只略懂一二啊,黑客就知道欺负小白,入侵我的服务器。

一开始我是束手无策的,根本无从所知病毒在哪,黑客怎么入侵我的服务器。接下来,让我们一步步来排查吧,先看看如何判断 Linux 服务器是否被入侵?

2. 判断Linux 服务器是否被入侵

所谓的服务器被入侵或者说被黑了的意思,是指未经授权的人或程序为了自己的目的登录到服务器上去并使用其计算资源,通常会产生不好的影响。

免责声明:若你的服务器被类似 NSA 这样的国家机关或者某个犯罪集团入侵,那么你并不会注意到有任何问题,这些技术也无法发觉他们的存在。

然而,大多数被攻破的服务器都是被类似自动攻击程序这样的程序或者类似“脚本小子”这样的廉价攻击者,以及蠢蛋罪犯所入侵的。

这类攻击者会在访问服务器的同时滥用服务器资源,并且不怎么会采取措施来隐藏他们正在做的事情。

被入侵服务器的症状

当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗 100% 的资源。他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 DoS 攻击。

因此出现问题的第一个表现就是服务器 “变慢了”。这可能表现在网站的页面打开的很慢,或者电子邮件要花很长时间才能发送出去。

那么你应该查看那些东西呢?

2.1 当前都有谁在登录?

你首先要查看当前都有谁登录在服务器上。发现攻击者登录到服务器上进行操作并不复杂。

其对应的命令是 w。运行 w 会输出如下结果:

10:43:09 up 214 days,  1:20,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    183.15.179.82    09:49    0.00s  0.02s  0.00s w

查了一下ip地址,是自己登陆了,没有其他人登陆,如果查到ip地址不是自己的ip地址就要注意了,这个不是个好兆头。

停下来做个深呼吸, 不要恐慌之下只是干掉他们的 SSH 连接。除非你能够防止他们再次进入服务器,否则他们会很快进来并踢掉你,以防你再次回去。

请参阅本文最后的“被入侵之后怎么办”这一章节来看找到了被入侵的证据后应该怎么办。

whois 命令可以接一个 IP 地址然后告诉你该 IP 所注册的组织的所有信息,当然就包括所在国家的信息。

2.2 谁曾经登录过?

Linux 服务器会记录下哪些用户,从哪个 IP,在什么时候登录的以及登录了多长时间这些信息。使用 last 命令可以查看这些信息。

输出类似这样:

root     pts/1        78.31.109.1      Thu Nov 30 08:26   still logged in
root     pts/0        113.174.161.1    Thu Nov 30 08:26   still logged in
root     pts/1        78.31.109.1      Thu Nov 30 08:24 - 08:26  (00:01)
root     pts/0        113.174.161.1    Wed Nov 29 12:34 - 12:52  (00:18)
root     pts/0        14.176.196.1     Mon Nov 27 13:32 - 13:53  (00:21)

这里可以看到英国 IP 和越南 IP 交替出现,而且最上面两个 IP 现在还处于登录状态。如果你看到任何未经授权的 IP,那么请参阅最后章节。

登录后的历史记录会记录到二进制的/var/log/wtmp文件中(LCTT 译注:这里作者应该写错了,根据实际情况修改),因此很容易被删除。通常攻击者会直接把这个文件删掉,以掩盖他们的攻击行为。 因此, 若你运行了last命令却只看得见你的当前登录,那么这就是个不妙的信号。

如果没有登录历史的话,请一定小心,继续留意入侵的其他线索。

2.3 回顾命令历史

这个层次的攻击者通常不会注意掩盖命令的历史记录,因此运行 history命令会显示出他们曾经做过的所有事情。 一定留意有没有用 wgetcurl命令来下载类似垃圾邮件机器人或者挖矿程序之类的非常规软件。

命令历史存储在~/.bash_history文件中,因此有些攻击者会删除该文件以掩盖他们的所作所为。跟登录历史一样,若你运行history 命令却没有输出任何东西那就表示历史文件被删掉了。这也是个不妙的信号,你需要很小心地检查一下服务器了。(LCTT 译注,如果没有命令历史,也有可能是你的配置错误。)

2.4 哪些进程在消耗 CPU?

你常遇到的这类攻击者通常不怎么会去掩盖他们做的事情。他们会运行一些特别消耗 CPU 的进程。这就很容易发现这些进程了。只需要运行 top然后看最前的那几个进程就行了。

这也能显示出那些未登录进来的攻击者。比如,可能有人在用未受保护的邮件脚本来发送垃圾邮件。

如果你最上面的进程对不了解,那么你可以 Google 一下进程名称,或者通过 losfstrace来看看它做的事情是什么。

使用这些工具,第一步从 top中拷贝出进程的 PID,然后运行:

strace -p PID

这会显示出该进程调用的所有系统调用。它产生的内容会很多,但这些信息能告诉你这个进程在做什么。

lsof  -p PID

这个程序会列出该进程打开的文件。通过查看它访问的文件可以很好的理解它在做的事情。

2.5 检查所有的系统进程

消耗 CPU 不严重的未授权进程可能不会在top中显露出来,不过它依然可以通过ps 列出来。命令ps auxf就能显示足够清晰的信息了。

你需要检查一下每个不认识的进程。经常运行 ps(这是个好习惯)能帮助你发现奇怪的进程。

2.6 检查进程的网络使用情况

iftop 的功能类似 top,它会排列显示收发网络数据的进程以及它们的源地址和目的地址。类似 DoS 攻击或垃圾机器人这样的进程很容易显示在列表的最顶端。

2.7 哪些进程在监听网络连接?

通常攻击者会安装一个后门程序专门监听网络端口接受指令。该进程等待期间是不会消耗 CPU 和带宽的,因此也就不容易通过top之类的命令发现。

lsofnetstat 命令都会列出所有的联网进程。我通常会让它们带上下面这些参数:

lsof -i
netstat -plunt

你需要留意那些处于 LISTENESTABLISHED 状态的进程,这些进程要么正在等待连接(LISTEN),要么已经连接(ESTABLISHED)。如果遇到不认识的进程,使用 stracelsof来看看它们在做什么东西。

3. 被入侵之后该怎么办呢?

经过上面的步骤后,基本可以找到你的服务器是否被入侵了。如果入侵了,首先,不要紧张,尤其当攻击者正处于登录状态时更不能紧张。你需要在攻击者警觉到你已经发现他之前夺回机器的控制权。如果他发现你已经发觉到他了,那么他可能会锁死你不让你登陆服务器,然后开始毁尸灭迹。

如果你技术不太好那么就直接关机吧。你可以在服务器上运行 shutdown -h now 或者 systemctl poweroff 这两条命令之一。也可以登录主机提供商的控制面板中关闭服务器。关机后,你就可以开始配置防火墙或者咨询一下供应商的意见。

如果你对自己颇有自信,而你的主机提供商也有提供上游防火墙,那么你只需要以此创建并启用下面两条规则就行了:

  • 只允许从你的 IP 地址登录 SSH。
  • 封禁除此之外的任何东西,不仅仅是 SSH,还包括任何端口上的任何协议。

这样会立即关闭攻击者的 SSH 会话,而只留下你可以访问服务器。

如果你无法访问上游防火墙,那么你就需要在服务器本身创建并启用这些防火墙策略,然后在防火墙规则起效后使用kill 命令关闭攻击者的 SSH 会话。(LCTT 译注:本地防火墙规则 有可能不会阻止已经建立的 SSH 会话,所以保险起见,你需要手工杀死该会话。)

最后还有一种方法,如果支持的话,就是通过诸如串行控制台之类的带外连接登录服务器,然后通过systemctl stop network.service停止网络功能。这会关闭所有服务器上的网络连接,这样你就可以慢慢的配置那些防火墙规则了。

重夺服务器的控制权后,也不要以为就万事大吉了。

不要试着修复这台服务器,然后接着用。你永远不知道攻击者做过什么,因此你也永远无法保证这台服务器还是安全的。

最好的方法就是拷贝出所有的数据,然后重装系统。(LCTT 译注:你的程序这时已经不可信了,但是数据一般来说没问题。)

4. 过程

经过上面步骤 2.1,2.2,2.3 我都没发现我的服务器有什么异常或者被谁登陆过,但是在步骤2.4 的时候,发现了异常,有不认识的进程在消耗CPU,然后我用strace -p PID 发现这个进程在向外发大量的数据包,用步骤2.7中的lsof -i发现确实这个进程在监听网络连接,进程名 有pnscan,在我用kill -9 PID 后 ,运行ps aux | grep pnscan 发现该进程仍然存在,于是上网查了一下,发现这是JBoss漏洞中毒。

5. 查进程端口相互占用情况

Linux下查看进程占用端口: 查看程序对应进程号:ps –ef | grep 进程名

[root@iZ28ti4v56dZ ~]# ps -ef | grep nginx
root     17453     1  0 Feb27 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    17455 17453  0 Feb27 ?        00:14:13 nginx: worker process
root     32251 32073  0 17:45 pts/0    00:00:00 grep nginx

REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端口号:netstat -anp|grep pid

[root@iZ28ti4v56dZ ~]# netstat -anp | grep 17453
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      17453/nginx
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      17453/nginx
unix  3      [ ]         STREAM     CONNECTED     11886123 17453/nginx
unix  3      [ ]         STREAM     CONNECTED     11886122 17453/nginx
[root@iZ28ti4v56dZ ~]# netstat -nltp | grep 17453
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      17453/nginx
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      17453/nginx

Linux下查看端口号所使用的进程号: 使用lsof命令: lsof –i:端口号

[root@iZ28ti4v56dZ ~]# lsof -i:443
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nginx   17453  root    7u  IPv4 11886111      0t0  TCP *:https (LISTEN)
nginx   17455 nginx    7u  IPv4 11886111      0t0  TCP *:https (LISTEN)

6. Jboss漏洞导致linux服务器中毒解决办法

6.1 中毒现象

  1. 网络出现拥塞,访问延迟增加。
  2. 系统定时任务表中出现异常的定时任务。
  3. 出现异常进程。
  4. $JBOSS_HOME/bin或/root目录下出现大量的异常文件。

6.2 现象分析

  这是最近网上流行的一种蠕虫病毒,它利用Jboss中间件程序的jxm-console与web-console默认帐户漏洞进行攻击,感染linux服务器,成为僵尸代理。

  1. 出现网络拥塞的原因是该蠕虫病毒利用名为pnscan工具不断执行端口扫描。发出大量的请求包,占用网络带宽。
  2. 在系统定时任务表中可查看到名为如下的异常定时任务(有时候只有其中2个)。 crontab –l image.png

.sysync.pl与.sysdbs都是隐藏文件,可以通过ls –la列表查看到。

  1. 查看进程,可以检查到以下异常进程 image.png 有些服务器上还可以看到一些javas的异常进程,请确认这些javas进程,是否应用程序调用的java。

  2. 在$JBOSS_HOME/bin或/root目录下出现大量如下异常文件 image.png 其中kisses.tar.gz就是病毒源码安装包,安装后生成以上文件。

6.3 解决方法

步一:查杀病毒

Killall -9 javas Killall -9 pns Killall -9 perl

cd /root 或 cd $JBOSS_HOME/bin rm –rf bm rm –rf .pl rm –rf treat.sh rm –rf install-sh rm –rf version rm –rf kisses rm –rf pns rm –rf Makefile rm –rf ipsort rm –rf kisses rm –rf .sysdbs rm –rf .sysync.pl

crontab –e 1 1 10 ~/.sysdbs 1 1 24 perl ~/.sysync.pl 1 1 24 perl ~/.sysync.pl 1 1 10 ~/.sysdbs 删除掉这几行 service crond stop

步二:Jboss安全加固,修改jmx-console与web-console的默认口令

JMX安全配置:

把GET和POST两行注释掉,同时security-constraint整个部分不要注释掉。 image.png 把security-domain注释去掉 image.png 修改admin密码 image.png

WEB-CONSOLE安全加固 image.png

修改方法与JMX安全加固一样。

步三:测试

完成Jboss的安全加固后做http访问测试,看能否正常显示验证窗口,输入设置的用户名口令后能否正常访问。

xxx.xxx.xxx.xxx/web-console

xxx.xxx.xxx.xxx/jmx-conslol…

6.4 针对Jboss漏洞攻击的建议

  对于病毒攻击一般还是以预防为主,一旦发现服务器已经中毒解决起来相关棘手。为了更有效的预防此类病毒攻击,提供以下建议:

  1. Jboss应用程序应运行在非root用户下,防止病毒获得超级用户权限,修改root口令,控制服务器。

  2. 为Jboss控制台启用验证,修改默认口令,口令要具有一定的复杂度。如果不需要,甚至可以关闭管理端口和相关统计信息,删除Jboss主目录和文件。

  3. 将Jboss升级到最新版本,尤其是老板本的Jboss的本身漏洞较多,新版本的Jboss安全性较高。

  4. WEB应用与接收器分离,如可以通过Apache与Jboss整合的方式实现,这样做一方面更安全,另一方面更适合高并发流量的访问。

7. 总结

从昨天排查杀毒到今天,已经没再给我发警告邮件了,说明病毒已经清除掉了。从这件事件中,发现世间难免有一些坏人,去攻击别人的服务器,专门攻击像我这种对服务器知识只懂皮毛的人,也要感谢他们,让我下决心去学好相关知识来抵挡他们的攻击。