rootkit木马简介和linux后门入侵解决方法

2021-09-10   


1、rootkit木马简介

rootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现这种木马。rootkit攻击能力极强,对系统的危害很大,它通过一套工具来建立后门和隐藏行迹,从而让攻击者保住权限,以使它在任何时候都可以使用root权限登录到系统

rootkit主要有两种类型:文件级别和内核级别,下面分别进行简单介绍:

1.1 文件级别的rootkit

文件级别的rootkit一般是通过程序漏洞或者系统漏洞进入系统后,通过修改系统的重要文件来达到隐藏自己的目的。在系统遭受rootkit攻击后,合法的文件被木马程序替代,变成了一个外壳程序,而其内部则是隐藏着的后门程序。

通常容易被rootkit替换的系统程序有login、ls、ps、ifconfig、du、find、netstat等。其中login程序是最经常被替换的,因为当访问Linux时,无论是通过本地登录还是远程登录,/bin/login程序都会运行,系统将通过/bin/login来收集并核对用户的账号和密码,而rootkit就是利用这个程序的特点,使用一个带有根权限后门密码的/bin/login来替换系统的/bin/login,这样攻击者通过输入设定好的密码就能轻松进入系统。此时,即使系统管理员修改root密码或者清除root密码,攻击者还是一样能通过root用户登录系统。攻击者通常在进入Linux系统后,会进行一系列的攻击动作,最常见的是安装嗅探器收集本机或者网络中其他服务器的重要数据。在默认情况下,Linux中也有一些系统文件会监控这些工具动作,例如ifconfig命令。所以,攻击者为了避免被发现,会想方设法替换其他系统文件,常见的就是ls、ps、ifconfig、du、find、netstat等。如果这些文件都被替换,那么在系统层面就很难发现rootkit已经在系统中运行了。

这就是文件级别的rootkit,对系统维护很大,目前最有效的防御方法是定期对系统重要文件的完整性进行检查,如果发现文件被修改或者被替换,那么很可能系统已经遭受了rootkit入侵。检查件完整性的工具很多,常见的有Tripwire、 aide 等,可以通过这些工具定期检查文件系统的完整性,以检测系统是否被rootkit入侵

1.2 内核级别的rootkit

内核级rootkit是比文件级rootkit更高级的一种入侵方式,它可以使攻击者获得对系统底层的完全控制权,此时攻击者可以修改系统内核,进而截获运行程序向内核提交的命令,并将其重定向到入侵者所选择的程序并运行此程序,也就是说,当用户要运行程序A时,被入侵者修改过的内核会假装执行程序A,而实际上却执行的是程序B

内核级rootkit主要依附在内核上,它并不对系统文件做任何修改,因此一般的检测工具很难检测到它的存在,这样一旦系统内核被植入rootkit,攻击者就可以对系统为所欲为而不被发现。目前对于内核级的rootkit还没有很好的防御工具,因此做好系统安全防范就非常重要。将系统维持在最小权限内工作,只要攻击者不能获取root权限,就无法在内核中植入rootkit

2、后门检测工具chkrootkit

chkrootkit 是一个 Linux 系统下查找并检测 rootkit 后门的工具,点击可以访问chkrootkit官方网址。chkrootkit 没有包含在官方的 CentOS 源中,因此需要采取手动编译的方法进行安装,为了安全起见,请务必在官方下载chkrootkit源码包

2.1 安装步骤

#安装源码编译工具
[root@localhost ~]# yum -y install gcc gcc-c++ make wget

#下载chkrootkit源码包并解压
[root@localhost ~]# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
[root@localhost ~]# tar -zxf chkrootkit.tar.gz -C /opt/

#进入chkrootkit目录进行编译安装
[root@localhost ~]# cd /opt/chkrootkit-*
[root@localhost chkrootkit-0.55]# make sense
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
cc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
cc -DHAVE_LASTLOG_H   -D_FILE_OFFSET_BITS=64 -o ifpromisc ifpromisc.c
cc  -o chkproc chkproc.c
cc  -o chkdirs chkdirs.c
cc  -o check_wtmpx check_wtmpx.c
cc   -o strings-static strings.c
cc  -o chkutmp chkutmp.c

