Guia de respuesta a incidentes en sistemas Linux

Escrito por Jose Rivera

6 julio, 2020

¿Cómo determinaría si su computadora o servidor ha sido comprometido? Si sospecha esto, este artículo ciertamente se aplica a usted. También se detallan varios comandos que todo usuario de Linux o experto en respuesta a incidentes debería conocer. Algunos de estos comandos también funcionan para Mac y Windows, por lo que es útil aprenderse estos consejos que puede que desee utilizar.

Contenido

  1. Mantenga la calma y no se asuste si ha sido atacado
  2. Mostrar una lista de los últimos usuarios registrados
    2.1 w o who
    2.2 Usar el comando last
    2.3 Último comando de un usuario
  3. Verifique las conexiones actuales de su computadora o servidor
    3.1 Netstat
    3.2 lsof
    3.3 strace
    3.4 Usando ps
    3.5 Verifique los procesos en ejecución con TOP
    3.6 Verifique los procesos en ejecución con HTOP
    3.7 Verifique las conexiones de SSH
    3.8 Puertos abiertos
  4. Estructuras del kernel
  5. Archivos del sistema que han cambiado recientemente
  6. Puntos de ataque comunes
  7. Revisión de registro de actividades en el sistema – logs
    7.1 Filtrado de archivos – Grep y zgrep
    7.2 Conteo de filas en archivo utilizando WC
  8. Crontab
    7.1 Ver Cronjobs específicos de software
    7.2 Listado de cron jobs de los usuarios cuando usan systemd timers
  9. Conclusión

Mantenga la calma y no se asuste si ha sido atacado

Si ha encontrado algo, no elimine nada ni realice ningún cambio todavía. Lo primero es empezar por clasificar la evidencia; no acceda a ningún archivo con cat o strings, catalogue los archivos y guárdelos. Una vez que comience a eliminar cosas, ya se puede investigar qué tan profundamente han penetrado. Mantenga la calma, investigue e investigue.

Busque rastros del atacante en el servidor, puede encontrar una IP o un archivo extraño. Diviértase, piense como un detective que busca evidencia en la escena del crimen. El juego consiste en averiguar lo más que pueda sobre el atacante. Una vez recolectada toda la evidencia, puede eliminar los archivos maliciosos de forma segura.

Claro, si en el servidor hay mucho dinero involucrado y es urgente lo mejor es contratar a un hacker ético o experto en ciberseguridad que le ayuden. Si tiene un negocio no se arriesgue y pida ayuda, hay leyes y seguros que le protegen únicamente si se recolecta la evidencia de manera adecuada

“Lo que hacen los hackers es pensar como los atacantes. Piensan con malicia como alterar el funcionamiento de los softwares y ayudan a empresas y a personas a protegerse de ellos a través de la educación. Debido a eso, tienen un fuerte deseo de compartir esta información con otros y de explicarla a las personas cuyo único motivo es el deseo de aprender"

Mostrar una lista de los últimos usuarios registrados

W o who

Lo primero que debe buscar es quién está actualmente conectado a su computadora. No es raro encontrar al atacante conectado al servidor al mismo tiempo que usted.


Usar el comando last

Este comando le permite desplegar una lista de los últimos usuarios conectados. El historial de este comando se remonta al inicio de la configuración de la computadora o servidor. (También puede determinar de inmediato cuánto tiempo tiene esta distribución de Linux).

last
last -h
Usage:
 last [options] [<username>...] [<tty>...]
Show a listing of last logged in users.
Options:
 -<number>            how many lines to show
 -a, --hostlast       display hostnames in the last column
 -d, --dns            translate the IP number back into a hostname
 -f, --file <file>    use a specific file instead of /var/log/wtmp
 -F, --fulltimes      print full login and logout times and dates
 -i, --ip             display IP numbers in numbers-and-dots notation
 -n, --limit <number> how many lines to show
 -R, --nohostname     don't display the hostname field
 -s, --since <time>   display the lines since the specified time
 -t, --until <time>   display the lines until the specified time
 -p, --present <time> display who were present at the specified time
 -w, --fullnames      display full user and domain names
 -x, --system         display system shutdown entries and run level changes
     --time-format <format>  show timestamps in the specified <format>:
                               notime|short|full|iso
 -h, --help           display this help
 -V, --version        display version

