Rootkit Hunter Sourcecode Learning

目录

1. Rootkit Hunter Introduce()
2. Source Code Frame()
3. do_system_check_initialisation() 
4. do_system_commands_checks()
5. do_rootkit_checks()
6. do_network_checks()
7. do_local_host_checks()
8. do_app_checks()

 

1. Rootkit Hunter Introduce

rkhunter (Rootkit Hunter) is a Unix-based tool that scans for

1. rootkits
2. backdoors
3. possible local exploits

It does this by

1. comparing SHA-1 hashes of important files with known good ones in online databases
2. searching for default directories (of rootkits)
3. searching for wrong permissions
4. searching for hidden files
5. searching for suspicious strings in kernel modules
6. searching for special tests for Linux and FreeBSD

Relevant Link:

http://en.wikipedia.org/wiki/Rkhunter
http://netsecurity.51cto.com/art/201012/240038.htm
http://linux.vbird.org/linux_security/0420rkhunter.php

 

2. Source Code Frame

0x1: 源代码结构

rkhunter的源代码是bash代码,对于rkhunter,所有的检测逻辑都在do_system_check()函数中,do_system_check由很多子函数组成,分别从不同方面完成rootkit的检测功能 ,总体来说,rkhunter的代码逻辑流程如下

0x2: rkhunter的功能特性

1. 基于指纹库思想的rootkit检测
    1.1 建立了一个已知rootkit的默认目录名、文件名列表,通过默认文件名、目录名特征这个维度对rootkit进行检测
    1.2 通过检查某个文件或目录是否存在来判断对应的rootkit病毒是否存在(FILESCAN)
    1.3 在文件系统中搜索rootkit常用的文件名(SUSP_FILES_INFO)
    1.4 检测是否有已知的sniffer(嗅探器)的日志文件存在(SNIFFER_FILES)
    1.5 检测是否有已知的LKM Rootkit对应的.so文件存在(LKM_BADNAMES)
    1.6 检查自从上次运行rkhunter以来,/etc/passwd的内容文件有没有变化
    1.7 检查是否存在"逻辑rootkit",即通过减低指定系统配置或软件的安全配置来构建逻辑后门rootkit

2. 基于可疑字符串的指令劫持检测
    2.1 检查某个"二进制系统命令"是否否存在某个字符串,如存在则有危险(STRINGSCAN)
    2.2 依次用一些rootkit病毒的文件名或路径做参数调用strings命令,看其是否能正常输出
    2.3 检查和动态链接库预加载相关的环境变量
        1) LD_PRELOAD
        2) LD_AOUT_PRELOAD
        3) LD_ELF_PRELOAD
        4) /etc/ld.so.preload
        5) LD_LIBRARY_PATH

3. 基于可疑字符串的Linux启动文件恶意修改、劫持检测
    3.1 检查某个"二进制启动文件"是否存在某个字符串,如存在则有危险(STRINGSCAN、RCLOCATIONS)
    3.2 在系统启动文件中搜索特定的字符串,如果搜到,则说明有危险(RCLOCAL_STRINGS)

4. 基于异常文件目录属性特征的rootkit检测
    1) 检查系统命令程序文件的ACL属性
        1.1) 异常-s标志位
        1.2) 权限开放过大(任意用户可执行)
        1.3) 异常的隐藏标志位
        1.4) 可疑文件修改时间 
    2) 检查敏感文件的HASH值是否和标准的一致(需要建立一个标准黄金基准列表),以确定这些系统命令是否被篡改过

5. 基于网络异常状态监控的rootkit检查
    1) 检查指定端口上监听的程序是否在白名单中(正常的程序只会listen在指定的端口上)
    2) 检查是否有白名单之外的程序在进行流程sniffer

6. 基于系统账户、组异常权限检查的rootkit监控
    1) 检查/etc/passwd中是否有白名单之外的"超级用户(uid)",这是一种异常现象
    2) 检查是否存在无密码账户

 

3. do_system_check_initialisation()

初始化rootkit常用的默认文件名、目录名特征、rootkit特征

