Archives par mot-clé : log

Iptables : quelques trucs sympa

Bijour …

Suite à mes redirections de ports par iptables dans le tuto précédent, je me suis dit que ça pouvait être intéressant de voir un peu plus loin ce que propose iptables, et j’ai trouvé quelques truc sympa (que je cherchais pas ^^), dont on parle pas très souvent :

Je pars du principe que l’on bloque tout par défaut …

Limitation de certains flags sur un port précis :

Ici on autorise un syn par seconde, ça permet d’éviter les floods

[sourcecode language=bash]
/sbin/iptables -A allow-ssh-traffic-in -m limit –limit 1/second -p tcp –tcp-flags \
ALL SYN –dport ssh -j ACCEPT
[/sourcecode]

On peut aussi utiliser limit-burst pour augmenter le nombre de paquets qui équivaudront à un limit genre pour un limit-burst 5, il faudra 5 paquets pour faire un limit … cqfd^^

Détection de certaine méthodes de scan de nmap (et d’autre scanner)

Ici on va pouvoir logger et bloquer les scans de type XMAS, NULL et SYN*

[sourcecode language=bash]
$IPTABLES -N check-flags
$IPTABLES -F check-flags
$IPTABLES -A check-flags -p tcp –tcp-flags ALL FIN,URG,PSH -m limit \
–limit 5/minute -j LOG –log-level alert –log-prefix "NMAP-XMAS:"
$IPTABLES -A check-flags -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A check-flags -p tcp –tcp-flags ALL ALL -m limit –limit \
5/minute -j LOG –log-level 1 –log-prefix "XMAS:"
$IPTABLES -A check-flags -p tcp –tcp-flags ALL ALL -j DROP
$IPTABLES -A check-flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG \
-m limit –limit 5/minute -j LOG –log-level 1 –log-prefix "XMAS-PSH:"
$IPTABLES -A check-flags -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPTABLES -A check-flags -p tcp –tcp-flags ALL NONE -m limit \
–limit 5/minute -j LOG –log-level 1 –log-prefix "NULL_SCAN:"
$IPTABLES -A check-flags -p tcp –tcp-flags ALL NONE -j DROP
$IPTABLES -A check-flags -p tcp –tcp-flags SYN,RST SYN,RST -m limit \
–limit 5/minute -j LOG –log-level 5 –log-prefix "SYN/RST:"
$IPTABLES -A check-flags -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A check-flags -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit \
–limit 5/minute -j LOG –log-level 5 –log-prefix "SYN/FIN:"
$IPTABLES -A check-flags -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
[/sourcecode]

Au pire, on peut aussi s’amuser à logger les mauvaises combinaisons de flags tcp du genre :(certaine règles peuvent rentrer en collision avec les précédentes … par contre, je me souviens plus de où j’ai trouvé ça …)

[sourcecode language=bash]

/sbin/iptables -N BADFLAGS
/sbin/iptables -A BADFLAGS -j LOG –log-prefix "IPT BADFLAGS: "
/sbin/iptables -A BADFLAGS -j DROP

/sbin/iptables -N TCP_FLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,FIN FIN             -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,PSH PSH             -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ACK,URG URG             -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags FIN,RST FIN,RST         -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags SYN,FIN SYN,FIN         -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags SYN,RST SYN,RST         -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ALL ALL                 -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ALL NONE                -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ALL FIN,PSH,URG         -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ALL SYN,FIN,PSH,URG     -j BADFLAGS
/sbin/iptables -A TCP_FLAGS -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADFLAGS

[/sourcecode]

Marquer les paquets pour des traitements futures …

Bon, ici c’est vraiment pour faire geek, mais ça peut permettre de faire des limitations d’utilisation de bande passante ou … limiter l’accès à un service ^^ genre : seul les paquets marqués d’un « 2 » sont autorisés à ce connecter à mon serveur ssh (c’est une hypothèse bien sûr … ça peut être un autre chiffre ;)), mais ça donne ça :
Coté serveur :
[sourcecode language=bash]
/sbin/iptables -A INPUT -m mark –mark 2 -p tcp -dport 22 -j ACCEPT
#on drop le reste
/sbin/iptables -A INPUT -p tcp -dport 22 -j DROP
[/sourcecode]
Coté client :
On marque les paquets à destination du port 22 de l’ip 192.168.0.1
[sourcecode language=bash]
/sbin/iptables -t mangle -A PREROUTING -p tcp -d 192.168.0.1 -dport 22 -j MARK –set-mark 2
[/sourcecode]
Comme dit … suffit de ce faire sniffer les paquets et l’intrus remarquera rapidement le marquage des paquets, et bruteforcer le marquage n’est pas très dur, donc c’est pas très sécurisé comme technique mais ça peut ralentir une attaque 😉

Filtrer le contenu de certain paquets et faire une « chaine » de filtre :

Ici ça deviens intéressant … le firewall peut carrément lire le contenu de certain paquet tcp pour les drops!! (cf. lien SpamCleaner), ici, le but est de supprimer les sympatiques : GET /w00tw00t.at.ISC.SANS de nos logs apache

[sourcecode language=bash]
# création de notre chaîne w00t :
iptables -N w00t

# redirige les paquets TCP sur notre chaîne :
iptables -A INPUT -p tcp -j w00t

# recherche du premier SYN et création de la liste :
iptables -A w00t -m recent -p tcp –syn –dport 80 –set