Último comando de un usuario

En caso de que un atacante tenga acceso a su computadora o servidor, es muy probable que hayan enviado un comando por SSH. El siguiente comando mostrará las últimas 100 líneas de comandos para el usuario actual. El 100 puede ser cambiado a cualquier valor que usted desee. Puede usar cat en vez de tail para leer todos los logs.

tail-n 200 ~ / .bash_history | more
cat ~ / .bash_history | more

Por supuesto, también puede usar un editor como vim o nano y salvar la respuesta para un análisis posterior. Le recomiendo también verificar el .bash_history de otros usuarios en la máquina, los cuales se encuentran en /home/USER, y que también investigue al usuario root.

sudo vim /home/USER_YOU_WANT_TO_VIEW/.bash_history

En el siguiente ejemplo le muestro unos comandos sospechosos encontrados en un servidor comprometido:

Lea esta noticia similar  Código fuente de Nissan filtrado a través de un servidor mal configurado
bash-history

Algunos de estos comandos no fueron ingresados por los usuarios, tampoco es normal que alguien implemente un servidor de HTTP, lo que posiblemente significó que se ingresaron archivos no conocidos al sistema. Y otros archivos de bash .sh posiblemente fueron establecidos para crear persistencia en la máquina.


Verifique las conexiones actuales de su computadora o servidor

Netstat


netstat --help
usage: netstat [-vWeenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
       netstat [-vWnNcaeol] [<Socket> ...]
       netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }
        -r, --route              display routing table
        -i, --interfaces         display interface table
        -g, --groups             display multicast group memberships
        -s, --statistics         display networking statistics (like SNMP)
        -M, --masquerade         display masqueraded connections
        -v, --verbose            be verbose
        -W, --wide               don't truncate IP addresses
        -n, --numeric            don't resolve names
        --numeric-hosts          don't resolve host names
        --numeric-ports          don't resolve port names
        --numeric-users          don't resolve user names
        -N, --symbolic           resolve hardware names
        -e, --extend             display other/more information
        -p, --programs           display PID/Program name for sockets
        -o, --timers             display timers
        -c, --continuous         continuous listing
        -l, --listening          display listening server sockets
        -a, --all                display all sockets (default: connected)
        -F, --fib                display Forwarding Information Base (default)
        -C, --cache              display routing cache instead of FIB
        -Z, --context            display SELinux security context for sockets
  <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
           {-x|--unix} --ax25 --ipx --netrom
  <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
  List of possible address families (which support routing):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) 
    x25 (CCITT X.25)

Si desea más información sobre netstat, puede usar la página man (manual)

man netstat

Normalmente un atacante instalará un programa que no hace nada excepto escuchar en su puerto de red determinadas instrucciones. Por ello, debe buscar cualquier proceso que esté esperando una conexión (LISTEN) o tenga una conexión abierta (ESTABLISHED) Si no reconoce estos procesos, use «strace» o «lsof» (debajo de un ejemplo) para intentar ver qué están haciendo.

Este comando le mostrará 2 partes, la primera es «Active Internet connections (w/o servers)«Y el segundo es «Active UNIX domain sockets (w/o servers)«

Verifique ambos con cuidado porque si tiene un script malicioso ejecutándose en algún sitio, este podría estar enviando correo no deseado (SPAM) o tratar de pivotear (saltar a otro servidor) a un servidor adyacente; esto es aún más común de lo que usted cree, sobre todo en redes adyacentes.

netstat | more

También puede usar netstat en WINDOWS. Para ello, abra cmd y use el mismo comando

netstat | more

