Autres scripts obsolètes.

This commit is contained in:
Pierre-Elliott Bécue 2015-02-25 22:13:21 +01:00
parent 8a4d7dfd78
commit 635a37385d
5 changed files with 0 additions and 0 deletions

View file

@ -1,188 +0,0 @@
#!/bin/bash
# Script de détection des machines infectées par Conficker
# Copyright (c) 2009 Michel Blockelet <blockelet@crans.org>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
#####
# Ce script est fait pour détecter les machines infectées par Conficker.
# Il fonctionne un peu à la "devinette", il est donc conseillé de vérifier
# sa sortie (il enregistre chaque étape dans un fichier indiqué par
# [> fichier]).
#####
# Options :
# -h / --help : Affiche les options
# --mailto [adresse mail] : Envoie un mail avec le diff
#####
# Fonctionnement :
# -Il analyse les logs de Squid à la recherche des requêtes du type :
# GET http://[une ip quelconque]/search?
# qui sont du format de requête typique de Conficker.
# -Il récupère les couples [IP ayant émis la requête] [IP dans la requête]
# -Il retrie ces couples et compte le nombre d'occurences
# -Il regarde le reverse DNS de chaque IP se trouvant dans des requêtes
# suspectes
# -Il ne garde que les IPs n'ayant pas de reverse DNS (ce qui peut être
# trop restrictif, mais il s'agit d'éviter de compter les vraies
# requêtes (émises par exemple vers Google), puis regarde quelles
# IPs source ont émis des requêtes vers ces IP
# -Il finit par afficher ces IPs sources (machines très probablement
# infectées), et les statistiques de communication entre ces IPs sources
# et les IPs destination suspectes
#####
# On affiche l'aide si demandée
if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
cat <<EOF
Script de détection des machines infectées par Conficker
Utilisation :
$0 [OPTIONS] ...
Options :
-h / --help : Affiche les options
--mailto [adresse mail] : Envoie un mail avec le diff, ou les stats
s'il n'y a pas d'anciennes stats
EOF
exit 0
fi
# Header pour les mails
header() {
cat <<EOF
***** Détection des machines infectées par Conficker *****
Généré par $0,
le `date` sur `hostname`
*** Hôtes probablement infectés ***
`cat compromised`
*** Statistiques ***
> Format :
> * [Hôte de destination suspect]
> [Nombre de requêtes] [IP Cr@ns source] [IP destination]
EOF
}
# A changer bien sûr selon les cas ...
if [ "`hostname`" != "sable" ] && [ "`hostname`" != "titanic" ]
then
echo "Vous devez exécuter ce script sur sable ou sur titanic !"
exit 1
fi
# Ce n'est pas toujours la même version de Squid ... super
if [ "`hostname`" == "sable" ]
then
SQUIDLOG="/var/log/squid3/access.log"
else
SQUIDLOG="/var/log/squid/access.log"
fi
# On initialise les fichiers utilisés par le script
# (Par défaut, ces fichiers sont laissés pour ne pas avoir à reexécuter le
# script ...)
echo " * Initialisation des fichiers ..."
# On garde les dernières stats si elles existent ...
if [ -f stats ]
then
mv stats stats.old
fi
FILES="base diff ip_reqip ip_reqip_stats reverse_dns compromised stats"
rm -f $FILES
touch $FILES
chmod go-rwx $FILES
# On regarde les lignes de la forme "...GET http://[une ip]/search?..."
# (requêtes typiques de Conficker)
echo -n " * Recherche des lignes de logs correspondantes ... [> base] Lignes : "
if [ "`whoami`" == "root" ]
then
egrep "GET http://([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}/search\?" $SQUIDLOG | tee base | wc -l
else
sudo egrep "GET http://([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}/search\?" $SQUIDLOG | tee base | wc -l
fi
# On récupère les IPs dans les lignes
echo -n " * Récupération des IP sources et destinations ... [> ip_reqip] Lignes : "
cat base | sed 's/^.* \(.*\) TCP.* http:\/\/\(\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}\)\/search.*$/\1 \2/' | tee ip_reqip | wc -l
# On trie les IPs et on génère les stats de requêtes
echo -n " * Tri, comptage ... [> ip_reqip_stats] Lignes : "
cat ip_reqip | sort | uniq -c | tee ip_reqip_stats | wc -l
# On regarde le reverse DNS de chaque IP destination
echo -n " * Reverse DNS des IPs destination ... [> reverse_dns] Lignes : "
for SEARCHIP in `cat ip_reqip | awk '{print $2}' | sort | uniq`
do
echo -n "$SEARCHIP " >> reverse_dns
host $SEARCHIP >> reverse_dns
done
cat reverse_dns | wc -l
cat reverse_dns
# On garde les IPs destination n'ayant pas de reverse DNS
# (peut-être est-ce trop restrictif ?)
echo -n " * Recherche des hôtes compromis ... [> compromised] Lignes : "
for SEARCHIP in `grep " not " reverse_dns | awk '{print $1}'`
do
echo " * $SEARCHIP" >> stats
for NEWIP in `grep $SEARCHIP ip_reqip | awk '{print $1}' | sort | uniq`
do
if ! grep $NEWIP compromised > /dev/null
then
echo -n "$NEWIP " >> compromised
host $NEWIP >> compromised
fi
done
grep $SEARCHIP ip_reqip_stats >> stats
done
cat compromised | wc -l
cat compromised
# On affiche les statistiques
echo " * Statistiques ... [> stats]"
cat stats
# Si on a d'anciennes stats, on fait le diff
if [ -f stats.old ]
then
echo " * Diff ... [> diff]"
diff -uN stats.old stats | tee diff
fi
# Si on a l'option --mailto, on envoie un mail avec le diff
if [ "$1" == "--mailto" ] && [ -n "$2" ]
then
if [ -f stats.old ]
then if [ -s diff ] && [ -s stats ]
then
# On envoie le diff (à condition qu'il y ait des machines infectées)
( header ; cat diff ) | mail -s "Detection du virus Conficker sur `hostname`" "$2"
fi
elif [ -s stats ]
then
# S'il n'y avait pas de précédentes stats, on envoie les nouvelles directement
( header ; cat stats ) | mail -s "Detection du virus Conficker sur `hostname`" "$2"
fi
fi

