systemd病毒定位和处理

背景

内网测试环境出现一台机器上面的systemd返回值异常,其它都正常,具体的现象如下

1
systemctl restart smb;echo $?

这个返回的是1,正常执行完毕应该是0

问题定位

开始的时候以为是网络的问题,通过执行本地的命令发现,任何systemd的执行命令返回的都是1,但是实际成功了
开始并没有往病毒方面想,系统没有定时任务,没有异常的cpu负载

1
[root@lab103 ~]# strace systemctl restart rsyslogd

后面是通过这个命令定位到出现异常了,我们复现下病毒的操作

通过把systemctl拷贝一份到本地的另外一个路径

1
[root@lab103 ~]# cp -ra /usr/bin/systemctl /usr/bin/sys

使用一个新的脚本替换,这里我用的脚本,实际是二进制,看不到内容,效果差不多

1
2
3
4
5
[root@lab103 ~]# cat /usr/bin/systemctl
#! /bin/bash
echo a > /tmp/test
/usr/bin/sys $1 $2 $3 $4 $5 $6 $7
exit 1

上面的exit 1是模拟的病毒执行的命令返回值,这个地方应该是失败了,返回的1,但是命令本身执行没有问题,所以不容易发现

我们看下现在的strace的值

1
2
3
4
5
6
7
8
strace systemctl  restart rsyslog
read(3, "#! /bin/bash\necho a > /tmp/test\n"..., 80) = 73
lseek(3, 0, SEEK_SET) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3) = 0
fcntl(255, F_SETFD, FD_CLOEXEC) = 0

这里我们是抓到了一个异常的路径,实际环境是捕获到一个/usr/bin/sys文件执行

这里基本可以定位到环境已经被替换了systemctl,这个地方确定病毒后,还发现了一些问题

lsattr命令被删除了
chattr也被替换了

上面都是常规的搞法,我们需要进行环境恢复,其实最开始的时候发现做dnf 升级systemd的时候就无法升级,没想到是命令被替换并锁定了,以为是库本身有问题

环境恢复

首先要恢复lsattr和chattr命令

下载软件包e2fsprogs
解压拿到二进制

1
rpm2cpio  e2fsprogs-xxx-xxx.rpm|cpio -div

拿到后使用命令解除锁定

1
chattr -ia  filename

解除锁定以后就可以进行替换的操作,把文件还原了

systemctl直接用/usr/bin/sys进行还原即可,这个检查下二进制的md5值确认下就行

总结

环境出现问题后,可以排查下环境是不是有下面的异常来大概判断环境是不是有上面的这种病毒情况

  • 检查systemctl的md5值
  • 检查lsattr命令的md5值
  • 检查chattr命令的md5值
  • 检查/usr/bin/sys路径

上面的问题可能出现各种不同的路径或者命令,这个可以类似的进行排查即可