1) 已知的rootkit的文件名、目录名特征
不管是什么rootkit,它一定会或多或少地在磁盘目录下留下一些文件和目录,"文件、目录指纹特征库"的目的就是从这个最终结果的角度去检测是否存在rootkit的嫌疑
    1.1) W55808A(55808 Variant A)
    1.2) AKIT(Adore rootkit)
    1.3) AJAKIT(AjaKit Rootkit)
    1.4) APAKIT(aPa Kit Rootkit)
    1.5) APACHEWORM(Apache Worm)
    1.6) ARK(Ambient (ark) Rootkit)
    1.7) BALAUR(Balaur Rootkit 2.0 (LRK5 based))
    1.8) BEASTKIT(Beastkit Rootkit)
    1.9) BEX(beX2 Rootkit)
    1.10) BOBKIT(BOBkit Rootkit)
    1.11) BOONANA(OSX Boonana-A Trojan (aka Koobface.A))
    1.12) CB(cb Rootkit (w00tkit by ZeeN))
    1.13) CINIK(CiNIK Worm (Slapper.B variant))
    1.14) CXKIT(CX Rootkit)
    1.15) DANNYBOYS(Danny-Boy's Abuse Kit)
    1.16) DEVIL(Devil Rootkit)
    1.17) DICA(Dica-Kit (T0rn variant) Rootkit)
    1.18) DREAMS(Dreams Rootkit)
    1.19) DUARAWKZ(Duarawkz Rootkit)
    1.20) ENYELKM(ENYE LKM v1.1, v1.2)
    1.21) FLEA(Flea Linux Rootkit)
    1.22) FREEBSD_RK(FreeBSD Rootkit)
    1.23) FU(Fu Rootkit)
    1.24) FUCKIT(Fuckit Rootkit)
    1.25) GASKIT(GasKit Rootkit)
    1.26) HEROIN(Heroin LKM)
    1.27) HJCKIT(HjC Kit Rootkit)
    1.28) IGNOKIT(ignoKit Rootkit)
    1.29) ILLOGIC(iLLogiC Rootkit (SunOS Rootkit variant))
    1.30) INQTANAA(OSX Inqtana (Variant A))
    1.31) INQTANAB(OSX Inqtana (Variant B))
    1.32) INQTANAC(OSX Inqtana (Variant C))
    1.32) INTOXONIA(IntoXonia-NG Rootkit)
    1.33) IRIXRK(Irix Rootkit (for Irix 6.x))
    1.34) JYNX(Jynx Rootkit)
    1.35) KBEAST(KBeast (Kernel Beast) Rootkit)
    1.36) KITKO(Kitko Rootkit)
    1.37) KNARK(Knark Rootkit)
    1.38) LINUXV(ld-linuxv.so (LD_PRELOAD shared library rootkit))
    1.39) LION(Lion Worm)
    1.40) LOCKIT(Lockit Rootkit (aka LJK2))
    1.41) MRK(MRK (MiCrobul?) RootKit (based on Devil RootKit, also see Xzibit))
    1.42) MOODNT(Mood-NT Rootkit)
    1.43) NIO(Ni0 Rootkit)
    1.44) OHHARA(Ohhara Rootkit)
    1.45) OPTICKIT(Optic Kit (Tux variant) Rootkit)
    1.46) OSXRK(OSX Rootkit 0.2.1 (OSXRK))
    1.47) OZ(Oz Rootkit)
    1.48) PHALANX(Phalanx Rootkit)
    1.49) PHALANX2(Phalanx2 Rootkit)
    1.50) PORTACELO(Portacelo Rootkit)
    1.51) REDSTORM(R3dstorm Toolkit)
    1.52) RHSHARPES(RH-Sharpe's Rootkit)
    1.53) RSHA(RSHA's Rootkit)
    1.54) SHUTDOWN(Shutdown Rootkit)
    1.55) SCALPER(Scalper (FreeBSD.Scalper.Worm) Worm)
    1.56) SHV4(SHV4 Rootkit)
    1.57) SHV5(SHV5 Rootkit)
    1.58) SINROOTKIT(Sin Rootkit)
    1.59) SLAPPER(Slapper Worm)
    1.60) SNEAKIN(Sneakin Rootkit)
    1.61) WANUKDOOR(Solaris Wanuk backdoor)
    1.62) WANUKWORM(Solaris Wanuk Worm (ELF_WANUK.A))
    1.63) SPANISH(Spanish' Rootkit)
    1.64) SUCKIT(Suckit Rootkit)
    1.65) NSDAP(SunOS / NSDAP Rootkit)
    1.66) SUNOSROOTKIT(SunOS Rootkit)
    1.67) SUPERKIT(Superkit Rootkit (Suckit 1.3b-based))
    1.68) TBD(Telnet Backdoor)
    1.69) TELEKIT(TeLeKiT Rootkit)
    1.70) TOGROOT(OSX Togroot Rootkit)
    1.71) TORN(T0rn (and misc) Rootkit)
    1.72) TRNKIT(trNkit Rootkit)
    1.73) TROJANIT(Trojanit Kit Rootkit)
    1.74) TURTLE(Turtle / Turtle2 Rootkit)
    1.75) TUXTENDO(Tuxtendo (Tuxkit) Rootkit)
    1.76) URK(Universal Rootkit by K2 (URK) Release 0.9.8)
    1.77) VCKIT(VcKit Rootkit)
    1.78) VAMPIRE(Vampire Rootkit)
    1.79) VOLC(Volc Rootkit)
    1.80) WEAPONX(weaponX 0.1)
    1.81) XZIBIT(Xzibit Rootkit)
    1.82) XORGSUNOS(X-Org SunOS Rootkit)
    1.83) ZARWT(zaRwT.KiT Rootkit)
    1.84) ZK(ZK Rootkit)
    1.85) LOGIN(Miscellaneous login backdoors)
    1.86) SUSPICIOUS(Suspicious directories)

