Anti rootkit en Linux con rkhunter

Rootkit Hunter (rkhunter) es una herramienta de línea de comandos para Unix y Linux que realiza varias funciones de escaneado en el sistema con el fin de encontrar rootkits, exploits, backdoors, malware, modificaciones de comandos y librerías, scripts de arranque, configuración de red, etc.

Descarga de Rootkit Hunter

Última versión estable:

wget "http://downloads.sourceforge.net/project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz -O rkhunter-1.4.2.tar.gz
tar -xzvf rkhunter-1.4.2.tar.gz

Instalación de rkhunter

Tenemos varias opciones de instalación:

Instalación integrada en el sistema con todas las opciones por defecto

Simplemente ejecutamos como root el siguiente comando dentro de la carpeta descomprimida:

# ./installer.sh --install

La salida de la instalación debería ser la siguiente en caso de ir todo bien:

Checking system for:
 Rootkit Hunter installer files: found
 A web file download command: wget found
Starting installation:
 Checking installation directory "/usr/local": it exists and is writable.
 Checking installation directories:
  Directory /usr/local/share/doc/rkhunter-1.4.2: creating: OK
  Directory /usr/local/share/man/man8: exists and is writable.
  Directory /etc: exists and is writable.
  Directory /usr/local/bin: exists and is writable.
  Directory /usr/local/lib64: exists and is writable.
  Directory /var/lib: exists and is writable.
  Directory /usr/local/lib64/rkhunter/scripts: creating: OK
  Directory /var/lib/rkhunter/db: creating: OK
  Directory /var/lib/rkhunter/tmp: creating: OK
  Directory /var/lib/rkhunter/db/i18n: creating: OK
  Directory /var/lib/rkhunter/db/signatures: creating: OK
 Installing check_modules.pl: OK
 Installing filehashsha.pl: OK
 Installing stat.pl: OK
 Installing readlink.sh: OK
 Installing backdoorports.dat: OK
 Installing mirrors.dat: OK
 Installing programs_bad.dat: OK
 Installing suspscan.dat: OK
 Installing rkhunter.8: OK
 Installing ACKNOWLEDGMENTS: OK
 Installing CHANGELOG: OK
 Installing FAQ: OK
 Installing LICENSE: OK
 Installing README: OK
 Installing language support files: OK
 Installing ClamAV signatures: OK
 Installing rkhunter: OK
 Installing rkhunter.conf: OK
Installation complete

En este tipo de instalación ya tenemos el binario rkhunter en el path así que podemos invocarlo desde cualquier ruta del servidor. El archivo de configuración se encuentra en «/etc/rkhunter.conf«:

# whereis rkhunter
rkhunter: /etc/rkhunter.conf /usr/local/bin/rkhunter

Este modelo de instalación puede personalizarse cambiando rutas y otros parámetros:

  --examples       : Show layout examples.
  --layout  : 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.)

Instalación en modo standalone

Este modo de instalación permite instalar rkhunter en un único directorio, es decir, sin separar binarios, archivos de configuración, logs, etc.

Si quisiéramos instalar todo en la ruta /opt/rkhunter:

# ./installer.sh --layout custom /opt/rkhunter/ --install

Este es el proceso normal de instalación, todo correcto a excepción de un aviso que nos indica que la ruta no se encuentra en el path así que si no lo modificamos manualmente no podremos invocar el comando sin utilizar el path completo:

Note: Directory /opt/rkhunter//bin is not in your PATH

Checking system for:
 Rootkit Hunter installer files: found
 A web file download command: wget found