#编译安装完成后删除tar包文件
[root@localhost ~]# rm -f chkrootkit.tar.gz

显示如上信息则表示编译安装正常,已经可以开始使用了。如遇到报错信息,可以参考下面办法来解决

2.2 报错解决

2.2.1 编译安装的时候出现/usr/bin/ld: cannot find -lc报错

[root@localhost chkrootkit-0.55]# make sense 
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
cc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
cc -DHAVE_LASTLOG_H   -D_FILE_OFFSET_BITS=64 -o ifpromisc ifpromisc.c
cc  -o chkproc chkproc.c
cc  -o chkdirs chkdirs.c
cc  -o check_wtmpx check_wtmpx.c
cc -static  -o strings-static strings.c
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make: *** [Makefile:72: strings-static] Error 1

1)如果系统是6.X或者7.X的是因为缺少依赖的软件包glibc-static和glibc-utils导致的:

[root@localhost chkrootkit-0.55]# make clean
[root@localhost chkrootkit-0.55]# yum -y install glibc-static glibc-utils
[root@localhost chkrootkit-0.55]# make sense

2)如果系统是8.X的就注释掉Makefile文件里STATIC= -static这一行内容:

[root@localhost chkrootkit-0.55]# make clean
[root@localhost chkrootkit-0.55]# sed -i 's/^STATIC/#&/' Makefile
[root@localhost chkrootkit-0.55]# make sense

2.2.2 编译安装的时候出现make: cc: Command not found报错

[root@localhost chkrootkit-0.55]# make sense
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
make: cc: Command not found
make: *** [chklastlog] Error 127

这是因为缺少gcc编译命令导致,安装gcc编译工具即可:

[root@localhost chkrootkit-0.55]# make clean
[root@localhost chkrootkit-0.55]# yum -y install gcc gcc-c++
[root@localhost chkrootkit-0.55]# make sense

注意:如果还出现类似的make: xxx: Command not found报错,按照报错提示的指令去安装对应的软件包即可

[root@localhost chkrootkit-0.55]# make sense
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
make: xxx: Command not found
make: *** [chklastlog] Error 127
[root@localhost chkrootkit-0.55]# yum provides XXX
[root@localhost chkrootkit-0.55]# yum -y install XXX
[root@localhost chkrootkit-0.55]# make sense

2.3 使用说明

编译安装完成后目录下就会生成几个可执行文件,在当前目录下执行如下命令即可显示chkrootkit的详细用法

[root@localhost chkrootkit-0.55]# ./chkrootkit -h

参数含义
-h显示帮助信息
-V显示版本信息
-l显示测试内容
-ddebug模式,显示检测过程的相关指令程序
-q静默模式,只显示有问题的内容
-x高级模式,显示所有检测结果
-r设置指定的目录为根目录
-p指定chkrootkit检测时使用系统命令的目录
-n跳过NFS连接的目录

chkrootkit的使用比较简单,直接执行chkrootkit命令即可自动开始检测系统

[root@localhost chkrootkit-0.55]# ./chkrootkit
#或者
[root@localhost chkrootkit-0.55]# /opt/chkrootkit-0.55/chkrootkit

下面是某个系统的检测结果:

从输出可以看出,此系统的/tmp目录下被植入了一些脚本。此次将对应的脚本删除,并删除/root/.ssh目录重新生成秘钥和远程主机清单,重新修改root密码便能恢复正常。但针对一些常用的系统命令被感染rootkit的系统,最安全而有效的方法就是备份数据重新安装系统

2.4 软件缺点

这个软件有个缺陷,就是只要/tmp目录下有可执行文件便会出现Searching for Linux.Xor.DDoS ... INFECTED: Possible Malicious Linux.Xor.DDoS installed误报