2) STRINGSCAN(Evil strings)检查某个二进制系统命令或启动文件总是否存在某个字符串,如存在则有危险 
很多rootkit启动后,会将系统默认的指令程序替换为携带恶意后门代码的同名指令程序,从常规的做法来看,我们可以通过建立一个"MD5哈希列表"来对关键目录下的指令程序进行完整性检测(事实上这也是一个最好的方法,但是问题就
是如果考虑到跨版本、跨内核、用户自定义等因素,系统下的指令程序可能会有很多版本,用MD5完整性检测的方法可能会有问题),而rkhunter采用了另一种思考方式,从替换后的行为结果的角度来对这类指令劫持、替换的攻击进行检测
2.1) crond crond:LOGNAME=root:Illogic Rootkit (其中crond是二进制命令的文件名,LOGNAME=root是要搜索的字符串,Illogic Rootkit是rootkit病毒的描述) 2.2) hostname hostname:phalanx:Phalanx Rootkit 2.3) init init:/dev/proc/fuckit:Fuckit Rootkit init:FUCK:Suckit Rootkit init:backdoor:Suckit Rootkit (backdoored init file) init:/usr/bin/rcpc:Portacelo Rootkit init:/usr/sbin/login:trNkit Rootkit ulogin 2.4) killall killall:/dev/ptyxx/.proc:Ambient (ark) Rootkit 2.5) login login:vt200:Linux Rootkit (LRK4) login:/usr/bin/xstat:Linux Rootkit (LRK4) login:/bin/envpc:Linux Rootkit (LRK4) login:L4m3r0x:Linux Rootkit (LRK4) login:/lib/libext:SHV4 Rootkit login:/usr/sbin/login:Flea Linux Rootkit login:/usr/lib/.tbd:TBD Rootkit login:sendmail:Ambient (ark) Rootkit login:cocacola:cb Rootkit login:joao:Spanish Rootkit 2.6) ls ls:/dev/ptyxx/.file:Dica-Kit Rootkit ls:/dev/ptyxx/.file:Ambient (ark) Rootkit ls:/dev/sgk:Linux Rootkit (LRK4) ls:/var/lock/subsys/...datafile...:Ohhara Rootkit ls:/usr/lib/.tbd:TBD Rootkit 2.7) netstat netstat:/dev/proc/fuckit:Fuckit Rootkit netstat:/lib/.sso:Dica-Kit Rootkit netstat:/var/lock/subsys/...datafile...:Ohhara Rootkit netstat:/dev/caca:MRK Rootkit netstat:/dev/ttyoa:Sin Rootkit netstat:/usr/lib/ldlibns.so:Flea Linux Rootkit netstat:/dev/ptyxx/.addr:Ambient (ark) Rootkit netstat:syg:Trojaned netstat 2.8) nscd nscd:sshd_config:Backdoor shell installed (SSH) 2.9) ps ps:/var/lock/subsys/...datafile...:Ohhara Rootkit or Ni0 Rootkit ps:/dev/pts/01:Universal Rootkit (URK) ps:tw33dl3:SunOS Rootkit ps:psniff:SunOS Rootkit ps:uconf.inv:Universal Rootkit (URK) ps:lib/ldlibps.so:Flea Linux Rootkit or Universal Rootkit (URK) pstree:/usr/lib/ldlibpst.so:Flea Linux Rootkit ps:libproc.so.2.0.7:Fuckit Rootkit ps:/dev/ptyxx/.proc:Ambient (ark) Rootkit pstree:/dev/ptyxx/.proc:Ambient (ark) Rootkit 2.10) sshd sshd:/dev/ptyxx:OpenBSD Rootkit sshd:/.config:SHV4 Rootkit sshd:+\\$.*\\$\!.*\!\!\\$:Backdoored SSH daemon installed sshd:backdoor.h:Trojaned SSH daemon sshd:backdoor_active:Trojaned SSH daemon sshd:magic_pass_active:Trojaned SSH daemon sshd:/usr/include/gpm2.h:Trojaned SSH daemon sshd:/usr/include/openssl:Trojaned SSH daemon sshd:aion:Trojaned SSH daemon sshd:pcszPass:Trojaned SSH daemon sshd:LogPass:Trojaned SSH daemon sshd:Login_Check:Trojaned SSH daemon sshd:includes.h:Trojaned SSH daemon sshd:DecodeString:Trojaned SSH daemon sshd:EncodeString:Trojaned SSH daemon 2.11) rcfile rcfile:in.inetd:SHV4 Rootkit (rcfile表示要在启动文件中去搜索,in.inetd是要搜索的字符串,SHV4 Rootkit是rootkit病毒的描述) rcfile:+#<HIDE_.*>:Enye LKM rcfile:bin/xchk:Optic Kit (Tux) Worm rcfile:bin/xsf:Optic Kit (Tux) Worm rcfile:/usr/bin/ssh2d:Flea Linux Rootkit or Optic Kit (Tux variant) Rootkit or SunOS Rootkit rcfile:/usr/sbin/xntps:SHV4 Rootkit rcfile:ttyload:SHV5 Rootkit rcfile:/etc/rc.d/init.d/init:cb Rootkit or w00tkit Rootkit rcfile:usr/bin/xfss:Devil Rootkit rcfile:/usr/sbin/rpc.netinet:FreeBSD (FBRK) Rootkit rcfile:/usr/lib/.fx/cons.saver:FreeBSD (FBRK) Rootkit rcfile:/usr/lib/.fx/xs:FreeBSD (FBRK) Rootkit rcfile:/ssh2d:Illogic Rootkit or SunOS Rootkit rcfile:/dev/kmod:Illogic Rootkit or SunOS Rootkit rcfile:/crth.o:Illogic Rootkit or SunOS Rootkit rcfile:/crtz.o:Illogic Rootkit or SunOS Rootkit rcfile:/dev/dos:Illogic Rootkit or SunOS Rootkit rcfile:/lpq:Illogic Rootkit or SunOS Rootkit rcfile:/usr/sbin/rescue:Spanish Rootkit rcfile:/usr/lib/lpstart:SunOS NSDAP Rootkit or Universal Rootkit (URK) rcfile:/volc:Volc Rootkit rcfile:sourcemask:Rootkit component rcfile:/bin/vobiscum:Rootkit component rcfile:/usr/sbin/in.telnet:Rootkit component rcfile:/usr/bin/hdparm?-t1?-X53?-p:Xzibit Rootkit rcfile:/lib/.xsyslog:Flooder (Linux/Bckdr-RKC) component rcfile:/etc/.xsyslog:Flooder (Linux/Bckdr-RKC) component rcfile:/lib/.ssyslog:Flooder (Linux/Bckdr-RKC) component rcfile:/tmp/.sendmail:Flooder (Linux/Bckdr-RKC) component 3) FILESCAN 通过检查某个文件或目录是否存在来判断对应的rootkit病毒是否存在 3.1) 文件 file:/dev/sdr0:T0rn Rootkit MD5 hash database (file表示后面的字段是一个文件,/dev/sdr0就是要搜索的文件,后面的字段是rootkit病毒的描述) file:/dev/pisu:Rootkit component file:/dev/xdta:Dica-Kit Rootkit file:/dev/saux:Trojaned SSH daemon sniffer log file:/dev/hdx:Linux.RST.B infection file:/dev/hdx1:Linux.RST.B infection file:/dev/hdx2:Linux.RST.B infection file:/dev/ptyy:Rootkit component file:/dev/ptyu:Rootkit component file:/dev/ptyv:Rootkit component file:/dev/hdbb:Rootkit component file:/tmp/.syshackfile:Trojaned syslog daemon file:/tmp/.bash_history:Lite5-r Rootkit file:/usr/info/.clib:Backdoor component file:/usr/sbin/tcp.log:Sniffer log file:/usr/bin/take/pid:Trojaned SSH daemon file:/sbin/create:MzOzD Local backdoor file:/dev/ttypz:spwn login backdoor file:/var/log/tcp.log:beX2 Rootkit file:/usr/include/audit.h:beX2 Rootkit file:/usr/bin/sourcemask:Rootkit component file:/usr/bin/ras2xm:Rootkit component file:/dev/xmx:Dica-Kit Rootkit file:/usr/sbin/gpm.root:Rootkit component file:/bin/vobiscum:Rootkit component file:/bin/psr:Rootkit component file:/dev/kdx:Rootkit component file:/dev/dkx:Rootkit component file:/usr/sbin/sshd3:Rootkit component file:/usr/sbin/jcd:Rootkit component file:/etc/rc.d/init.d/jcd:Rootkit component file:/usr/sbin/atd2:Rootkit component file:/home/httpd/cgi-bin/linux.cgi:Dica-Kit Rootkit file:/home/httpd/cgi-bin/psid:Dica-Kit Rootkit file:/home/httpd/cgi-bin/void.cgi:Dica-Kit Rootkit file:/etc/rc.d/init.d/system:Rootkit component file:/etc/rc.d/rc3.d/S93users:Rootkit component file:/tmp/.ush:Dica-Kit Rootkit file:/usr/lib/libhidefile.so:HIDEFILE envvar file-hiding library file:/etc/cron.d/kmod:Illogic Rootkit file:/usr/lib/dmis/dmisd:Trojaned SSH daemon file:/lib/secure/libhij.so:Solaris Trojaned SSH daemon file:/usr/sbin/sshd3:Rootkit component file:/etc/rc.d/init.d/crontab:Rootkit component file:/etc/rc.d/init.d/jcd:Rootkit component file:/usr/sbin/atd2:Rootkit component file:/etc/rc.d/rc5.d/S93users:Rootkit component file:/usr/include/mysql/mysql.hh1:Rootkit component file:/etc/init.d/xfs3:Rootkit component file:/usr/sbin/t.txt:Opyum kit component file:/usr/sbin/change:Opyum kit component file:/usr/sbin/s:Opyum kit component file:/bin/f:Opyum kit component file:/bin/i:Opyum kit component file:/lib/libncom.so.4.0.1:ncom rootkit library file:/sbin/zinit:Rootkit component file:/tmp/pass_ssh.log:Trojaned SSH daemon file:/usr/include/gpm2.h:Trojaned SSH daemon file:/etc/ssh/.sshd_auth:Trojaned SSH daemon (logins) file:/usr/lib/.sshd.h:Trojaned SSH daemon (logins) file:/var/run/.defunct:Trojaned SSH daemon file:/etc/httpd/run/.defunct:Trojaned SSH daemon file:/usr/share/pci.r:Trojaned Syslog daemon file:/etc/cron.daily/dnsquery:Sniffer file:/usr/lib/libutil1.2.1.2.so:Trojaned SSH daemon component (hwclock binary) file:/bin/ceva:Trojaned SSH daemon (client binary) file:/sbin/syslogd%:Trojaned SSH daemon (sebd) file:/usr/include/shup.h:Trojaned SSH daemon (client binary) file:/etc/rpm/sshdOLD:Trojaned SSH daemon (original sshd binary) file:/etc/rpm/sshOLD:Trojaned SSH daemon (original ssh binary) file:/usr/share/passwd.h:Trojaned SSH daemon (default configuration) file:/lib/.xsyslog:Flooder (Linux/Bckdr-RKC) component file:/etc/.xsyslog:Flooder (Linux/Bckdr-RKC) component file:/lib/.ssyslog:Flooder (Linux/Bckdr-RKC) component file:/tmp/.sendmail:Flooder (Linux/Bckdr-RKC) component file:/usr/share/sshd.sync:Trojaned SSH daemon file:/bin/zcut:Trojaned SSH daemon file:/usr/bin/zmuie:Trojaned SSH daemon file:/lib/libkeyutils.so.1.9:Sniffer component file:/lib64/libkeyutils.so.1.9:Sniffer component file:/usr/lib/libkeyutils.so.1.9:Spam tool component file:/usr/lib64/libkeyutils.so.1.9:Spam tool component 3.2) 目录 dir:/dev/ptyas:Langsuir installation directory (dir表示后面的字段是一个目录,/dev/ptyas就是要搜索的目录) dir:/usr/bin/take:Trojaned SSH daemon dir:/usr/src/.lib:Rootkit component dir:/usr/share/man/man1/.1c:Eggdrop (IRC bot) dir:/lib/lblip.tk:T0rn Rootkit directory with backdoored SSH-configuration dir:/usr/sbin/...:Rootkit component dir:/usr/share/.gun:Rootkit component dir:/unde/vrei/tu/sa/te/ascunzi/in/server:Unknown rootkit dir:/usr/man/man1/..%%/.dir:Unknown rootkit dir:/usr/X11R6/include/X11/...:Unknown rootkit dir:/usr/X11R6/lib/X11/.fonts/misc/...:Unknown rootkit dir:/tmp/.sys:Rootkit component dir:/tmp/':Rootkit component dir:/tmp/.,:Rootkit component dir:/tmp/,.,:Rootkit component dir:/dev/shm/emilien:Rootkit component dir:/var/tmp/.log:Rootkit component dir:/tmp/zmeu/...%:Rootkit component dir:/var/log/ssh:Rootkit component dir:/dev/ida:Rootkit component dir:/var/lib/games/.src/ssk/shit:Rootkit component dir:/usr/lib/libshtift:Rootkit component dir:/usr/src/.poop:Ramen worm dir:/dev/wd4:IRC bot dir:/var/run/.tmp:Rootkit component dir:/usr/man/man1/lib/.lib:Rootkit component dir:/dev/portd:Rootkit component dir:/dev/...:Rootkit component dir:/usr/share/man/mansps:Rootkit component dir:/lib/.so:Rootkit component dir:/lib/.sso:Rootkit component dir:/usr/include/sslv3:Rootkit component dir:/dev/shm/sshd:Trojaned SSH daemon dir:/usr/share/locale/mk/.dev/sk:Sniffer dir:/usr/share/locale/mk/.dev:Sniffer dir:/usr/include/netda.h:Trojaned SSH daemon dir:/usr/include/.ssh:Trojaned SSH daemon dir:/usr/share/locale/jp/.%:IRC bot dir:/usr/share/.sqe:IRC bot" 4) RCLOCAL_STRINGS 在系统启动文件中搜索特定的字符串,如果搜到,则说明有危险 /usr/bin/rpc.wall:Linux Rootkit (LRK4) (其中/usr/bin/rpc.wall就是要搜索的字符串,后面的Linux Rootkit (LRK4)是对应的rootkit病毒说明) sshdd:GasKit Rootkit hidef:Knark Rootkit /usr/bin/.etc:Dica-Kit Rootkit 5) LKM_BADNAMES 搜索/lib/modules/`uname -r 2>/dev/null`(这个目录也可由用户在配置文件中指定)目录中是否存在已知的危险模块 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

 

