回忆之城
生命在于折腾
posts - 575,comments - 9,trackbacks - 0

程序名称及版本:rkhunter-1.4.0

主程序正式开始:第18595
主程序会根据用户的参数请求决定是否升级数据库及检查最新版本,真正进行系统检查的是:do_system_check()

do_system_check()

{

该函数是用来检查系统的入口函数,它依次调用以下这些子函数来检查系统:

  • do_system_commands_checks
    该函数用来检查一些系统二进制命令和系统库文件,确保这些文件没有被篡改。因为后面的各项检查都会用到这些命令和库。
  • do_rootkit_checks
    该函数用来检查rootkit
  • do_network_checks
    该函数用来检查网络
  • do_local_host_checks
    该函数用来检查本地主机上的一些文件。如启动文件、密码文件等等。
  • do_app_checks
    该函数用来检查一些特定的应用程序。如apache服务器,sshd、dns服务器等等。

这些检查都完成后,会根据检查结果记录系统日志,并展示结果信息。
}

1.do_system_commands_checks()

{
该函数用来检查一些系统二进制命令和系统库文件,依次调用以下子函数来检查:

(1)strings_check

该函数是用来检查strings命令是否正常。 检查方法:依次用一些rootkit病毒的文件名或路径做参数调用strings命令,看其是否能正常输出,如果能,则说明没问题;如果不能,则说明strings命令可能被该rootkit病毒或木马篡改过,意图隐藏该rootkit病毒或木马。

(2)shared_libs_check

该函数用来检查系统的动态链接库文件是否正常。 检查方法:

  • 首先检查和预加载相关的三个环境变量:LD_PRELOAD、LD_AOUT_PRELOAD和LD_ELF_PRELOAD,依次插件这三个环境变量指定的动态库文件是否在用户设置动态库白名单中,如果不在,则认为有危险。
  • 检查/etc/ld.so.preload,检查方法同上。
  • 检查LD_LIBRARY_PATH:在两种情况(export LD_LIBRARY_PATH和unset LD_LIBRARY_PATH)下分别用ldd命令去测试find、ps、strings、md5sum、ls、stat命令,并比较两种情况下的输出结果是否相同(忽略地址)。如果不相同,则说明有危险。

(3)file_properties_check

该函数用来检查系统命令文件的属性、hash值等,以确定这些系统命令是否被篡改过。 检查方法比较复杂,以后再来看。
}

2.do_rootkit_checks()

{
该函数用来检查rootkit病毒和木马。依次调用如下子函数来检查:

(1)rootkit_file_dir_checks

该函数通过检查和已知rootkit病毒相关联的文件或目录或内核符号是否存在来确定该rootkit病毒是否存在。
该函数中定义了和各个rootkit病毒相关联的文件或目录或内核符号,并调用子函数来scanrootkit(真正检查的逻辑在这个函数里)来进行检查。

(2)additional_rootkit_checks

该函数用来补充检查rootkit。依次调用如下子函数:

  • suckit_extra_checks
    该函数用来专门检查suckit病毒。
    检查方法:
    (a)查看/sbin/init文件有几个硬链接,如果硬链接数大于1,则有可能存在suckit病毒。
    (b)查看以xrk和mem为后缀的文件是否被隐藏。方法是:分别新建两个以xrk和mem为后缀的临时文件,然后查看其是否存在。如果不存在,则说明该文件被隐藏了,可能存在suckit病毒。
    (c)测试skdet命令是否存在,如果存在,则对该命令进行一些测试,根据其结果判断是否存在suckit病毒。
  • possible_rootkit_file_dir_checks 
    该函数用来检查一些特定的rootkit是否存在。检查方法是:通过检查某个文件或目录是否存在来判断对应的rootkit病毒是否存在。 使用的数据(存在变量FILESCAN中)格式例如:
    file:/dev/sdr0:T0rn Rootkit MD5 hash database 
    file表示后面的字段是一个文件,/dev/sdr0就是要搜索的文件,后面的字段是rootkit病毒的描述dir:/dev/ptyas:Langsuir installation directory 
    dir表示后面的字段是一个目录,/dev/ptyas就是要搜索的目录
    不知道这里为什么的文件和目录检查不放在rootkit_file_dir_checks中去检查。可能是因为rootkit_file_dir_checks函数检查的rootkit对应多个文件和目录,而这里是一个rootkit只对应一个文件或目录。
  • possible_rootkit_string_checks
    该函数用来检查某个二进制系统命令或启动文件总是否存在某个字符串,如存在则有危险。 
    使用的数据(存在变量STRINGSCAN中)格式例如: 
    crond:LOGNAME=root:Illogic Rootkit
    其中crond是二进制命令的文件名,LOGNAME=root是要搜索的字符串,Illogic Rootkit是rootkit病毒的描述
    rcfile:in.inetd:SHV4 Rootkit
    rcfile表示要在启动文件中去搜索,in.inetd是要搜索的字符串,SHV4 Rootkit是rootkit病毒的描述
    默认要搜索的启动文件(定义在变量RCLOCATIONS中)包括如下文件和目录,用户也可通过配置文件自己指定要搜索的启动文件和目录(定义STARTUP_PATHS字段):

RCLOCATIONS="/etc/rc.d /etc/rc.local
/usr/local/etc/rc.d
/usr/local/etc/rc.local
/etc/conf.d/local.start
/etc/init.d
/etc/inittab"

上面路径有些是目录,表示该目录下(递归包含子目录)所有的“普通文件”(且不为符号链接)都要进行搜索。

(3)malware_checks

该函数用来检查malware(马威尔)病毒。

(4)trojan_checks

该函数用来检查木马。会依次进行一下检查:

  • 检查/etc/inetd.conf文件
  • 检查/etc/xinetd.conf文件
  • 检查apache后门模块。方法是查看mod_rootme.so和mod_rootme2.so两个文件是否存在,若存在,查看httpd.conf文件中是否有mod_rootme2?.so字符串存在,若存在则说明有问题。

(5)os_specific_checks

该函数用来检查和操作系统相关的项目,对于linux系统来说,这里调用linux_specific_checks函数进行检查。依次调用如下函数进行检查:

  • linux_loaded_modules
    该函数用来检查当前加载的内核模块。方法是:测试lsmod命令的结果和/proc/modules文件中的内容是否一致,如果不一致则说明有危险。
  • linux_avail_modules
    该函数用来检查系统中是否存有已知的危险模块。方法是:搜索/lib/modules/`uname -r 2>/dev/null`(这个目录也可由用户在配置文件中指定)目录中是否存在已知的危险模块。 危险模块的名称存放在LKM_BADNAMES变量中,内容如下:

LKM_BADNAMES="adore.o
bkit-adore.o
cleaner.o
flkm.o
knark.o
modhide.o
mod_klgr.o
phide_mod.o
vlogger.o
p2.ko
rpldev.o
xC.o
strings.o
wkmr26.ko"

}

