Cómo reconocer un archivo o un proceso sospechoso
Un proceso sospechoso es un programa en ejecución que nadie esperaba. Un archivo sospechoso es uno cuyo contenido no es lo que dice su nombre.
Aprenderás a mirar una lista de procesos y los primeros bytes de un archivo. Con eso decides qué merece un análisis más a fondo.
Al final de esta lección
Nota
Puedo encontrar un archivo o un proceso sospechoso.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Proceso | un programa mientras se ejecuta | |
| Extensión | las letras tras el último punto del nombre | |
| Firma de archivo | los primeros bytes que identifican un formato | |
| Hexadecimal | una forma de escribir bytes con dos cifras | 7f |
| Carving | recuperar archivos buscando sus firmas en datos en bruto |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un proceso sospechoso no encaja con el equipo
Cada programa en marcha es un proceso. La orden ps aux lista los procesos con su usuario, su consumo y el programa que ejecutan.
No hay procesos malos por su nombre. Hay procesos que no encajan con el equipo: un usuario que no debería ejecutar nada, una ruta rara o un consumo alto sin motivo.
Ejemplo: una lista de procesos inventada
# Esto es un ejemplo escrito a mano, no la salida de una máquina real.
USER PID %CPU COMMAND
root 1 0.0 /sbin/init
www-data 640 0.1 nginx: worker process
lucia 912 0.2 /usr/bin/python3 app.py
lucia 1377 94.8 /tmp/.cache/update
Qué hace sospechoso a un proceso
| Señal | En el ejemplo anterior |
|---|---|
| Un programa en una carpeta temporal | El proceso 1377 está en /tmp |
| Un nombre que empieza por punto, para ocultarse | .cache/update |
| Un consumo de CPU muy alto sin motivo | 94,8 por ciento |
| Un usuario que no lo suele ejecutar | lucia ejecuta un programa de la carpeta temporal |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
El nombre del primer proceso de la máquina
ps -p 1 -o comm=Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La firma está en los primeros bytes
La extensión es solo parte del nombre y cualquiera puede cambiarla. Lo que de verdad identifica un formato son sus primeros bytes, la firma.
Un PDF empieza siempre por las letras %PDF. Un ejecutable de Linux empieza por el byte 7f y las letras ELF. Algunos formatos, como docx, son zip por dentro, y una herramienta real lo sabe.
Ejemplo: firmas de formatos habituales
| Formato | Primeros bytes en hexadecimal |
|---|---|
| Imagen PNG | 89 50 4e 47 |
| Documento PDF | 25 50 44 46 |
| Archivo zip | 50 4b 03 04 |
| Ejecutable de Linux | 7f 45 4c 46 |
| Imagen JPEG | ff d8 ff |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Los primeros bytes de una imagen PNG
printf '\211PNG\r\n\032\n' | od -An -tx1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los primeros bytes de un PDF
printf '%%PDF-1.7' | od -An -tx1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los primeros bytes de un zip
printf 'PK\003\004' | od -An -tx1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los primeros bytes de un ejecutable de Linux
printf '\177ELF' | od -An -tx1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que la extensión dice qué es un archivo. La extensión es solo parte del nombre y se cambia en un segundo. Si un archivo llamado notas.txt empieza por 7f 45 4c 46, es un ejecutable y no un texto.
El carving recupera archivos sin su nombre
Cuando se borra un archivo, a menudo sus bytes siguen en el disco. El carving busca en los datos en bruto una firma de inicio y, si el formato la tiene, otra de final.
Todo lo que hay entre las dos es un archivo posible. No recupera el nombre, porque el nombre estaba en otro sitio.
Busca una firma en datos en bruto
# Los datos en bruto, escritos en hexadecimal.
datos = "00ff00" + "25504446" + "2d312e37" + "0000"
firma_pdf = "25504446"
posicion = datos.find(firma_pdf)
# Cada byte ocupa dos cifras, así que dividimos entre dos.
print("La firma empieza en el byte", posicion // 2)
# Cambia la firma por la de un zip, "504b0304", y mira qué imprime.
Ejemplo: dónde empieza cada archivo posible
| Posición del byte | Firma encontrada | Formato posible |
|---|---|---|
| 0 | 89 50 4e 47 | PNG |
| 4096 | 25 50 44 46 | |
| 9216 | ff d8 ff | JPEG |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.