4. do_system_commands_checks

该函数用来检查一些系统二进制命令和系统库文件,确保这些文件没有被篡改。因为后面的各项检查都会用到这些命令和库     

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

/*
2. shared_libs_check
该函数用来检查系统的动态链接库加载情况是否正常。 检查方法:
    1) 首先检查和预加载相关的三个环境变量:
        1.1) LD_PRELOAD
        1.2) LD_AOUT_PRELOAD
        1.3) LD_ELF_PRELOAD
    依次插入这三个环境变量到指定的动态库文件中,查看显示的结果是否在用户设置动态库白名单中,如果不在,则认为有危险
    2) 检查/etc/ld.so.preload
    检查方法同上
    3) 检查LD_LIBRARY_PATH
    在两种情况
        3.1) export LD_LIBRARY_PATH
        3.2) unset LD_LIBRARY_PATH
    下分别用ldd命令去测试find、ps、strings、md5sum、ls、stat命令(常常被替换的指令程序),并比较两种情况下的输出结果是否相同(忽略地址),如果不相同,则说明有危险
*/
shared_libs_check

/*
3. file_properties_check
该函数用来检查系统命令文件的属性、hash值等,以确定这些系统命令是否被篡改过
*/
file_properties_check

 

5. do_rootkit_checks

该函数用来检查rootkit病毒和木马