3.do_network_checks()

{
该函数用来检查网络相关的内容。依次调用以下函数:

(1)do_network_port_checks

该函数用来检查网络端口,扫描是否有已知的后门端口被使用。 检查原理是: 在数据库文件backdoorports.dat中存放有多条后门端口的记录,格式如下:
<port>:<description>:protocol
port表示端口号,其值在1-65535之间
description是后门木马的描述
protocol是协议类型,为TCP或者UDP

实例:

1984:Fuckit Rootkit:TCP:

该条记录表示Fuckit Rootkit这个rootkit病毒以TCP协议的方式使用了1984端口。

真正的检查工作是在函数check_port_wl中完成的。程序从backdoorports.dat中依次读出每条记录,解析出端口和协议。然后用lsof命令来搜索以该协议方式使用该端口的进程(lsof -wnlP -i TCP:1984)并拿到其PID,根据这个PID得到进程名称。如果lsof命令没有搜索到以该协议方式使用该端口的进程或该端口在用户设置的白名单中,就说明没有危险,否则有危险。

(2)do_network_hidden_port_checks

该函数用来扫描隐藏端口。
扫描时需要使用unhide-tcp命令,但是centos上貌似没有这个命令,这里跳过此项检查。

(3)do_network_interface_checks

该函数用来扫描是否有网络接口处于混杂模式和是否有抓包应用程序。

  • 检查混杂模式的方法:
    查看下面两个命令的输出结果:
    ifconfig 2>&1 | awk 'BEGIN { RS="" }; /PROMISC/ { print }'
    ip link | grep '^[0-9]' | grep -vE "^[0-9][0-9]*: (${IFWLIST}):" | grep 'PROMISC'

其中第二条命令中的IFWLIST变量存放的是白名单网络接口。
如果上述两个命令的输出为空,则说明没有处于混杂模式的网络接口,否则存在处于混杂模式的网路接口。

  • 检查抓包程序的方法:
    先运行命令egrep -v '^sk|888e' /proc/net/packet | awk '{ print $9 }'得到一个inode列表,将其存放在变量INODE_LIST中。
    然后用命令lsof -lMnPw -d 1-20 | egrep "[ ](${INODE\_LIST})[ ]" | awk '{ print $2 }'得到各个inode对应的PID,并利用/proc/$PID/exe或/proc/$PID/status文件得到进程名称。
    如果得到的进程名称没有在白名单列表中,则说明该进程就是抓包软件。

}

4.do_local_host_checks()

