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 | 显示测试内容 |
-d | debug模式,显示检测过程的相关指令程序 |
-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 | 选择安装模板 | |
模板选择 | ||
- default | FHS 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.