/*
1. rootkit_file_dir_checks
该函数通过检查和已知rootkit病毒相关联的文件或目录或内核符号是否存在来确定该rootkit病毒是否存在(即还是判断对应文件、目录是否存在的思路) 
*/
rootkit_file_dir_checks
check_test known_rkts || check_test all && keypresspause

/*
2. 该函数用来补充检查rootkit。依次调用如下子函数:
    2.1 suckit_extra_checks
    该函数用来专门检查suckit病毒,检查方法:
        1) 查看/sbin/init文件有几个硬链接,如果硬链接数大于1,则有可能存在suckit病毒。
        2) 查看以xrk和mem为后缀的文件是否被隐藏。方法是:
            2.1) 分别新建两个以xrk和mem为后缀的临时文件,然后查看其是否存在
            2.2) 如果不存在,则说明该文件被隐藏了,可能存在suckit病毒
        3) 测试skdet命令是否存在,如果存在,则对该命令进行一些测试,根据其结果判断是否存在suckit病毒

    2.2 possible_rootkit_file_dir_checks 
    该函数用来检查一些特定的rootkit是否存在。检查方法是:
        1) 通过检查某个文件或目录是否存在来判断对应的rootkit病毒是否存在。使用的数据(存在变量FILESCAN中)格式例如:
        file:/dev/sdr0:T0rn Rootkit MD5 hash database 
            1.1) file表示后面的字段是一个文件
            1.2) /dev/sdr0就是要搜索的文件
            1.3) 后面的字段是rootkit病毒的描述
        2) dir:/dev/ptyas:Langsuir installation directory 
            2.1) dir表示后面的字段是一个目录
            2.2) /dev/ptyas就是要搜索的目录

    3.3 possible_rootkit_string_checks
    该函数用来检查某个二进制系统命令或启动文件总是否存在某个字符串,如存在则有危险 ,使用的数据(存在变量STRINGSCAN中)格式例如: 
        1) crond:LOGNAME=root:Illogic Rootkit
            1.1) crond是二进制命令的文件名
            1.2) LOGNAME=root是要搜索的字符串
            1.3) Illogic Rootkit是rootkit病毒的描述
        2) rcfile:in.inetd:SHV4 Rootkit
            2.1) rcfile表示要在启动文件中去搜索
            2.2) in.inetd是要搜索的字符串
            2.3) SHV4 Rootkit是rootkit病毒的描述
        3) 默认要搜索的启动文件(定义在变量RCLOCATIONS中)包括如下文件和目录,用户也可通过配置文件自己指定要搜索的启动文件和目录(定义STARTUP_PATHS字段)
            3.1) RCLOCATIONS=/etc/rc.d /etc/rc.local
            3.2) /usr/local/etc/rc.d
            3.3) /usr/local/etc/rc.local
            3.4) /etc/conf.d/local.start
            3.5) /etc/init.d
            3.6) /etc/inittab
        上面路径有些是目录,表示该目录下(递归包含子目录)所有的"普通文件"(且不为符号链接)都要进行搜索
*/
additional_rootkit_checks