{
该函数用来扫描本地主机,依次调用以下函数进行检查:

(1)do_system_startup_file_checks

该函数用来检查系统启动文件。

  • (A)检查主机名:
    先用hostname命令查看主机名,如果为空则用uname -n命令查看主机名,如果仍未空,说明有问题。
  • (B)检查系统启动文件:
    系统启动文件的说明见3.do_rootkit_checks()->(2)additional_rootkit_checks->possible_rootkit_string_checks中的说明。
    检查方法是在系统启动文件中搜索特定的字符串,如果搜到,则说明有危险。
    要搜索的字符串存放在变量RCLOCAL_STRINGS中,格式形如:
    /usr/bin/rpc.wall:Linux Rootkit (LRK4)
    其中/usr/bin/rpc.wall就是要搜索的字符串,后面的Linux Rootkit (LRK4)是对应的rootkit病毒说明。

(2)do_group_accounts_check

该函数用来检查系统帐户和组。

  • (A)首先检查/etc/passwd文件是否存在且为非空白文件,如果不存在或为空则告警。
  • (B)找出/etc/passwd文件中uid为0(即拥有root权限)的所有帐户的帐户名(用命令grep '^[^:]*:[^:]*:0:' /etc/passwd | cut -d: -f1),如果这些帐户名不在用户设置的白名单中(root默认在白名单中),则说明存在危险。
  • (C)检查所有的无密码帐户。
    分为两步:
    首先在shadow文件(/etc/shadow及tcb相关文件)中搜索空密码帐户:grep '^[^:]*::' ${SHADOW\_FILE} | cut -d: -f1
    然后在/etc/passwd文件中搜索空密码帐户:grep '^[^:]*::' /etc/passwd | cut -d: -f1
    这两步中得到的结果,要忽略帐户名为“+”的帐户(这个和NIS/YP有关)并要进行白名单检查。如果仍然有空密码帐户,则有危险,需要告警。
  • (D)检查自从上次运行rkhunter以来,/etc/passwd的内容文件有没有变化。
    rkhunter脚本在运行后会在一个临时目录中保存当前系统的/etc/passwd文件。进行该项检查时,用diff命令来比较上次保存的passwd文件和系统当前的/etc/passwd文件,如果有变化则告警。
  • (E)检查自从上次运行rkhunter以来,/etc/gourp的内容文件有没有变化。
    检查方法同上。
  • (F)检查root帐户的shell的history。
    依次检查/root/.bash_history、/root/.sh_history、/root/.history、/root/.zhistory四个文件是否存在,并且是否为符号链接文件,如果是则存在危险。
    说明:上述四个文件分别是bash、Korn、C-shell、zsh 这四种shell的历史文件。

(3)do_system_config_files_check

该函数用来检查某些系统软件的配置文件。当前检查的配置文件包括SSH和syslog。

  • (A)在/etc、/etc/ssh、/usr/local/etc、/usr/local/etc/ssh目录寻找SSH的配置文件sshd_config
  • (B)查看sshd是否允许root用户用SSH登陆(sshd_config文件中PermitRootLogin字段)。看其和rkhunter配置文件中用户的设置(ALLOW_SSH_ROOT_USER字段)是否相同,不相同则告警。如果ALLOW_SSH_ROOT_USER字段没有被设置,则rkhunter默认不允许root用户用SSH登陆。注意:sshd本身默认是允许root用户登陆的。
  • (C)查看sshd的协议版本是否为1(sshd_config文件中Protocol字段),若为1则告警。
  • (D)查看syslog守护程序是否在运行。
    运行命令ps ax | egrep '(syslogd|syslog-ng)( |$)' | grep -v 'egrep'
    若结果为空,运行命令ps ax | egrep 'metalog( |$)' | grep -v 'egrep'
    若结果为空,运行命令ps ax | egrep 'socklog( |$)' | grep -v 'egrep'
    若结果为空,则告警。
  • (E)检查syslog的配置文件是否允许远程日志。(这块要先去看下日志有关的基础知识才能理解。)

(4)do_filesystem_check

该函数用来检查文件系统的可疑文件。

}

5.do_app_checks()

{
该函数用来检查一些特定的应用程序。
本函数会用到一个数据库文件:programs_bad.dat,在这个文件中存放着多个已知的有BUG的应用程序的名称及其对应的版本号(貌似只要不是最新版本,都认为是有问题的)。
本函数要检查的应用程序名称存放在变量APP_NAMES中,其定义如下:

APP_NAMES="exim:Exim MTA
gpg:GnuPG
httpd:Apache
named:Bind DNS
openssl:OpenSSL
php:PHP
procmail:Procmail MTA
proftpd:ProFTPD
sshd:OpenSSH"

其中冒号前面是应用程序的名称,冒号后面是描述信息。
本函数会用到的白名单:在rkhunter的配置文件/etc/rkhunter.conf中,字段APP_WHITELIST存放着用户指定的应用程序白名单。
检查步骤:

  • 用find命令找出APP_NAMES中包含的应用程序的全路径。
  • 用各个应用程序得到其对应的版本号。
  • 依次查看各个应用程序是否在白名单中,如果不在,则进行下一步检查。
  • 依次在programs_bad.dat中搜索上述各个应用程序及其对应的版本号,如果搜到了,则说明该版本程序有问题,需要向用户告警。

}

posted on 2014-04-29 14:23 回忆之城 阅读(288) 评论(0)  编辑 收藏 引用 所属分类: unix/linux
只有注册用户登录后才能发表评论。