Starting installation:
 Checking installation directory "/opt/rkhunter/": it exists and is writable.
 Checking installation directories:
  Directory /opt/rkhunter//share/doc/rkhunter-1.4.2: creating: OK
  Directory /opt/rkhunter//share/man/man8: creating: OK
  Directory /opt/rkhunter//etc: creating: OK
  Directory /opt/rkhunter//bin: creating: OK
  Directory /opt/rkhunter//lib64: creating: OK
  Directory /opt/rkhunter//var/lib: creating: OK
  Directory /opt/rkhunter//lib64/rkhunter/scripts: creating: OK
  Directory /opt/rkhunter//var/lib/rkhunter/db: creating: OK
  Directory /opt/rkhunter//var/lib/rkhunter/tmp: creating: OK
  Directory /opt/rkhunter//var/lib/rkhunter/db/i18n: creating: OK
  Directory /opt/rkhunter//var/lib/rkhunter/db/signatures: creating: OK
 Installing check_modules.pl: OK
 Installing filehashsha.pl: OK
 Installing stat.pl: OK
 Installing readlink.sh: OK
 Installing backdoorports.dat: OK
 Installing mirrors.dat: OK
 Installing programs_bad.dat: OK
 Installing suspscan.dat: OK
 Installing rkhunter.8: OK
 Installing ACKNOWLEDGMENTS: OK
 Installing CHANGELOG: OK
 Installing FAQ: OK
 Installing LICENSE: OK
 Installing README: OK
 Installing language support files: OK
 Installing ClamAV signatures: OK
 Installing rkhunter: OK
 Installing rkhunter.conf: OK
Installation complete

Este método de instalación es interesante si vamos a probar la herramienta y no queremos integrarla en el sistema, así la podremos borrar fácilmente (eliminar directorio y listo). En el resto de casos, para eliminar rkhunter usaremos el parámetro –remove del instalador:

# ./installer.sh --remove

Utilización/Modo de uso

En el caso de que vayamos a utilizar rkhunter de forma proactiva, es necesario generar una base de datos en la que indiquemos a la herramienta el estado inicial (y correcto) del sistema sobre el cual comparar futuros análisis. El comando para generar la base de datos es el siguiente:

# rkhunter --propupd

[ Rootkit Hunter version 1.4.2 ]
File created: searched for 171 files, found 118

Para hacer un análisis básico del sistema, utilizamos el parámetro «-c» (check). Podemos personalizar el modo de análisis añadiendo o quitando diferentes tests. Actualmente, los test disponibles son los siguientes:

Current test names:
    additional_rkts all apps attributes avail_modules deleted_files
    filesystem group_accounts group_changes hashes hidden_ports hidden_procs
    immutable known_rkts loaded_modules local_host malware network
    none os_specific other_malware packet_cap_apps passwd_changes ports
    possible_rkt_files possible_rkt_strings promisc properties rootkits running_procs
    scripts shared_libs shared_libs_path startup_files startup_malware strings
    suspscan system_commands system_configs trojans

Grouped test names:
    additional_rkts => possible_rkt_files possible_rkt_strings 
    group_accounts  => group_changes passwd_changes 
    local_host      => filesystem group_changes passwd_changes startup_malware system_configs 
    malware         => deleted_files hidden_procs other_malware running_procs suspscan 
    network         => hidden_ports packet_cap_apps ports promisc 
    os_specific     => avail_modules loaded_modules 
    properties      => attributes hashes immutable scripts 
    rootkits        => avail_modules deleted_files hidden_procs known_rkts loaded_modules other_malware possible_rkt_files possible_rkt_strings running_procs suspscan trojans 
    shared_libs     => shared_libs_path 
    startup_files   => startup_malware 
    system_commands => attributes hashes immutable scripts shared_libs_path strings 

Current languages:
    cn de en tr tr.utf8 zh zh.utf8