/*
3. malware_checks
该函数用来检查malware病毒
*/
malware_checks

/*
4. trojan_checks
该函数用来检查木马。会依次进行以下检查:
    1. 检查/etc/inetd.conf文件
    2. 检查/etc/xinetd.conf文件
    3. 检查apache后门模块。方法是:
        1) 查看mod_rootme.so和mod_rootme2.so两个文件是否存在
        2) 若存在,查看httpd.conf文件中是否有mod_rootme2.so字符串存在,若存在则说明有问题
*/
trojan_checks

/*
5. os_specific_checks
该函数用来检查和操作系统相关的项目,对于linux系统来说,这里调用linux_specific_checks函数进行检查。依次调用如下函数进行检查:
    5.1 linux_loaded_modules
    该函数用来检查当前加载的内核模块。方法是:
        1) 测试lsmod命令的结果和/proc/modules文件中的内容是否一致,如果不一致则说明有危险,存在隐藏LKM的rootkit
    5.2 inux_avail_modules
    该函数用来检查系统中是否存有已知的危险模块。方法是:
        1) 搜索/lib/modules/`uname -r 2>/dev/null`(这个目录也可由用户在配置文件中指定)目录中是否存在已知的危险模块。危险模块的名称存放在LKM_BADNAMES变量中,内容如下:
            1.1) LKM_BADNAMES=adore.o
            1.2) bkit-adore.o
            1.3) cleaner.o
            1.4) flkm.o
            1.5) knark.o
            1.6) modhide.o
            1.7) mod_klgr.o
            1.8) phide_mod.o
            1.9) vlogger.o
            1.10) p2.ko
            1.11) rpldev.o
            1.12) xC.o
            1.13) strings.o
            1.14) wkmr26.ko
*/
os_specific_checks  

 