另外chkrootkit在检查rootkit的过程中使用了部分系统命令,因此,如果服务器被黑客入侵,那么依赖的系统命令可能也已经被入侵者做了手脚,chkrootkit的结果将变得完全不可信,甚至连系统ls等查看文件的基础命令也变得不可信

为了避免chkrootkit的这个问题,可以在服务器处于正常安全运行之前,事先将chkrootkit使用的系统命令进行备份,在需要的时候使用备份的原始系统命令让chkrootkit对rootkit进行检测,方法如下:

#在/usr/share/下建立了一个.commands隐藏文件
[root@localhost chkrootkit-0.55]# mkdir /usr/share/.commands

#将chkrootkit使用的一些系统命令备份到这个隐藏目录下
[root@localhost chkrootkit-0.55]# cp `which --skip-alias date du env grep su awk cut echo find ifconfig egrep id head ls netstat ps strings sed uname top w login` /usr/share/.commands

#为安全起见将.commands目录下的内容压缩打包,然后下载到一个安全的地方进行备份,以后如果服务器遭受入侵,就可以再将备份上传到服务器的任意路径下解压使用
[root@localhost chkrootkit-0.55]# tar -zcf /opt/commands.tar.gz /usr/share/.commands

#使用chkrootkit命令的“-p”参数指定/usr/share/.commands路径进行检测验证
[root@localhost chkrootkit-0.55]# ./chkrootkit -p /usr/share/.commands/

#验证完毕后删除/usr/share/.commands/目录
[root@localhost chkrootkit-0.55]# rm -rf /usr/share/.commands/

3、后门检测工具RKHunter

RKHunter是一款专业检测系统是否感染rootkit的工具,它通过执行一系列的脚本来确认服务器是否已经感染rootkit。在官方资料中,RKHunter可以作的事情有:

  • MD5校验测试,检测文件是否有改动
  • 检测rootkit使用的二进制和系统工具文件
  • 检测特洛伊木马程序的特征码
  • 检测常用程序的文件属性是否异常
  • 检测系统相关的测试
  • 检测隐藏文件
  • 检测可疑的核心模块LKM
  • 检测系统已启动的监听端口

3.1 安装步骤

如果系统有epel的yum源可以使用yum直接安装

[root@localhost ~]# yum list | grep -i rkhunter
rkhunter.noarch                                                   1.4.6-6.el8                                       epel
[root@localhost ~]# yum -y install rkhunter

如果没有可以在权威网站下载安装

[root@localhost ~]# wget https://sourceforge.net/projects/rkhunter/files/latest/download/rkhunter-1.4.6.tar.gz
[root@localhost ~]# tar -zxf rkhunter-1.4.6.tar.gz -C /opt/
[root@localhost ~]# cd /opt/rkhunter-1.4.6/
[root@localhost rkhunter-1.4.6]# ls
files  installer.sh

#查看rkhunter的安装指令
[root@localhost rkhunter-1.4.6]# less files/README

#执行rkhunter的安装指令
[root@localhost rkhunter-1.4.6]# ./installer.sh --install

#安装完成后删除tar包文件
[root@localhost ~]# rm -f rkhunter-1.4.6.tar.gz

#查看rkhunter执行指令的路径,在此目录下可直接使用rkhunter指令
[root@localhost rkhunter-1.4.6]# which rkhunter
/usr/local/bin/rkhunter

3.2 使用说明

[root@localhost rkhunter-1.4.6]# ./installer.sh -h
Rootkit Hunter installer 1.2.21

Usage: ./installer.sh <parameters>

Ordered valid parameters:
  --help (-h)      : Show this help.
  --examples       : Show layout examples.
  --layout <value> : Choose installation template.
                     The templates are:
                      - default: (FHS compliant; the default)
                      - /usr
                      - /usr/local
                      - oldschool: old version file locations
                      - custom: supply your own installation directory
                      - RPM: for building RPM's. Requires $RPM_BUILD_ROOT.
                      - DEB: for building DEB's. Requires $DEB_BUILD_ROOT.
                      - TGZ: for building Slackware TGZ's. Requires $TGZ_BUILD_ROOT.
                      - TXZ: for building Slackware TXZ's. Requires $TXZ_BUILD_ROOT.
  --striproot      : Strip path from custom layout (for package maintainers).
  --install        : Install according to chosen layout.
  --overwrite      : Overwrite the existing configuration file.
                     (Default is to create a separate configuration file.)
  --show           : Show chosen layout.
  --remove         : Uninstall according to chosen layout.
  --uninstall      : Alias for the '--remove' option.
  --version        : Show the installer version.
