En esta publicación, le mostraremos cómo rastrear y rastrear un proceso de Linux en el sistema con dos herramientas, herramientas de línea de comando ps y strace. Las herramientas de este sistema pueden ayudarlo a identificar el proceso real del sistema y su origen.
En los servidores de alojamiento web compartido es muy común enfrentar problemas de spam y malware. Estos problemas pueden ocurrir debido a muchas razones y, a veces, estos correos no deseados o ataques salientes se lanzan desde procesos del sistema, como secuencias de comandos Perl, que utilizan muchos recursos de CPU.
En la mayoría de estos casos, aparentemente es "solo" un proceso de Perl, pero aquí surgen algunas preguntas interesantes:¿cómo sabes de dónde viene? ¿Cómo un proceso del sistema Linux podría enmascarar su nombre real? ¿Cuál es la forma más fácil y confiable de averiguar dónde se inició este proceso de Linux?
Hoy intentaremos responder a todas estas preguntas con algunos ejemplos prácticos rápidos y sencillos.
Rastrear un proceso Linux usando el comando ps
Veamos un ejemplo de la vida real que sucedió hace días en un servidor dedicado que administro.
En un sitio web en particular, hubo un problema de spam saliente que enviaba muchos correos electrónicos, pero no se encontró malware dentro de la carpeta public_html, también se cambiaron todas las contraseñas de los buzones de correo electrónico, al igual que la contraseña de la cuenta FTP/cPanel. Aún así, había una forma en que el atacante estaba usando el sistema Linux para enviar correos electrónicos salientes.
La fuente de los correos electrónicos era un proceso que se ejecutaba bajo el usuario "johndoe" que parecía ser malicioso y no era lo que decía ser:
[[email protected] ~] ps -U johndoe -u johndoe u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND johndoe 59289 4.0 0.0 43568 9528 ? Ss Jun08 110:01 httpd
Como ves, lo primero para averiguar el proceso fue usar el comando ps, como ves a continuación:
ps -U user -u user u
Reemplace "usuario" con su usuario real del sistema.
Después de eso, una vez que haya enumerado los procesos sospechosos, use ll comando para encontrar más información usando su PID , como se vio antes:
Como puede ver, el proceso dice ser "httpd" para ocultarse (cualquier proceso puede cambiar su propio título de proceso), en realidad es un proceso perl:
[[email protected] ~] ll /proc/59289/exe lrwxrwxrwx 1 johndoe johndoe 0 Jun 10 10:05 /proc/59289/exe -> /usr/bin/perl*
Sin embargo, no había ningún archivo de script asociado. Lo más probable es que la secuencia de comandos se canalizara en el proceso de perl para evitar poner algo en el sistema de archivos donde dejaría un rastro.
No sé cómo llegó a ejecutarse la secuencia de comandos con este usuario, pero se trataba de una instalación vulnerable de WordPress con muchos complementos obsoletos y malware inyectado que podría conducir fácilmente a este tipo de problemas.
Matar el proceso de colorete fue lo mejor que se pudo hacer en este caso:
kill -9 59289
Reemplace "59289" con el ID de proceso real.
Strace:otra manera fácil de rastrear un proceso del sistema
straza es una herramienta muy práctica y útil que utilizan los administradores de sistemas para depurar y diagnosticar problemas relacionados con el sistema y los procesos en los que la fuente no está realmente clara y disponible al echar un vistazo rápido y por primera vez.
Esta herramienta de depuración permite a los programadores y usuarios del sistema descubrir rápidamente cómo interactúa un programa con el sistema operativo. Lo hace monitoreando las llamadas y señales del sistema.
Como veremos en los siguientes ejemplos, strace genera cada línea en el seguimiento que incluye el nombre de la llamada al sistema, sus argumentos y el valor de retorno (dentro de los paréntesis).
ejemplo de traza
Ejecutemos strace en /bin/ls y guardemos el resultado en un archivo llamado ls.txt
strace -o ls.txt /bin/ls
Para leer la salida, simplemente ejecute:
more ls.txt
Pero eso es solo un ejemplo básico de strace. La parte interesante viene cuando puedes rastrear el proceso del servidor web y descubrir qué está haciendo exactamente. Tomemos como ejemplo un proceso php-fpm:
strace -p 18478 -s 80 -o /root/php-fpm.debug.txt
[[email protected]:~]strace -p 18478 -s 80 -o /root/php-fpm.debug.txt Process 18478 attached ^CProcess 18478 detached [[email protected]:~]
Al presionar CTRL + C, finalizará el seguimiento y se eliminará.
También puede especificar lo que necesita rastrear, por ejemplo, si solo necesita rastrear las llamadas al sistema abiertas y leídas, debe especificar eso en la sintaxis de strace, como se ve a continuación:
strace -e trace=open,read -p 18478 -s 80 -o /root/php-fpm.debug.txt
Este ejemplo de trazado rápido usó algunas opciones de comando, explicadas aquí:
-o filename: used to write the strace output into a file name. -p PID: here you must specify the system process ID. -s SIZE: sets the maximum string size to print (32 is the default).
Nuevamente, para leer la salida, simplemente ejecute:
more /root/php-fpm.debug.txt
Ahora que sabe cómo rastrear un proceso de Linux fácilmente con dos comandos simples, con esta información puede rastrear fácilmente un proceso de Linux para averiguar qué está haciendo exactamente dentro de su servidor. strace toma un poco más de tiempo para entenderlo del manual, pero es la herramienta definitiva para rastrear un proceso de Linux.
Lectura adicional:
- strace de hombre
- strace hola mundo
- comando ps