Pourrir des votes avec bash et wget

plop à tous … encore un script super useless (comme d’hab).

L’utilité du script est de bourriner une url de vote pour plomber ou augmenter des stats (le site avait une vérification par ip, donc il fallait utiliser des proxy).
Connaissant samair.ru(mon fournisseur de proxy), mon script ne fonctionnera qu’une semaine ou deux, mais comme je fait appel à pas mal de trucs intéressant dans ce script, je le partage, donc c’est juste informationnel et non pas fonctionnel.

Je rappel que l’utilisation de mon script n’engage que vous … vous êtes seul responsable en cas d’effet de bord, ou de dégâts causé par l’utilisation de se script … (j’ai quand même mis un sleep histoire de ne pas trop surcharger le serveur …).

Continuer la lecture de Pourrir des votes avec bash et wget

SSL via GNUTLS sur apache2

Plop à tous …

Aujourd’hui j’ai joué a « qui a la plus grosse » config ssl et c’est là que j’ai remarqué que le mod_ssl d’apache ne supportait que les protocoles SSLv3 et TLSv1.0 (le TLSv1.1 est en cours de dev) ce qui donnait un score pitoyable à mon blog sur ssllabs (qui permet d’avoir une idée du niveau de sécurité de l’implémentation ssl/tls d’un serveur web).


(Au passage certaine banques françaises en sont encore au niveau F, donc c’était déjà pas trop mal pour un blog ^^).

Continuer la lecture de SSL via GNUTLS sur apache2

Protection Ddos (soft)

Plop …

un petit retour sur le Ddos de ce week-end … conformément aux prédictions de certains concernant mon précédent article, un ban permanent n’est généralement pas une bonne idée, notemment lorsque les paquets sont forgés :

  • ça remplit inutilement les règles du firewall (la dernière attaque avait finit avec 600 lignes de DROP, ce qui rend difficile la lecture des règles mise en place)
  • en cas de ban d’un « client/joueur », il est banni à vie
  • il y a un risque si l’attaquant connait l’ip de l’admin et la fait bannir en floodant avec son ip

Donc on m’a filé une autre commande, plus courte et aussi performante, sans remplir inutilement les règles iptables :
(il faut supprimer l’espace entre les deux – – dans les commandes suivantes, wordpress les transforme en un seul -)

/sbin/iptables -A INPUT -p tcp - -dport 25565 -m state - -state NEW -m recent - -set
/sbin/iptables -A INPUT -p tcp - -dport 25565 -m state - -state NEW -m recent - -update - -seconds 60 - -hitcount 5 -j DROP

Ici, on surveille tout les nouveaux paquets sur le port 25565 et si la même ip renvoit de nouveaux paquets on incremente un compteur, si celui-ci atteint le hitcount (ici 5) dans les 60 secondes, on drop les paquets.

Si le visiteur lambda se fait drop, il devra juste attendre la fin de l’intervalle depuis son dernier paquet envoyé (ici 60 secondes à chaque fois),

Si c’est une attaque dos, il ne pourra envoyer que 5 nouveaux paquets par minutes, réduisant de ce fait la puissance de son attaque (si à chaque syn envoyé une nouvelle ip est forgée, cette protection ne servira à rien … et mon ban permanent aussi d’ailleurs ;)).

Et maintenant que la machine est « protégée » (c’est relatif hein ;)), il faut tester la sécurité ^^, on flood donc notre machine en envoyant des paquets SYN (avec scapy) sur le port du service que nous avons protégé.

On crée donc un fichier avec ce contenu en changeant les valeurs des ip, la valeur du loop et le port (derrière une NAT ça remplace l’ip source par votre adresse ip) :

#!/usr/bin/python
from scapy.all import *
send(IP(src=RandIP("0.0.0.0/0"),dst="ipserv")/TCP(sport=1337,dport=port du service,flags="S"),loop=5,inter=0.01)

Pour vérifier que les paquets sont drop, on fait un tcpdump sur le port en question et on compte le nombre de paquets provenant du port 1337.

tcpdump dst port 80 and src port 1337

(Si la règle en interdit plus de 5 et qu’on reçoit les 10 y’a un problème) ou l’on check les stats d’iptables via

iptables -L -v -n

Par contre, on peut s’amuser avec scapy à randomiser les ip (à faire sur des machines non natées) et tenter de flooder le service sans se faire drop un seul paquet :

#!/usr/bin/python
from scapy.all import *
sendp(Ether(src=RandMAC('*:*:*:*:*:*'),dst="port mac passerelle")/IP(src=RandIP("0.0.0.0/0"),dst="ip serveur")/TCP(sport=RandShort(),dport=port du service,flags="S"),loop=100,inter=0.01)

Et là on se rend compte que l’on peut facilement contourner la règle iptables précédente, et qu’il devient important de mettre en place une règle globale pour toute les ip sur un service en particulier.

Donc pour mettre en place une limite globale par exemple sur le port 80 qui peut traiter au max 1000 connexions en parallèle (en imaginant qu’une requête est traitée en 1 seconde (téléchargement d’une page web en générale) ce qui n’est pas forcément vrai pour tout les services, donc on laisse au mimimum 10% du nombres des connexions pour les connexions en cours) ce qui donne :

iptables -A INPUT -p tcp - -syn - -dport 80 -m limit - -limit 900/s -j ACCEPT

Et si l’on rebalance un SYN flood avec le script précédent, en lançant plus de 1000 syn en parallele, seul une partie d’entre eux devrait passer.

Ce système permet surtout de protéger les services derrière le firewall en cas d’attaque permettant de passer les règles présentées jusque là.

Protection DDos et ban de masse

Plop …
J’ai eu droit à ma première intervention sur serveur DDosé, au départ 2/3 machines qui envoyaient des paquets SYN en boucle sur un serveur minecraft (écrit en java donc avec 200 SYN/sec le serveur tombe), et à la fin c’est environ 150 machines qui se sont relayés pour Dosé.

La plupart du temps lorsque l’on recherche des protections DDos on trouve des sites qui recommandent de mettre direct un limit sur un port sans tenir compte de la source … ce qui peut se révéler utile sur des petits serveurs, mais pas lorsque l’on tourne à plusieurs centaines de connexion seconde.

Continuer la lecture de Protection DDos et ban de masse

Petit serveur d’adresse mail de diffusion

Plop à tous … encore un truc useless à partager.

J’ai récemment dû intervenir dans une entreprise qui avait un serveur de mail qui ne supportait pas les listes de diffusion (service de base fournit par yahoo en fait, donc à part forwarder des mails sur une adresse, il est pas possible de faire grand chose).

Ne voulant pas perdre trop de temps à mettre en place des systèmes du genre mailman ou autre, pour créer une vingtaine d’alias pour deux adresses mails (style support@mondomaine.fr qui envoit un mail pour toute la team de support), j’ai décidé de coder un serveur de mail qui ne répondrait qu’à certaines adresses et renverrait le mail sur les adresses configurées pour cette adresse de diffusion.

Ecrire ce genre de truc en python est encore plus rapide que de chercher l’équivalent sur google 😉 d’où ma démarche.
Continuer la lecture de Petit serveur d’adresse mail de diffusion