Tres herramientas muy útiles: rkhunter
, chkrootkit
y unhide
.
rkhunter
Busca rootkits, puertas traseras y exploits. Al instalarlo, se
programa un escaneo diario, pero cuando instalamos las actualizaciones
de algunos programas, las firmas de rkhunter
quedan obsoletas, por
lo que empieza a mandar avisos.
Warning: The file properties have changed:
File: /usr/bin/md5sum
Current inode: 1093680 Stored inode: 475456
Current file modification time: 1285094009 (21-sep-2010 20:33:29)
Stored file modification time : 1267759792 (05-mar-2010 04:29:52)
Podemos actualizar las firmas de rkhunter
ejecutando:
$ sudo rkhunter --propupd
El motivo de que no se actualicen las firmas automáticamente es que es
responsabilidad del usuario asegurarse de que los ficheros del sistema
son genuinos y provienen de una fuente fiable. Cuando ejecutamos el
comando anterior, le estamos diciendo a rkhunter
que acepte las firmas
de los nuevos ficheros como válidas y a éstos como genuinos.
Directorios o ficheros ocultos
Si usamos Ubuntu, es posible que nos llegue un correo de aviso de
rkhunter
diciendo que ha encontrado una serie de directorios ocultos,
pero que son legítimos en Ubuntu. Por ejemplo:
Warning: Hidden directory found: /dev/.udev
Para solucionarlo, editamos el fichero de configuración
/etc/rkhunter.conf
y descomentamos, o añadimos, las líneas referentes
a dichos directorios:
ALLOWHIDDENDIR=/dev/.udev
Si en lugar de un directorio es un fichero, la directiva a utilizar es
ALLOWHIDDENFILE
.
Después de introducir los cambios, actualizamos rkhunter
:
$ sudo rkhunter --propupd
Actualización a 17 de marzo de 2013
La versión de los repositorios, la 1.3.8, tiene un pequeño fallo por el
cual los enlaces simbólicos no pueden ser ignorados mediante la
directiva ALLOWHIDDENFILES
, por lo que aparece un mensaje como el
siguiente:
Warning: Hidden file found: /dev/.initramfs: symbolic link to `/run/initramf`s
En la versión 1.4.0 ya está corregido, aunque aún no se encuentra en los repositorios en Ubuntu 12.04.2. Una alternativa es parchear el script[parchear el script].
Editamos el script en Python y vamos a la línea 846:
$ sudo vim +846 /usr/bin/rkhunter
Justo a continuación, deberemos comprobar si el fichero en un enlace simbólico, por lo que el código deberá queda así:
elif [ -d "${FNAME}" ]; then
#
# For the ALLOWHIDDENFILE option we need to allow
# a hidden symbolic link to a directory.
#
test "${OPT_NAME}" = "ALLOWHIDDENFILE" -a -h "${FNAME}" && continue
case "${OPT_NAME}" in
Ahora ya podemos añadir el fichero en el archivo de configuración
/etc/rkhunter.conf
:
ALLOWHIDDENFILE="/dev/.initramfs"
Y actualizar la base de datos de firmas:
$ sudo rkhunter --propupd
Si usamos algún programa que comprueba la integridad de los ficheros,
como por ejemplo tiger
, es posible que recibamos una aviso como el
siguiente:
NEW: --FAIL-- [lin005f] Installed file '/usr/bin/rkhunter' checksum differs from installed package 'rkhunter'.
Comandos que cambian a scripts
Si se añade un script al PATH
del sistema o sustituye a algún
comando, rkhunter
también nos lo notificará. Por ejemplo:
Warning: The command '/sbin/chkconfig' has been replaced by a script: /sbin/chkconfig: a /usr/bin/perl script text executable
Si estamos seguros de que el cambio es legítimos, podemos añadir la
siguiente línea en /etc/rkhunter.conf
:
SCRIPTWHITELIST=/sbin/chkconfig
Después de introducir los cambios, actualizamos rkhunter
:
$ sudo rkhunter --propupd
rkhunter
y reiserfs
Si nuestro sistema de ficheros es reiserfs
, o xfs
, y hemos instalado
el paquete e2fsprogs
, el cual contiene herramientas para trabajar con
sistemas de ficheros ext2
, ext3
y ext4
, es posible que recibamos
un aviso que se queja de lsattr
:
Warning: Checking for prerequisites [ Warning ]
No output from the 'lsattr' command - all file immutable-bit checks
will be skipped.
La solución pasa por editar el fichero /etc/rkhunter.conf
, buscar
la directiva DISABLE_TESTS
y añadir el parámetro immutable
al final.
A continuación, actualizamos rkhunter
:
$ sudo rkhunter --propupd
chkrootkit
...detecta rootkits. Por defecto, sólo se ejecuta cuando lo lanzamos
nosotros. Para que se realice un escaneo diario, modificaremos el
fichero /etc/chkrootkit.conf
:
RUN_DAILY="true"
Actualizado el 2 de noviembre de 2013
En los reportes de chkrootkit
es posible que nos llegue el aviso de
que el archivo /sbin/init
está infectado:
Warning: /sbin/init INFECTED
Parece ser un fallo en chkrootkit
, ya que para determinar si el
archivo /sbin/init
está infectado, lo que hace es buscar la cadena
"HOME" el el fichero, mediante el comando strings
:
$ strings /sbin/init | egrep HOME
XDG_CACHE_HOME
XDG_CONFIG_HOME
El fallo está presente al menos en la versión 0.49, que es la que hay disponible en los repositorios de Ubuntu Saucy Salamander. Una manera de evitar el aviso es buscar el siguiente trozo de código, alrededor de la línea 1005:
if [ ${SYSTEM} != "HP-UX" ] && ( ${strings} ${ROOTDIR}sbin/init | ${egrep} HOME ||
cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
Y sustituirlo por:
if [ ${SYSTEM} != "HP-UX" ] && ( cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
unhide
Detecta procesos ocultos y puertas traseras, basándose en la
información obtenida de /proc
, /bin/ps
y syscalls
, y de los
puertos activos que no aparecen según /bin/netstat
.
En la versión unhide-20100201-1, para el listado de procesos,
comprueba los resultados de /bin/ps
, ejecutándolo de las siguientes
maneras:
// we are looking only for real process not thread and only one by one
#define COMMAND "ps --no-header -p %i o pid"
// we ara looking for session ID one by one
#define SESSION "ps --no-header -s %i o sess"
// We are looking for group ID one by one
// but ps can’t select by pgid
#define PGID "ps --no-header -eL o pgid"
// We are looking for all processes even threads
#define THREADS "ps --no-header -eL o lwp"
// for sysinfo scanning, fall back to old command, as --no-header seems to create
// an extra process
#define SYS_COMMAND "ps -eL o lwp"
En escaneo de puertos utiliza los resultados de /bin/netstat
:
// Linux
char tcpcommand[]= "netstat -tan | sed -e '/[\\.:][0-9]/!d' -e 's/.*[\\.:]\\([0-9]*\\) .*[\\.:].*/\\1/'" ;
char udpcommand[]= "netstat -uan | sed -e '/[\\.:][0-9]/!d' -e 's/.*[\\.:]\\([0-9]*\\) .*[\\.:].*/\\1/'" ;
Podemos lograr que se ejecute periódicamente añadiendo al crontab
algo como:
0 8 * * * unhide-linux26 proc 2>&1 | mail -s "Daily unhide-linux26 proc Scan" user@example.com
30 8 * * * unhide-linux26 sys 2>&1 | mail -s "Daily unhide-linux26 sys Scan" user@example.com
0 9 * * * unhide-linux26 brute 2>&1 | mail -s "Daily unhide-linux26 brute Scan" user@example.com
30 9 * * * unhide-tcp 2>&1 | mail -s "Daily unhide-tcp Scan" user@example.com