# recherche du paquet SYN,ACK et mise à jour la liste :
iptables -A w00t -m recent -p tcp –tcp-flags PSH,SYN,ACK SYN,ACK –sport 80 –update

# recherche du paquet ACK et mise à jour la liste
iptables -A w00t -m recent -p tcp –tcp-flags PSH,SYN,ACK ACK –dport 80 –update

# recherche de la signature de DFind dans le prenier PSH+ACK.
# Si elle est présente, on DROP.
# On supprime la liste pour ne pas filtrer les paquets suivants
iptables -A w00t -m recent -p tcp –tcp-flags PSH,ACK PSH,ACK –dport 80 –remove \
-m string –to 70 –algo bm –string "GET /w00tw00t.at.ISC.SANS." -j DROP
[/sourcecode]

Là on se rend compte que ça peut être pas mal puissant.

Si en plus on couple ce genre de méthode avec modsecurity ou fail2ban on peut arriver à faire quelque choses de pas trop mal côté sécurité.

Bon bien sûr, j’allais pas faire un tour complet des possibilités d’iptables donc voici mes sources, si vous voulez continuer la lecture …

Mes différentes sources : (et ouai je ne suis qu’un kevin!! je repique tout!!, par contre, j’ai mis des liens avec des trucs dont je n’ai pas parlé plus haut … ou pas)

  • Gentoo security
  • RateLimit
  • SpamCleaner Le w00tw00t[1] le fail2ban[2]
  • Google ?!?
  • Marquage de paquet et limitation de bande passante [3] et la version fr [4] un autre en fr [6]
  • Marquage de paquet [5]

Sinon, quelques liens à lire sur iptables :

  • La doc d’ubuntu!! Pour les gros noob only!! (attention je fais du tracking toutes vos connexion seront marqués « GROS NOOB » :p)

Analyse automatisée des logs apache

Bonjour à tous …
[la traduction du terme analyse dans le texte est GREP ^^ faut pas s’attendre à une analyse mathématique !!]

Bé voilà, comme j’adore raconter ma vie, voici un petit truc sympa :

Aujourd’hui on a eu droit à un cours … le premier depuis des mois!!! L’ennui se faisant sentir (un cours sur les tests … déjà vu en DUT), je me connecte à mon serveur et après un petit tour du proprio … comme d’hab koi ^^ Je lis les logs de mon serveur … (c’est grave docteur ??) et là horreur plein de ligne du ModSecurity m’indiquant pleins de tentatives diverses et variées (XSS, SQL Injection, …).

Un petit aperçu d’une ligne du log :

[Fri May 15 16:36:35 2009] [error] [client 74.55.32.34] ModSecurity: Access denied with code 501 (phase 2).
[msg "Remote File Access Attempt"]
[severity "CRITICAL"] [tag "WEB_ATTACK/FILE_INJECTION"]
[hostname "blog.gaetan-grigis.eu"]
[unique_id "Sg1981diuFsAADJ2ypYAAAAC"]

Le genre du truc qu’en terminal on aime pas trop lire (surtout sur l’écran du téléphone portable) … et pis y’en avais une bonne cinquantaine … et là mes venu la superbe idée (j’imagine que plein d’admins l’on déjà fait, mais bon ^^ au cas où si ça vous intéresse), j’ai crée un petit script qui analyse le log d’erreur d’apache (par grep quoi ^^) et envoi un mail avec les lignes incriminées, ce qui donne donc (il vous faudra bien sûr le mod_security d’installé … cf. mon blog ;))

#!/bin/sh
LOG_ERROR="/var/log/apache2/error.log"
LOG_MODSEC=`cat $LOG_ERROR |grep ModSecurity | wc -l`
if [ $LOG_MODSEC -gt 0 ]
then
        SEVERITY_ALERT=`cat $LOG_ERROR | grep "severity \"ALERT\"" | wc -l`
        SEVERITY_CRITI=`cat $LOG_ERROR | grep "severity \"CRITICAL\"" | wc -l`
        if [ $SEVERITY_ALERT -gt 0 ]
        then
                cat $LOG_ERROR | grep "severity \"ALERT\"" |mail -s "[LOG]HTTP ALERT" addr@gmail.com
                echo "NB ALERT : $SEVERITY_ALERT"
        fi

        if [ $SEVERITY_CRITI -gt 0 ]
        then
                cat $LOG_ERROR |grep "severity \"CRITICAL\"" | mail -s "[LOG]HTTP CRITICAL" addr@mail.com
                echo "NB CRITICAL : $SEVERITY_CRITI"
        fi
fi

et voila passionnante ma vie ^^, en ASM ça se résumerait ainsi : (MOV al,1 XOR ebx,ebx, int 0x80), reste plus qu’à exécuter le script avant le rotatelog histoire d’avoir le résumé des attaques de la journée/semaine …
Je vais peut être en profiter pour faire des graphiques suivant les types d’attaque, leurs nombres, leurs provenances, … ou pas

Petit ajout du 17 mai … pour rajouter un script du genre celui donné plus haut, il faut aller voir dans le fichier /etc/logrotate.d/apache2 et ajouter les lignes suivantes :

        prerotate
                sh /scripts/logAnalyzer.sh > /dev/null
        endscript

après la ligne sharedscripts et hop, on envoi les mails avant la rotation des logs, comme ça on passe pas pour le nolife-ki-li-ses-logs-apache-pendant-les-cours devant ses camarades de classe.

Voilà … bon we 😉