参数含义
--help (-h) 显示帮助信息
--examples 显示安装示例
--layout 选择安装模板
模板选择
- defaultFHS compliant,默认的安装选项
- /usr安装在/usr目录下
- /usr/local安装在/usr/local目录下
- oldschool安装在旧版本文件位置
- custom自定义安装目录
- RPM用于构建RPM包,需要$ rpm_build_root
- DEB用于构建DEB包,需要$ deb_build_root
- TGZ用于构建Slackware TGZ包,需要$ tgz_build_root
- TXZ用于构建Slackware TXZ包,需要$ txz_build_root
--striproot 来自自定义布局的剥离路径(适用于包维护者)
--install 根据所选布局安装
--overwrite 覆盖现有配置文件(默认是创建单独的配置文件)
--show 显示安装路径
--remove 根据所选布局卸载
--uninstall 别名同"--remove"选项
--version 显示安装版本信息
[root@localhost rkhunter-1.4.6]# rkhunter -h

Usage: rkhunter {--check | --unlock | --update | --versioncheck |
                 --propupd [{filename | directory | package name},...] |
                 --list [{tests | {lang | languages} | rootkits | perl | propfiles}] |
                 --config-check | --version | --help} [options]

Current options are:
         --append-log                  Append to the logfile, do not overwrite
         --bindir <directory>...       Use the specified command directories
     -c, --check                       Check the local system
     -C, --config-check                Check the configuration file(s), then exit
  --cs2, --color-set2                  Use the second color set for output
         --configfile <file>           Use the specified configuration file
         --cronjob                     Run as a cron job
                                       (implies -c, --sk and --nocolors options)
         --dbdir <directory>           Use the specified database directory
         --debug                       Debug mode
                                       (Do not use unless asked to do so)
         --disable <test>[,<test>...]  Disable specific tests
                                       (Default is to disable no tests)
         --display-logfile             Display the logfile at the end
         --enable  <test>[,<test>...]  Enable specific tests
                                       (Default is to enable all tests)
         --hash {MD5 | SHA1 | SHA224 | SHA256 | SHA384 | SHA512 |
                 NONE | <command>}     Use the specified file hash function
                                       (Default is SHA256)
     -h, --help                        Display this help menu, then exit
 --lang, --language <language>         Specify the language to use
                                       (Default is English)
         --list [tests | languages |   List the available test names, languages,
                 rootkits | perl |     rootkit names, perl module status
                 propfiles]            or file properties database, then exit
     -l, --logfile [file]              Write to a logfile
                                       (Default is /var/log/rkhunter.log)
         --noappend-log                Do not append to the logfile, overwrite it
         --nocf                        Do not use the configuration file entries
                                       for disabled tests (only valid with --disable)
         --nocolors                    Use black and white output
         --nolog                       Do not write to a logfile
--nomow, --no-mail-on-warning          Do not send a message if warnings occur
   --ns, --nosummary                   Do not show the summary of check results
 --novl, --no-verbose-logging          No verbose logging
         --pkgmgr {RPM | DPKG | BSD |  Use the specified package manager to obtain
                   BSDng | SOLARIS |   or verify file property values.
                   NONE}               (Default is NONE)
         --propupd [file | directory | Update the entire file properties database,
                    package]...        or just for the specified entries
     -q, --quiet                       Quiet mode (no output at all)
  --rwo, --report-warnings-only        Show only warning messages
   --sk, --skip-keypress               Don't wait for a keypress after each test
         --summary                     Show the summary of system check results
                                       (This is the default)
         --syslog [facility.priority]  Log the check start and finish times to syslog
                                       (Default level is authpriv.notice)
         --tmpdir <directory>          Use the specified temporary directory
         --unlock                      Unlock (remove) the lock file
         --update                      Check for updates to database files
   --vl, --verbose-logging             Use verbose logging (on by default)
     -V, --version                     Display the version number, then exit
         --versioncheck                Check for latest version of program
     -x, --autox                       Automatically detect if X is in use
     -X, --no-autox                    Do not automatically detect if X is in use