6. do_network_checks

该函数用来检查网络相关的内容

/*
1. do_network_port_checks
该函数用来检查网络端口,扫描是否有已知的后门端口被使用,检查原理是: 
1.1 在数据库文件backdoorports.dat中存放有多条后门端口的记录,格式如下:
<port>:<description>:protocol
    1) port表示端口号,其值在1-65535之间
    2) description是后门木马的描述
    3) protocol是协议类型,为TCP或者UDP
例如:    
1984:Fuckit Rootkit:TCP:
该条记录表示Fuckit Rootkit这个rootkit病毒以TCP协议的方式使用了1984端口

1.2真正的检查工作是在函数check_port_wl中完成的
    1) 程序从backdoorports.dat中依次读出每条记录,解析出端口和协议
    2) 用lsof命令来搜索以该协议方式使用该端口的进程(lsof -wnlP -i TCP:1984)并拿到其PID
    3) 根据这个PID得到进程名称
    4) 如果lsof命令没有搜索到以该协议方式使用该端口的进程或该端口在用户设置的白名单中,就说明没有危险,否则有危险(即正常情况下,已知的正常软件只会工作在已知的端口上,而已知的端口也只会跑已知的正常软件,如果
超出这个范围,则说明有可疑情况)
*/ do_network_port_checks /* 2. do_network_hidden_port_checks 该函数用来扫描隐藏端口。扫描时需要使用unhide-tcp命令 */ do_network_hidden_port_checks /* 3. do_network_interface_checks 该函数用来扫描是否有网络接口处于混杂模式和是否有抓包应用程序。 检查混杂模式的方法: 3.1 查看下面两个命令的输出结果: 1) ifconfig 2>&1 | awk 'BEGIN { RS="" }; /PROMISC/ { print }' 2) ip link | grep '^[0-9]' | grep -vE "^[0-9][0-9]*: (${IFWLIST}):" | grep 'PROMISC' 2.1) 其中IFWLIST变量存放的是白名单网络接口 如果上述两个命令的输出为空,则说明没有处于混杂模式的网络接口,否则存在处于混杂模式的网路接口 3.2 检查抓包程序的方法: 1) 先运行命令egrep -v '^sk|888e' /proc/net/packet | awk '{ print $9 }'得到一个inode列表,将其存放在变量INODE_LIST中。 2) 然后用命令lsof -lMnPw -d 1-20 | egrep "[ ](${INODE\_LIST})[ ]" | awk '{ print $2 }'得到各个inode对应的PID 3) 并利用/proc/$PID/exe或/proc/$PID/status文件得到进程名称。 4) 如果得到的进程名称没有在白名单列表中,则说明该进程就是抓包软件 (将网络连接情况映射到对应的具体程序) */ do_network_interface_checks

 

7. do_local_host_checks

该函数用来扫描本地主机

/*
1. do_system_startup_file_checks
该函数用来检查系统启动文件  
    1.1检查主机名:
        1) 先用hostname命令查看主机名
        2) 如果为空则用uname -n命令查看主机名
        3) 如果仍为空,说明有问题

    1.2 检查系统启动文件: 
        1) 检查方法是在系统启动文件中搜索特定的字符串,如果搜到,则说明有危险
        2) 要搜索的字符串存放在变量RCLOCAL_STRINGS中 
*/
do_system_startup_file_checks