A continuación muestro un ejemplo de cómo usar el comando sudo netstat -atnp. Este comando le dice a netstat que obtenga todos los sockets actualmente en uso (-a), enumere los sockets TCP (-t) y sus IP (-n) y números de proceso (-p) La primera imagen sin tener nada abierto, la segunda imagen cuando abrí unas pestañas en Chrome.

Este comando es muy útil en muchas situaciones, por ejemplo, en el pasado se podía ver las direcciones de las personas con las que usted hablaba en aplicaciones como Telegram o WhatsApp. Aunque hoy en día, esta vulnerabilidad ya ha sido parcheada.

sudo netstat -atnp | grep ESTA

Cuando se ingresa este comando devuelve una lista descendente de las IP conectadas a su máquina. Es normal ver hasta 50 conexiones por IP. Sin embargo, si ve IPs con más de 100 conexiones, debería de sentarse y analizar dicho tráfico.

netstat -ntu|awk '{print $5}'|cut -d: -f1 -s|sort|uniq -c|sort -nk1 -r

lsof

El comando lsof enumerará todos los procesos en red. Les recomiendo utilizarlo con la opción -i para mostrar los sockets abiertos

lsof -i

strace

Herramienta para depurar y solucionar problemas. Captura y registra todas las llamadas al sistema realizadas por un proceso y las señales recibidas por el mismo.

Si strace no está preinstalado en su sistema Linux, ejecute el comando apropiado a continuación para su distribución, para instalarlo.

Debian / Ubuntu

sudo apt install strace

RHEL / CentOS

yum install strace

Fedora 22+

dnf install strace

Después de instalar strace, podemos usar este comando para depurar y mostrar el proceso que queramos visualizar

strace -d -p <PID Number>

Usando ps

El comando PS (estado del proceso) es uno de los comandos más utilizados en Linux. Por lo general, se utiliza para obtener información más detallada sobre un proceso específico o todos los procesos. Por ejemplo, se usa para saber si un proceso en particular se está ejecutando o no, quién está ejecutando qué proceso en el sistema, qué proceso está utilizando una memoria o CPU más alta, cuánto tiempo se está ejecutando un proceso, etc.

ps aux

a = mostrar procesos para todos los usuarios u = muestra el usuario / propietario del proceso x = también muestra procesos no conectados a una terminal
u = muestra el usuario / propietario del proceso
x = también muestra procesos no conectados a una terminal

Lea esta noticia similar  Malware de Linux indetectable dirigido a servidores Docker con API expuestas

Verifique los procesos en ejecución con TOP

El comando top es una forma rápida de ver qué procesos consumen recursos. Top viene preinstalado en cada distribución de Linux, es interactivo, y puede navegar a través de la lista de procesos, eliminar un proceso, etc.

Para navegar puede usar las teclas de flecha y las teclas de página arriba / abajo. Para salir, puede presionar «q».

top

Verifique los procesos en ejecución con HTOP

htop es un visor de procesos interactivo y un monitor de recursos del sistema. Es una versión mejorada del comando top.

Tiene una increíble interfaz visual con la que también puede interactuar. Cuando inicies htop por primera vez, recibirás una interfaz colorida que muestra una lista de todos los procesos que se ejecutan en el sistema. Estos normalmente están ordenados por la cantidad de uso de CPU, ordenados de mayor a menor. También muestra el estado del uso de la CPU, la memoria física y de swap.


Eliminar un proceso sin salir de htop: presione F9 o k

Para eliminar un proceso, seleccione el proceso que debe eliminarse de la lista y presione F9 o k, que mostrará el menú «Enviar señal» que enumera todas las señales disponibles que puede enviar al comando.


Verifique las conexiones de SSH

Verifique los registros de SSH para saber si alguien está tratando de obtener acceso a la máquina. Puede verificar el registro de acceso al servidor (SSH) con el siguiente comando, el cual le mostrará el registro de las últimas 100 líneas de todos los intentos de ingresar al servidor a través de ssh «failed or authorized» con información importante, como el nombre de usuario que intentaba obtener acceso.