View file

@ -1,161 +0,0 @@
#! /usr/bin/env python
# -*- encoding: utf-8 -*-
# Utilisation de scappy pour détecter un DHCP pirate.
# $Id: dhcp-detect.py,v 1.3 2006/12/11 23:31:39 glondu Exp $
import sys, os
from threading import Thread
from time import time, sleep
from syslog import *
sys.path.append("/usr/bin")
sys.path.append("/usr/scripts/gestion")
sys.path.append("/usr/scripts/gestion/tools")
# Hack pour scapy
os.environ["HOME"] = "/tmp"
from scapy import Ether, sendp, sniff, BOOTP, IP, UDP
from email_tools import send_email
from locate_mac import trace_machine, info_machine
PIDFILE = "/var/run/dhcp-detect.pid"
# dhcp-server attendu
DHCPSERVER = '138.231.136.9'
# Interface à surveiller
INTERFACE = "crans"
# Adresse MAC
mac = os.popen(r"ifconfig | grep '^%s' | awk '{print $(NF)}'" % INTERFACE).readline().strip()
# Paquet à envoyer pour détecter un DHCP (il a été capturé pour avoir la bonne tête)
tosend = Ether("\xff\xff\xff\xff\xff\xff\x00\x80\xc8\xc9\xab\x01\x08\x00E\x10\x01H\x00\x00\x00\x00@\x11y\x96\x00\x00\x00\x00\xff\xff\xff\xff\x00D\x00C\x014\x9aA\x01\x01\x06\x00\xb2\x87\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xc8\xc9\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x012\x04R\xe1'67\x07\x01\x1c\x02\x03\x0f\x06\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
# On met à jour ce paquet
tosend.getlayer(Ether).src = mac
tosend.getlayer(IP).chksum = None
tosend.getlayer(UDP).chksum = None
tosend.getlayer(BOOTP).chaddr = ''.join(map(lambda x: chr(int(x,16)),mac.split(":")+['0']*10))
tosend = Ether(tosend.build())
# Tableau associatif "mac" - "mailé pour la dernière fois"
dejavu = {}
def createDaemon():
"""Detach a process from the controlling terminal and run it in the
background as a daemon.
"""
try:
pid = os.fork()
except OSError, e:
raise Exception, "%s [%d]" % (e.strerror, e.errno)
if (pid == 0): # The first child.
os.setsid()
try:
pid = os.fork() # Fork a second child.
except OSError, e:
raise Exception, "%s [%d]" % (e.strerror, e.errno)
if (pid == 0): # The second child.
os.chdir("/")
os.umask(0)
else:
os._exit(0) # Exit parent (the first child) of the second child.
else:
os._exit(0) # Exit parent of the first child.
# Iterate through and close all file descriptors.
for fd in range(0, 3):
try:
os.close(fd)
except OSError: # ERROR, fd wasn't open to begin with (ignored)
pass
os.open("/dev/null", os.O_RDWR) # standard input (0)
os.dup2(0, 1) # standard output (1)
os.dup2(0, 2) # standard error (2)
# Envoi par mail le paquet
def mail(paquet):
mac_pirate = paquet.getlayer(Ether).src
if (mac_pirate in globals()['dejavu'] and (time() - globals()['dejavu'][mac_pirate]) < 60*60):
pass
else:
globals()['dejavu'][mac_pirate] = time()
print "Envoi d'un mail...",
msg = u"""Boujour,
Un DHCP pirate a été découvert sur le réseau. Voici quelques renseignements mineurs à son sujet :
Son adresse Ethernet : %s
Son adresse IP : %s
Son TTL : %d
""" % (mac_pirate, paquet.getlayer(IP).src, paquet.getlayer(IP).ttl)
msg += trace_machine(mac_pirate)
msg += u"\n"
msg += info_machine(mac_pirate)
msg += u"""
Merci de votre attention et à bientôt.
--
dhcp-detect.py
"""
send_email(u"DHCP-detect <disconnect@crans.org>",
u"Disconnect Team <disconnect@crans.org",
u"DHCP pirate",
msg)
print "ok"
# Réception d'une réponse
def recoit(paquet):
# On affiche
print "Réception de : ", paquet.summary()
# On verifie que c'est bien ce qu'on attend
if paquet.getlayer(Ether).dst.upper() == globals()['mac'] and paquet.haslayer(BOOTP) and paquet.getlayer(BOOTP).op == 2 and paquet.getlayer(IP).src != DHCPSERVER:
# DHCP pirate ?
msg = "DHCP pirate ? (%s)" % paquet.getlayer(Ether).src
print msg
syslog(msg)
mail(paquet)
# Envoi du paquet test
def send():
while True:
sleep(60)
print "Envoi de :", tosend.summary()
sendp(tosend, verbose=False)
# Sniffer
def get():
while True:
sleep(1)
# On prend les paquets par 100, sinon, le process grossit beaucoup trop
a = sniff(iface=INTERFACE, filter="port bootpc and ether dst %s" % mac, prn=recoit, count=100)
if __name__ == "__main__":
# On quitte les éventuelles instances démonisées en cours
try:
pid = int(file(PIDFILE).read().strip())
os.kill(pid, 15)
except:
pass
if "-d" in sys.argv:
createDaemon()
file(PIDFILE, "w").write("%d\n" % os.getpid())
else:
print "Le paquet suivant va être envoyé à intervalles réguliers pour tester la présence de DHCP pirates :"
print tosend.summary()
openlog("dhcp-detect", LOG_PID)
syslog("Démarrage de dhcp-detect")
# On démarre le thread qui envoie régulièrement le paquet...
Thread(target=send, name="send").start()
# ...et celui qui sniffe régulièrement la réponse
Thread(target=get, name="get").start()

View file

@ -1,147 +0,0 @@
#! /usr/bin/env python
# -*- encoding: utf-8 -*-
###########################
# Import des commmandes : #
###########################
import commands
import os
# import pg # Import des commandes de postgres
import sys
sys.path.append('/usr/scripts/gestion')
import iptools
import psycopg2
import re
sys.path.append('/usr/script/surveillance')
import strptime
# Définition de constantes :
############################
reseau = ["138.231.136.0/21", "138.231.148.0/22"]
# Ouverture de la base de données :
###################################
pgsql = psycopg2.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans')
pgsql.set_session(autocommit=True)
curseur = pgsql.cursor()
###########################################
# Récupération des tables de protocoles : #
###########################################
requete = "SELECT nom,id_p2p from protocole_p2p"
curseur.execute(requete)
curseur.fetchall
tableau = curseur.fetchall()
protocole_p2p = {}
for cellule in tableau:
protocole_p2p[cellule[0]]=cellule[1]
requete = "SELECT nom,id from protocole"
curseur.execute(requete)
curseur.fetchall
tableau = curseur.fetchall()
protocole = {}
for cellule in tableau:
protocole[cellule[0]]=cellule[1]
##############################################################
# Parser ler log du firewall: /var/log/firewall/filtre.log : #
##############################################################
# Définition des motifs des comparaisons :
##########################################
motif_p2p = re.compile("^(.*) komaz .* IPP2P=([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
motif_virus = re.compile("^(.*) komaz .* Virus:([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
motif_flood = re.compile("^(.*) komaz .* Flood:([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
# On récupère en continu les log du firewall:
#############################################
filtre = os.popen("tail -F /var/log/firewall/filtre.log 2> /dev/null")
# On matche les log du firewall avec les motifs :
#################################################
for log in filtre:
resultat_p2p = motif_p2p.match(log)
resultat_virus = motif_virus.match(log)
resultat_flood = motif_flood.match(log)
if resultat_p2p :
try:
ip_src = resultat_p2p.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
except ValueError:
continue #IP malformee
if verif :
try:
date = resultat_p2p.group(1)
id_p2p = int(protocole_p2p[resultat_p2p.group(2)])
ip_src = resultat_p2p.group(3)
ip_dest = resultat_p2p.group(4)
proto = int(protocole[resultat_p2p.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_p2p.group(6))
port_dest = int(resultat_p2p.group(7))
date=strptime.syslog2pgsql(date)
except ValueError, KeyError:
continue #mal parse
# On remplit la base :
######################
requete = "INSERT INTO p2p (date,ip_src,ip_dest,id_p2p,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d,%d)" % (date,ip_src,ip_dest,id_p2p,proto,port_src,port_dest)
curseur.execute(requete)
# On teste si le log contient des virus
########################################
elif resultat_virus :
try:
ip_src = resultat_virus.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
except ValueError:
continue
if verif :
try:
date = resultat_virus.group(1)
ip_src = resultat_virus.group(3)
ip_dest = resultat_virus.group(4)
proto = int(protocole[resultat_virus.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_virus.group(6))
port_dest = int(resultat_virus.group(7))
# On remplit la base :
######################
date=strptime.syslog2pgsql(date)
except ValueError, KeyError:
continue
requete = "INSERT INTO virus (date,ip_src,ip_dest,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d)" % (date,ip_src,ip_dest,proto,port_src,port_dest)
curseur.execute(requete)
elif resultat_flood :
try:
ip_src = resultat_flood.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
except ValueError:
continue
if verif :
try:
date = resultat_flood.group(1)
ip_src = resultat_flood.group(3)
ip_dest = resultat_flood.group(4)
proto = int(protocole[resultat_flood.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_flood.group(6))
port_dest = int(resultat_flood.group(7))
# On remplit la base :
######################
date=strptime.syslog2pgsql(date)
except ValueError, KeyError:
continue
requete = "INSERT INTO flood (date,ip_src,ip_dest,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d)" % (date,ip_src,ip_dest,proto,port_src,port_dest)
curseur.execute(requete)

View file

@ -1,41 +0,0 @@
#! /bin/sh
### BEGIN INIT INFO
# Provides: filtrage_firewall
# Required-Start: $remote_fs $syslog firewall
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Filtrage Firewall
# Description: Firewall logfile Parsing.
### END INIT INFO
set -e
case "$1" in
start)
echo -n "Démarrage du script de parsage des logs du firewall"
start-stop-daemon --start --quiet --background --make-pidfile --pidfile /var/run/filtrage_firewall.pid --exec /usr/scripts/surveillance/filtrage_firewall.py
echo "."
;;
stop)
echo -n "Arrêt du parsage des logs du firewall"
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/filtrage_firewall.pid
echo "."
;;
restart)
echo -n "Redémarrage du parsage des logs du firewall"
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/filtrage_firewall.pid
sleep 1
echo -n "Démarrage du script de parsage des logs du firewall"
start-stop-daemon --start --quiet --background --make-pidfile --pidfile /var/run/filtrage_firewall.pid --exec /usr/scripts/surveillance/filtrage_firewall.py
echo "."
;;
*)
echo "Usage: /etc/init.d/filtrage_firewall {start|stop|restart}"
exit 1
esac
exit 0

View file

@ -1,33 +0,0 @@
#! /bin/sh
set -e
exit 0
case "$1" in
start)
echo -n "Démarrage du script de parsage des logs du netacct"
start-stop-daemon --start --quiet --background --make-pidfile --pidfile /var/run/filtrage_netacct.pid --exec /usr/scripts/surveillance/filtrage_netacct.py
echo "."
;;
stop)
echo -n "Arrêt du parsage des logs du netacct"
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/filtrage_netacct.pid
echo "."
;;
restart)
echo -n "Redémarrage du parsage des logs du netacct"
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/filtrage_netacct.pid
sleep 1
echo -n "Démarrage du script de parsage des logs du netacct"
start-stop-daemon --start --quiet --background --make-pidfile --pidfile /var/run/filtrage_netacct.pid --exec /usr/scripts/surveillance/filtrage_netacct.py
echo "."
;;
*)
echo "Usage: /etc/init.d/filtrage_netacct {start|stop|restart}"
exit 1
esac
exit 0