Alerte d’ossec en notification sur le bureau

Aujourd’hui,

Encore un script useless, fait pour passer le temps en cours …

Le but étant d’avoir un IDS ossec sur l’ordi local configuré pour détecter et répondre plus ou moins comme il faut aux attaques basiques et SURTOUT rendre compte à l’utilisateur des problèmes rencontrés de façon orienté ‘desktop’.

A l’heure actuelle seul deux systèmes de notifications (officiels) de l’utilisateur existent sur ossec : soit une notification par mail, soit par twitter (qui ne fonctionne plus).

L’intêret de ce procédé était surtout de plugger snort avec ossec pour détecter des attaques sur le réseau sans avoir à laisser de console sur les logs de l’ids (des p’tits rigolo qui s’amuse sur le réseau de l’école :s).

Histoire de limiter le développement du logiciel, j’ai juste créée un serveur de mail qui via plusieurs regexp chope la règle qui a detecté l’attaque et le sujet du mail pour l’afficher en belle bulle de notification linuxienne.

La règle iptable qui renvoit les paquets du port 25 au port 8025 pour l’interface lo seulement, comme ça on lance le soft avec les droits utilisateurs, on est jamais trop prudent.

/sbin/iptables -t nat -A OUTPUT -o lo -p tcp --dport 25 -j REDIRECT --to-port 8025

Ne pas oublier de modifier le fichier /etc/ossec.conf en mettant l’adresse du serveur smtp a 127.0.0.1, le serveur de mail chopant tout les adresses, on s’en fout donc de l’adresse de destination et d’émission.

IL faut aussi installer les dépendances :

apt-get install python-notify

Une copie du mail est sauvegarder dans le fichier .mails_ossec, histoire de ne pas perdre le mail. (Au pire il est possible de mettre plusieurs adresses mail dans la conf ossec).

Le script à mettre au lancement de la session (Système -> Préférences -> Application au Démarrage) :

#!/usr/bin/env python
 
from smtpd import PureProxy
import asyncore
import asynchat
import smtplib
import re
import sys
import os.path
import pwd
import grp
import pynotify
 
class mySMTP (PureProxy):
    def __init__(self,s):
        PureProxy.__init__(self,s,None)
 
    def process_message (self, peer, mailfrom, rcpttos, data):
    	if not pynotify.init("Default Action Test"):
		sys.exit(1)

	filout = open('.mails_ossec', 'a')
	filout.write(data)
	filout.close()

	title=""
	rule =""	
	m = re.search("Subject:(.*)",data,re.I|re.M)
	if m:
    		title=m.group(1)
	m= None
	m = re.search("(Rule:.*)",data,re.I|re.M)
	if m:
		rule=m.group(1)
	#print data
	if title=="" and rule=="":
		return None
	n = pynotify.Notification(title, rule)
	n.show()
        return None
 
if __name__ == "__main__":

    #in case of root : drop rights ... 
    #but will not be able to access
    #glibnotify ... useless
    if os.getuid() == 0:
        running_uid = pwd.getpwnam("nobody")[2]
        running_gid = grp.getgrnam("nogroup")[2]
        os.setgid(running_gid)
        os.setuid(running_uid)
#/sbin/iptables -t nat -A OUTPUT -o lo -p tcp --dport 25 -j REDIRECT --to-port 8025
    serv = mySMTP (("127.0.0.1", 8025))
    try:
        asyncore.loop ()
    except KeyboardInterrupt:
        pass

Histoire de pouvoir tester le script, sans attendre une attaque ou une erreur système :
Le petit script qui envoi un mail type au serveur de mail

#!/bin/bash

( 
        echo "mail from:frommail" 
        sleep 0.5 
        echo "rcpt to:tomail" 
        sleep 0.5 
        echo "data"
        sleep 0.5 
        echo "To: 
From: OSSEC HIDS 
Date: Thu, 21 Apr 2011 11:31:40 +0200
Subject: OSSEC Notification - kikoo - Alert level 10

OSSEC HIDS Notification.
2011 Apr 21 11:31:28

Received From: kikoo->/var/log/auth.log
Rule: 5401 fired (level 10) -> 'Three failed attempts to run sudo'
Portion of the log(s):

Apr 21 11:31:28 kikoo sudo:    kikoo : 3 incorrect password attempts ; TTY=pts/1 ; PWD=/home/kikoo/Documents ; USER=root ; COMMAND=/usr/bin/who" 
        sleep 0.5
        echo "." 
        sleep 0.5 
        echo "QUIT" 
   ) | telnet 127.0.0.1 25

Et hop … dès qu’une attaque à lieu, ou un problème apparaît, une notification apparaît dans les secondes qui suivent. ça peut être sympa en lan, avec un bon NIDS, pour découvrir les scripts kiddies.