运行rkhunter命令的选项
--append-log在日志文件后追加日志,而不覆盖原有日志
--bindir使用指定的命令目录
-c, --check检测当前系统
-C, --config-check检查配置文件语法是否有误,然后退出
--cs2, --color-set2使用输出的第二个颜色
--configfile使用指定的配置文件
--cronjob作为cron计划任务定期运行 (包含参数 -c, --sk , --nocolors )
--dbdir使用指定的数据库目录
--debug调试模式(除非被要求这样做,否则不要使用)
--disable跳过指定检查对象(默认是无)
--display-logfile检测结束后显示日志文件内容
--enable对指定检测对象进行检查 (默认检测所有对象)
--hash使用指定的文件哈希函数
-h, --help显示帮助菜单
--lang, --language指定使用的语言(默认为英文)
--list列出可用的测试对象|使用语言|可检测的木马程序|perl模块状态|文件属性数据库
-l, --logfile写到指定的日志文件名
--noappend-log不追加日志,直接覆盖原日志文件
--nocf对于已跳过的检查对象不使用配置文件内容(仅适用于--disable选项)
--nocolors输出只显示黑白两色
--nolog不写入日志文件
--nomow, --no-mail-on-warning如果有警告信息,不发送邮件
--ns, --nosummary不显示检查结果的统计数据
--novl, --no-verbose-logging不显示详细记录
--pkgmgr使用特定的包管理器用于文件的哈希值验证
--propupd更新整个文件属性数据库或仅仅更新指定条目
-q, --quiet静默模式(根本不会有任何输出)
--rwo, --report-warnings-only只显示警告信息
--sk, --skip-keypress自动完成所有检测,跳过键盘输入
--summary显示检测结果的统计信息(这是默认值)
--syslog记录检测开始和结束时间到系统日志中
--tmpdir使用指定的临时目录
--unlock解锁(删除)锁定文件
--update检测文件的更新内容
--vl, --verbose-logging使用详细日志记录(默认情况下)
-V, --version显示版本信息
--versioncheck检测最新版本
-x, --autox自动检测是否使用执行权限
-X, --no-autox不检测执行权限是否可用

下面是通过rkhunter对某个系统的检测示例:

[root@localhost ~]# rkhunter -c --sk

rkhunter检查分为5个部分:

第一部分,先进行系统命令的检查,主要是检测系统的二进制文件,因为这些文件最容易被rootkit攻击。显示OK字样表示正常,显示Warning表示最近有改动或者有异常,需要引起注意,而显示“Not found”字样,一般无需理会

第二部分,主要检测常见的rootkit程序,显示“Not found”表示系统未感染此rootkit

第三部分,主要是一些特殊或附加的检测,例如对rootkit文件或目录检测、对恶意软件检测以及对指定的内核模块检测

第四部分,主要对网络、系统端口、系统启动文件、系统用户和组配置、SSH配置、文件系统等进行检测

第五部分,主要是对应用程序版本进行检测

最后一部分,这个部分其实是对上面输出作一个总结。通过这个总结,可以大概了解服务器目录的安全状态

在Linux终端使用rkhunter来检测,最大的好处在于每项的检测结果都有不同的颜色显示,如果是绿色的表示没有问题,如果是红色的,那就要引起关注了!如果想让检测程序每天定时运行,那么可以在/etc/crontab中加入如下内容:

#rkhunter检测程序在每天凌晨00:00分运行一次
[root@localhost ~]# crontab -e
0 0 * * * /usr/local/bin/rkhunter --check --cronjob

Q.E.D.