Si está utilizando una distribución Debian:

tail -n 300 /var/log/auth.log
tail -n 300 /var/log/auth.log | grep sshd 

Si está utilizando una distribución basada en Centos / RedHat:

tail -n 300 /var/log/secure
tail -n 300 /var/log/secure | grep ‘sshd’ 

Puertos abiertos

¿Qué puertos tiene abiertos? Puedes ver esto muy bien con nmap. Un escaneo simple de nmap servirá para una visión general inicial.

nmap localhost

Se profundizará más esta herramienta en otra ocasión


Estructuras del kernel

El archivo del sistema proc es un pseudo-sistema de archivos que proporciona una interfaz para las estructuras de datos del kernel. Se suele montar en /proc.

sudo ls /proc/*/exe -la

Archivos del sistema que han cambiado recientemente

Con este comando, puede ver lo que ha sucedido recientemente. El «-2» significa 2 días, muestra todos los archivos modificados en los últimos 2 días.

sudo find /etc/var -mtime -2

Puntos de ataque comunes

Estos son los lugares más comunes donde un atacante puede dejar rastros de scripts o demás:

ls /tmp -la
ls /dev/shm -la
ls /var/tmp -la

Cabe destacar que en este punto es bueno convertirse en un experto usando el comando ls, el cual despliega una lista de archivos en el directorio, y es recomendable utilizarlo con las opciones -a para mostrar los archivos escondidos y -l que muestra el archivo en formato amplio

ls -la

Es importante que durante una investigación usted también analice los directorios /home/USUARIO y /root/ con el comando ls -la para buscar archivos que puedan estar escondidos. En el siguiente ejemplo le muestro unos archivos sospechosos encontrados en un servidor comprometido:

Es importante destacar que muchos atacantes esconden script maliciosos en folders como lo es .ICE-unix, o crean directorios ocultos que inician con «.», por lo que es importante que durante una investigación usted busque cualquier archivo o folder sospechoso y recolecte la evidencia de manera apropiada.


Revisión de registro de actividades en el sistema – logs

Otro punto muy importante una vez que se haya investigado los anteriores es revisar siempre los logs; es importante que sepa que en un servidor donde se maneja mucho tráfico posiblemente haya una gran cantidad de registros en el sistema.

Lea esta noticia similar  FireEye, una de las principales empresas de ciberseguridad, hackeada por un Estado-nación

Los archivos se almacenan en texto y se pueden encontrar en el subdirectorio /var/log. Hay registros de Linux para todo: sistema, kernel, gestores de paquetes, procesos de arranque, Xorg, Apache, MySQL. La mayoría de los directorios se pueden agrupar en una de cuatro categorías:

  • Registros de aplicaciones
  • Registro de eventos
  • Registros de servicios
  • Registros de sistema

Los logs más críticos de monitoreo del servidor donde puede empezar a buscar son los siguientes:

/var/log/syslog (Debian) o /var/log/messages (CentOS/RedHat): mensajes generales del sistema
/var/log/auth.log (Debian) o /var/log/secure (CentOS/RedHat): mensajes de autenticación de usuarios
/var/log/boot.log: información de arranque del sistema operativo
/var/log/maillog or var/log/mail.log: servicios de email, postfix o smtpd
/var/log/kern: mensajes de advertencia del kernel
/var/log/dmesg: mensajes de controladores
/var/log/faillog: errores de inicio de sesión; aquí puede encontrar intentos de fuerza bruta o de comprometer el sistema
/var/log/cron: mensajes sobre cron-jobs, estas son tareas automatizadas
/var/log/yum.log (CentOS/RedHat): paquetes instalados mediante el comando yum
/var/log/httpd/: contiene los error_log y access_log del sistema
                 error_log: errores de memoria o sistema del servicio httpd
                 access_log: Contiene todas las peticiones recibidas por HTTP
/var/log/mysqld.log (CentOS/RedHat/Fedora) or /var/log/mysql.log(Debian): información sobre el servicio MySQL

Filtrado de archivos – Grep y zgrep

Recomiendo que siempre que vaya a buscar logs utilice el comando grep el cual busca los archivos por nombre y patrón. Principalmente lo usaremos para filtrar puntos importantes de la investigación como los siguientes

  • Periodo en el que ocurrió el incidente, ya sea una fecha específica o la hora
  • IP
  • Nombre de usuario (el usuario puede ser también un usuario del sistema contenido en /etc/passwd)
  • Palabras claves de la investigación, como un script específico, comando, servicio, etc.

Con estos datos, nos dispondremos a utilizar el comando grep anexándolo al archivo que queramos aplicar, o dirigiéndonos al directorio raíz y utilizando el wildcard *, el cual nos permite buscar en todos los archivos en el directorio actual y subdirectorios.

grep -r "May 10/|10/May/" archivo_log
ls -la | grep palabra_clave
strings archivo | grep palabra_clave
grep IP_a_buscar secure*

Conteo de filas en archivo utilizando WC

A veces los atacantes pueden modificar sus rastros eliminando líneas en los logs, por lo que podemos utilizar el comando wc (word count) para contar las palabras que hay en determinados logs importantes como lo es /var/log/httpd. Así nos daremos cuenta si hay un número bajo de líneas en un logs de un servidor en producción y sabremos que efectivamente fue comprometido.

cat archivo_log | wc -l

La opción -l nos permite contar la cantidad de líneas que hay en dicho archivo, y así como está esta opción este comando tiene muchas más como contador de bytes o caracteres.

Como podemos observar, en la fecha del 18 de marzo en este ejemplo se encontró una cantidad muy baja de líneas, lo que puede indicarnos que manualmente se efectuó una eliminación de registros importantes en el sistema. Para llegar a esto, claro que formuló de hipótesis que en esta fecha ocurrió un incidente en el servidor, por ello le recomiendo siempre hacerse las preguntas correctas y tener una imagen completa de que puede estar buscando para realizar una investigación más detallada.


Crontab

Otra forma es verificar los cronjobs. Tal vez se pueda ver un script o una aplicación maliciosa aquí.

"crontab es una lista de comandos que se ejecuta en un tiempo determinado"

Un cronjob puede estar corriendo desde el archivo /etc/crontab. Para verlo, ejecute el siguiente comando:

less /etc/crontab

Ver Cronjobs específicos de software

cd /etc/cron.d/
ls -l
cat nombredelarchivo

Listado de cron jobs de los usuarios cuando usan systemd timers

Systemd viene con un sistema cron llamado systemd.timer. Esta es otra opción que puede usar en la distribución de Linux. Use el comando systemctl de la siguiente manera para enumerar trabajos cron en Linux.

systemctl list-timers

Conclusión

En este artículo, muestro comandos y herramientas útiles donde se puede determinar si su computadora o servidor Linux está comprometido. También puede usar herramientas como Wireshark, Snort, Splunk entre otras para lograr esto. Me gustaría para finalizar comentarle lo siguiente.

  • Este artículo fue escrito con fines educativos
  • La información solo se utilizará para expandir el conocimiento y no para causar ataques maliciosos o perjudiciales.
  • Es importante que ante un ataque o amenaza contacte a un experto en el campo que le asesore y le provea con las herramientas para solventar sus ataques

Mi objetivo es educar a las personas, especialmente en Costa Rica, para que aprendan sobre este asombroso mundo de la Ciberseguridad. Y que puedan ayudar a mas empresas a salir adelante.

Escrito por Jose Rivera

Vea otras noticias interesantes:

Síganos en nuestras redes sociales

Le compartiremos contenido valicioso para que se mantenga actualizado en el campo

Nuestros cursos

CYBER401 Q1-2024 – Analista de Ciberseguridad

Conozca sobre nuestro curso de analista en Ciberseguridad y adéntrese en el mundo de los delitos informáticos y como proteger a las empresas ente los ataques

0 Comentarios

0 comentarios