Ir al contenido principal

¿Cómo saber que nuestro sistema ha sido comprometido?

En este post no busco ahondar mucho sobre las formas y procedimientos que un profesional forense debe considerar. Solo quiero hacer un escrito lacónico que ayude a los neófitos como yo, a buscar la mejora ante las adversidades. Las ideas las tomé de Linux Hardening, un libro ya entrado en años pero que se mantiene vigente con la respectiva evolución de las herramientas que ilustra. 

Cuando un sistema es vulnerado, o pensamos que lo ha sido; de alguna manera es tarde y ésto sólo nos ayudará a prevenir por medio de la rutinaria inspección de cada servidor (puede contarse con una automatización y paulatinamente con herramientas más profesionales).

En medida de lo posible, recomiendo que prevengamos una cosa. Aseguremos que cada comando que utilicemos sea el que instalamos. Pienso que si un atacante puede comprometer nuestro sistema y sembrar piezas de software que lo mantengan oculto, no le será nada difícil manipular algunos de los comandos que nos permitirían reconocerlo. Para esto generaremos las firmas digitales de los comandos, y por qué no, archivos de configuración que son importantes para nosotros. Por ejemplo, el comando fin (sobre el cual vamos a desarrollar este post).

Ubicamos el binario, nos aseguramos que no sea una liga simbólica y obtenemos la firma. 



En teoría, no debería cambiar esta firma digital, a menos que hagamos una actualización. Como sea, podemos de esta manera intentar mantener a salvo la integridad de lo que ejecutamos.

Posterior a esto, y con el pasar del tiempo, las próximas revisiones de anomalías en el sistema comenzarán con la validación de los binarios.


Uso de find para detectar anomalías


Como he mencionado anteriormente, nos auxiliaremos de find en nuestro entorno GNU/Linux para evaluar los contenidos residentes en nuestros sistemas de archivos. A continuación describo los parámetros utilizados.

setuid y setgid

1000 --> Sticky bit
2000 --> setgid
4000 --> setuid

# find / -type f -perm /6000 -ls 2>/dev/null

Con la salida obtenida podemos decidir si todos los archivos listados son nuestros y es necesario que conserven esos permisos. En caso de no requerirlos, los podemos retirar.

Archivos con permisos de escritura para todo el mundo

No requiere mayor explicación esta búsqueda. 

# find / -perm -o+w -exec ls -lrth {} \;

Archivos con nombres inusuales

Los archivos que comienzan por un "." normalmente no los listamos cuando navegamos entre directorios. Sabiendo esta diafana omisión, el atacante puede valerse de ella. 

# find / -name ".*" 2>/dev/null
# find / -name "..*" 2>/dev/null

Archivos sin dueño ni grupo

# find / -nouser -o -nogroup -ls

Adicional, podemos usar la redirección de los errores a /dev/null para eliminar la basura en el análisis posterior.


Comentarios

Entradas populares de este blog

Ángulo de Corte

El armar un gallo de pulgada es una de las cosas más sujeta a mitos y medias verdades. Este es uno de los muchos temas que los galleros enuncian con una seguridad a prueba de balas.  Hasta el momento no he leído un solo escrito o esquema con detalle científico que tenga conclusiones claras y precisas de lo que sucede en un combate ni la ergonomía que mejor se adapta, todo proviene de un sistema de creencias que, muy en lo personal, me cuesta creer. El ángulo de corte se refiere a la posición de la punta de la navaja con respecto al codo de la pata. Dependiendo del amarrado es que la sitúa en un rango de los 5° a los 9°. De lo que no dudo es que no hay una manera precisa de emitir teorema alguno sobre este rubro. La formula del corte está dada por la sujeción de la navaja, la forma de la navaja, la altura de la botana, la posición de disparo del gallo, así como la calidad y aprendizaje del mismo durante el desarrollo de la pelea. Son muchas las variables, sin emba...

Análisis de conexiones TIME_WAIT

El tema de las conexiones mal utilizadas es un dolor de cabeza para muchos administradores de servidores de aplicaciones. Es común que las aplicaciones que mantenemos en nuestro resguardo sufran degradación, e incluso fallos, por el "simple" hecho de no cerrar las conexiones o tardar demasiado en hacerlo (vía sistema operativo). Como sabemos, una conexión pasa por varios estados, mismos que salen de la intención de este escrito. Las conexiones establecidas (ESTABLISHED) son demasiado costosas cuando abren y cierran, debido a eso, se han creado manejadores de conexiones (pooles) que mantienen abiertas las conexiones para reutilizarlas dependiendo la demanda. Es por eso, que en medida de lo posible, hay que utilizar un manejador de conexiones, ya sea a base de datos o algún broker. Entrando de lleno al tema, las conexiones en estado TIME_WAIT son un problema por el consumo de memoria, ocupando cada una 64k de memoria no paginable, es decir,  todo el tiempo se mantiene...

Significado de los dígitos de versión del kernel Linux

Algunas de las cosas que siempre quise saber, pero nunca me hice del tiempo para investigarlo es la función de los cuatro dígitos del kernel Linux. Su significado poco tiene que ver con hechos cabalísticos o confusos enunciados matemáticos. Mejor que en mis palabras están las de Tanenbaum: Los números de versión de Linux consiste en cuatro números, A.B.C.D, como 2.6.9.11. El primer número indica la versión del kernel. El segundo indica la revisión mayor. Antes del kernel 2.6 los números pares correspondían a versiones estables del kernel, mientras que los impares correspondían a versiones inestables que estaban en desarrollo. Después del kernel 2.6 los significados se manejaron de forma distinta. El tercer número corresponde a la revisión de versiones menores, como la aceptación de drivers. El cuarto número corresponde a las correcciones de errores menores o parches de seguridad.  Como ven, el señor Tanenbaum es sumamente lacónico con la explicación de los dígitos que compo...