Rootkits checked for:
    55808 Trojan - Variant A, AjaKit, aPa Kit, Adore, Apache Worm, Ambient (ark),
    Balaur, BeastKit, beX2, BOBKit, Boonana (Koobface.A), cb,
    CiNIK Worm (Slapper.B variant), CX, Danny-Boy's Abuse Kit, Devil, Dica, Dreams,
    Duarawkz, Enye LKM, Flea Linux, FreeBSD, Fu, Fuck`it,
    GasKit, Heroin LKM, HjC Kit, ignoKit, iLLogiC, Inqtana-A,
    Inqtana-B, Inqtana-C, IntoXonia-NG, Irix, Jynx, KBeast,
    Kitko, Knark, ld-linuxv.so, Li0n Worm, Lockit/LJK2, Mood-NT,
    MRK, Ni0, Ohhara, Optic Kit (Tux), OSXRK, Oz,
    Phalanx, Phalanx2, Portacelo, R3dstorm Toolkit, RH-Sharpe's, RSHA's,
    Scalper Worm, Shutdown, SHV4, SHV5, Sin, SInAR,
    Slapper, Sneakin, Solaris Wanuk, Spanish, Suckit, SunOS / NSDAP,
    SunOS Rootkit, Superkit, TBD (Telnet BackDoor), TeLeKiT, Togroot, T0rn,
    trNkit, Trojanit Kit, Turtle2, Tuxtendo, URK, Vampire,
    VcKit, Volc, w00tkit, weaponX, Xzibit, X-Org SunOS,
    zaRwT.KiT, ZK

De primeras, y ante la duda sobre tan abrumadora lista de pruebas, podemos lanzar un escaneo completo con todos los tests, así que lo ejecutamos:

# rkhunter -c --enable all

Es el  momento para «disfrutar» de la salida por pantalla (o temblar con incertidumbre jaja). Es todo muy «gráfico», en verde lo OK y en rojo los problemas. No os voy a poner aquí la salida completa del informe pero sí alguna parte para que veáis los chequeos que hace. Después de cada sección solicita pulsar «Enter» para continuar, así podemos revisar con tranquilidad.

Análisis de archivos de sistema, binarios, librerías…

Checking system commands...

  Performing 'strings' command checks
    Checking 'strings' command                               [ OK ]

  Performing 'shared libraries' checks
    Checking for preloading variables                        [ None found ]
    Checking for preloaded libraries                         [ None found ]
    Checking LD_LIBRARY_PATH variable                        [ Not found ]

  Performing file properties checks
    Checking for prerequisites                               [ OK ]
    /usr/local/bin/rkhunter                                  [ OK ]
    /usr/sbin/adduser                                        [ OK ]
    /usr/sbin/chkconfig                                      [ OK ]
    /usr/sbin/chroot                                         [ OK ]
    /usr/sbin/depmod                                         [ OK ]
    /usr/sbin/fsck                                           [ OK ]
    /usr/sbin/groupadd                                       [ OK ]
    /usr/sbin/groupdel                                       [ OK ]
    /usr/sbin/groupmod                                       [ OK ]
    /usr/sbin/grpck                                          [ OK ]
    /usr/sbin/ifdown                                         [ Warning ]
    /usr/sbin/ifup                                           [ Warning ]

[...]

Búsqueda de rootkits en todo el sistema:

Checking for rootkits...

  Performing check of known rootkit files and directories
    55808 Trojan - Variant A                                 [ Not found ]
    ADM Worm                                                 [ Not found ]
    AjaKit Rootkit                                           [ Not found ]
    Adore Rootkit                                            [ Not found ]
    aPa Kit                                                  [ Not found ]
    Apache Worm                                              [ Not found ]

[...]

Chequeos adicionales de rootkits, malware y específicos de Linux:

  Performing additional rootkit checks
    Suckit Rookit additional checks                          [ OK ]
    Checking for possible rootkit files and directories      [ None found ]
    Checking for possible rootkit strings                    [ None found ]

  Performing malware checks
    Checking running processes for suspicious files          [ Skipped ]
    Checking for login backdoors                             [ None found ]
    Checking for suspicious directories                      [ None found ]
    Checking for sniffer log files                           [ None found ]
    Suspicious Shared Memory segments                        [ None found ]
    Checking for Apache backdoor                             [ Not found ]

  Performing Linux specific checks
    Checking loaded kernel modules                           [ OK ]
    Checking kernel module names                             [ OK ]

[...]

Pruebas e inspeccion de la red y el host local: arranque de sistema, hostname, archivos de arranque en runlevels, malware en scripts de arranque, revisión de cuentas de usuario y grupos (passwd, shadow), usuarios sin password, configuración de ssh, filesystems…

Checking the network...
Performing checks on the network ports
 Checking for backdoor ports [ Skipped ]
Performing checks on the network interfaces
 Checking for promiscuous interfaces [ None found ]
Checking the local host...
Performing system boot checks
 Checking for local host name [ Found ]
 Checking for system startup files [ Found ]
 Checking system startup files for malware [ None found ]
Performing group and account checks
 Checking for passwd file [ Found ]
 Checking for root equivalent (UID 0) accounts [ None found ]
 Checking for passwordless accounts [ None found ]

Versión de aplicaciones críticas:

Checking application versions...

    Checking version of GnuPG                                [ OK ]
    Checking version of OpenSSL                              [ OK ]
    Checking version of OpenSSH                              [ OK ]

Y por fin el resumen final con el resultado de los chequeos. Junto a las estadísticas se muestra la ruta al fichero de log con toda la información almacenada para su revisión:

System checks summary
=====================

File properties checks...
    Files checked: 119
    Suspect files: 4

Rootkit checks...
    Rootkits checked : 296
    Possible rootkits: 0

Applications checks...
    Applications checked: 3
    Suspect applications: 0

The system checks took: 6 minutes and 50 seconds

All results have been written to the log file: /var/log/rkhunter.log

En este punto, lo importante es revisar cualquier problema que haya podido saltar en el análisis. Información extendida aparecerá en el log «/var/log/rkhunter.log»

Actualización de las bases de datos

Con el parámetro «–update» revisamos si hay actualizaciones (y actualizamos en caso afirmativo) referente a la información de rootkits, backdoors, malware, etc:

# rkhunter --update
[ Rootkit Hunter version 1.4.2 ]

Checking rkhunter data files...
  Checking file mirrors.dat                                  [ No update ]
  Checking file programs_bad.dat                             [ No update ]
  Checking file backdoorports.dat                            [ No update ]
  Checking file suspscan.dat                                 [ No update ]
  Checking file i18n/cn                                      [ No update ]
  Checking file i18n/de                                      [ No update ]
  Checking file i18n/en                                      [ No update ]
  Checking file i18n/tr                                      [ No update ]
  Checking file i18n/tr.utf8                                 [ No update ]
  Checking file i18n/zh                                      [ No update ]
  Checking file i18n/zh.utf8                                 [ No update ]

Falsos positivos y personalización

Como es lógico, pueden aparecer falsos positivos. Para ello tenemos el archivo de configuración «/etc/rkhunter.conf» donde se pueden personalizar todos los parámetros, por ejemplo añadiendo scripts o binarios en lista blanca (SCRIPTWHITELIST), configurar alertas por correo electrónico (MAIL-ON-WARNING), configuraciones de SSH (ALLOW_SSH_ROOT_USER), etc.

Después de cada cambio en la configuración hay que volver a actualizar la base de datos de rkhunter, sino aparecerán alertas y errores:

# rkhunter --propupd

Automatización de análisis

Para automatizar los análisis, simplemente añadimos una entrada en el cron de root que ejecute periódicamente el análisis según nuestros requerimientos. Podemos añadir el parámetro «–quiet» y «–cronjob» para evitar ruido al ser una ejecución desatendida. En este caso lo ejecutamos a las 8 de la mañana todos los días junto con un update por si hay actualizaciones:

crontab -u root -e
0 08 * * * /usr/bin/rkhunter --cronjob --update --quiet; /usr/bin/rkhunter --cronjob -c --enable all --quiet

Por supuesto, en lugar de añadirlo así al cron se puede crear un script más optimizado que realice el update y el chequeo según nuestros requerimientos. Después, basta con invocar ese script en el cron.

Como información adicional, os recomiendo realizar una revisión con las herramientas propias de sistema, por ejemplo una revisión de integridad de todos los paquetes instalados en el sistema. En RHEL, CentOS, Fedora, etc podéis verificar la integridad y seguridad de ficheros con RPM. Y eso es todo por hoy. Suerte y espero que no tengáis mucha basurilla por vuestros sistemas ;)