/*
2. do_group_accounts_check
该函数用来检查系统帐户和组
    2.1 先检查/etc/passwd文件是否存在且为非空白文件,如果不存在或为空则告警。
    2.2 找出/etc/passwd文件中uid为0(即拥有root权限)的所有帐户的帐户名(用命令grep '^[^:]*:[^:]*:0:' /etc/passwd | cut -d: -f1),如果这些帐户名不在用户设置的白名单中(root默认在白名单中),则说明存在
危险 2.3 检查所有的无密码帐户,分为两步: 1) 首先在shadow文件(/etc/shadow及tcb相关文件)中搜索空密码帐户:grep '^[^:]*::' ${SHADOW\_FILE} | cut -d: -f1 2) 然后在/etc/passwd文件中搜索空密码帐户:grep '^[^:]*::' /etc/passwd | cut -d: -f1 这两步中得到的结果,要忽略帐户名为"+"的帐户(这个和NIS/YP有关)并要进行白名单检查。如果仍然有空密码帐户,则有危险,需要告警 2.4 检查自从上次运行rkhunter以来,/etc/passwd的内容文件有没有变化 rkhunter脚本在运行后会在一个临时目录中保存当前系统的/etc/passwd文件。进行该项检查时,用diff命令来比较上次保存的passwd文件和系统当前的/etc/passwd文件,如果有变化则告警。 2.5 检查自从上次运行rkhunter以来,/etc/gourp的内容文件有没有变化 2.6 检查root帐户的shell的history 1) /root/.bash_history(bash) 2) /root/.sh_history(Korn) 3) /root/.history(C-shell) 4) /root/.zhistory(zsh) 四个文件是否存在,并且是否为符号链接文件,如果是则存在危险
*/ do_group_accounts_check /* 3. do_system_config_files_check 该函数用来检查指定系统软件的配置文件。当前检查的配置文件包括SSH和syslog 3.1 在/etc、/etc/ssh、/usr/local/etc、/usr/local/etc/ssh目录寻找SSH的配置文件sshd_config 3.2 查看sshd是否允许root用户用SSH登陆(sshd_config文件中PermitRootLogin字段)。看其和rkhunter配置文件中用户的设置(ALLOW_SSH_ROOT_USER字段)是否相同,不相同则告警。如果ALLOW_SSH_ROOT_USER字段没 有被设置,则rkhunter默认不允许root用户用SSH登陆。注意:sshd本身默认是允许root用户登陆的 3.3 查看sshd的协议版本是否为1(sshd_config文件中Protocol字段),若为1则告警 3.4 查看syslog守护程序是否在运行 1) 运行命令ps ax | egrep '(syslogd|syslog-ng)( |$)' | grep -v 'egrep' 2) 若结果为空,运行命令ps ax | egrep 'metalog( |$)' | grep -v 'egrep' 3) 若结果为空,运行命令ps ax | egrep 'socklog( |$)' | grep -v 'egrep' 4) 若结果为空,则告警。 5. 检查syslog的配置文件是否允许远程日志 */ do_system_config_files_check /* 4. do_filesystem_check 该函数用来检查文件系统的可疑文件 */ do_filesystem_check

 

8. do_app_checks

该函数用来检查一些特定的应用程序 

1. 本函数会用到一个数据库文件:programs_bad.dat
在这个文件中存放着多个已知的有BUG的应用程序的名称及其对应的版本号 ,本函数要检查的应用程序名称存放在变量APP_NAMES中,其定义如下:
    1) APP_NAMES=
    2) exim:Exim MTA
    3) gpg:GnuPG
    4) httpd:Apache
    5) named:Bind DNS
    6) openssl:OpenSSL
    7) php:PHP
    8) procmail:Procmail MTA
    9) proftpd:ProFTPD
    10) sshd:OpenSSH
其中冒号前面是应用程序的名称,冒号后面是描述信息

2. 本函数会用到的白名单:在rkhunter的配置文件/etc/rkhunter.conf中
字段APP_WHITELIST存放着用户指定的应用程序白名单
检查步骤:
    1) 用find命令找出APP_NAMES中包含的应用程序的全路径。
    2) 用各个应用程序得到其对应的版本号。
    3) 依次查看各个应用程序是否在白名单中,如果不在,则进行下一步检查。
    4) 依次在programs_bad.dat中搜索上述各个应用程序及其对应的版本号,如果搜到了,则说明该版本程序有问题,需要向用户告警

结束了do_app_checks之后,rkhunter的主代码逻辑基本结束,接下来就是显示检测结果的时候
Relevant Link:

http://blog.chinaunix.net/uid-26526735-id-3938319.html

 

Copyright (c) 2014 LittleHann All rights reserved

 

posted @ 2014-07-30 21:16  郑瀚Andrew  阅读(3108)  评论(0编辑  收藏  举报