PDA

Voir la version complète : Script php pour les sipvicious



ds3
07/10/2011, 13h07
#!/usr/bin/php
<?php
// ################################################## ##
// # #
// # 4sipviciuous VER 0.1 | 2011 #
// # DOTSMART #
// # http://www.dot-smart.com #
// # #
// ################################################## ##
//
// L intérêt de ce script est de pouvoir analyser les fichiers log d'1 asterisk et de partager les informations des scans sur la grappe entière.
// Les nœuds de la grappe connaitrons avant le scan les ip susceptibles de les scanners
// Pourquoi php-cli ? pourquoi pas !
// ereg = deprecated
//
//
// Structure de la table 4sipvicious
// CREATE TABLE IF NOT EXISTS `ip_blocked2` (
// `id` int(11) NOT NULL AUTO_INCREMENT,
// `date_insert` datetime NOT NULL,
// `date` varchar(30) NOT NULL,
// `ip` varchar(30) NOT NULL,
// `port` varchar(5) NOT NULL,
// `autorise` int(11) NOT NULL,
// PRIMARY KEY (`id`),
// KEY `ip` (`ip`,`port`,`date_insert`)
// ) ENGINE=MyISAM DEFAULT
//
// Crontab -e | */5 * * * * sudo /usr/bin/php ../../4sipvicious2.php > /dev/null 2>&1
//
// Penser au logrotate pour éviter des traitements de logs trop volumineux
//
// roadmap : ajouter exp. regulieres pour iptables et gestion du port
// ajouter la gestion de l’état 2 pour autoriser une ip depuis la database + iptables + suppression dans iptables si présente
// centraliser les clients ipbx
// passe 1 ip en défaut au bout de X tentatives, he oui les utilisateurs ont le droit de se tromper ! (gestion, peut être envoyer un émail a l utilisateur ?)

$host = "LA DB";
$login = "LE LOGIN MYSQL";
$mdp = "LE MDP MYSQL";
$db = "4sipvicious";
$action = NULL;
$stack_ip = array(); // Création de la stack ip
$stack_info = array(); // Création de la stack info
$fichier = "/var/log/asterisk/messages"; // Fichier de log asterisk
if (!$fp = fopen($fichier,"r")) // Ouverture du fichier,
{ print "Error open file\n"; exit; // si problème on affiche et exit les pointes seches
}else { print "Read file $fichier ...\n"; // Pas de problème ... la suite
while(!feof($fp)) { // La boucle du fichier
$Ligne = fgets($fp,4096); // Lecture des ligne
ereg("\[(.*){1}\].*\].*failed for '(.*):(.*)' - No matching peer found",$Ligne,$askip); // On recherche exp reg pour 1.8 supprimer :.* pour les < 1.8
if ($askip == TRUE) array_push($stack_info, array($askip[1], $askip[2], $askip[3])); // On push l'ip trouvee dans la stack avec les infos correspondantes
} // Fin de la boucle
fclose($fp); // On ferme le fichier de log
} // fin de lecture du fichier log
// Maintenant on verifie et integre Ã* la BD
$link = mysql_connect($host, $login, $mdp); // CX a la mysql
if (!$link) { die('Could not connect: ' . mysql_error()); exit; } // piti erreur pour la DB ?
mysql_select_db($db,$link); // on sélection la DB 4sipvicious
print 'DB connected successfully\n';
// Ah le (if not exist) de mysql quel bonheur
reset($stack_info); // on reset la stack
foreach ($stack_info as $v1) { // On boucle la stack ip_info
$da=$v1[0]; print "date:" .$da."|";
$ip=$v1[1]; print "ip:" .$ip."|";
$po=$v1[2]; print "port:" .$po."\n";

$query = mysql_query("select `id` from `ip_blocked2` where `date` = '".$da."' and `ip` = '".$ip."' and `port` = '".$po."';");
$num = mysql_num_rows($query);

if($num == 0)
{ // Si inexistante,ajout
$sql = "INSERT INTO `4sipvicious`.`ip_blocked2` (`id` ,`date_insert` ,`date` ,`ip` ,`port` ,`autorise`) VALUES (NULL , NOW( ) , '$da', '$ip', '$po', '0');";
$result = mysql_query($sql);
print "record insert for ".$ip;
} elseif($num > 0) {
print "record exit, remember 1 per seconde :(, we are not not reference "; // inexistante
}

}
// On s'occupe d'iptables
$commande = popen('iptables-save -c 2>&1', 'r'); // Facile
$iptables = (fread($commande, 8096)); // c'est fini !
pclose($commande); // Fermeture popen
// Bouclage de des ips et verification de son existance dans iptables
$sql = mysql_query("SELECT DISTINCT(ip), port FROM `4sipvicious`.`ip_blocked2`"); // On liste les ip unique avec le port
while ($result = mysql_fetch_array($sql)) {
if (preg_match("/".$result['ip']."/",$iptables)) { // ip db est elle existante dans iptables ?
print $result['ip']." is present, next\n";
} else{
$action .= "/sbin/iptables -I INPUT -s ".$result['ip']." -p udp --dport ".$result['port']." -j DROP\n";
print $result['ip']." is not present, next\n";
}

}
if ($action == TRUE) system($action); // On lance iptables avec toutes les ip a dropper
if (mysql_close($link)) // On ferme tout et sortie
print 'down connected successfully\n';
exit;
?>

jean
07/10/2011, 15h38
en une ligne:


iptables -A INPUT -p udp -m string --string "sipvicious" --algo bm --to 300 -m udp --dport 5060 -j DROP


et bye bye sipvicious.....

ds3
07/10/2011, 15h55
C'est moins rigolo et nous aimons les expressions régulières :)
et puis ça évolue vite (d'ailleurs le sipvicous, n'est pas toujours sipvisious) . Au moins là ... mais y' bien d'autres méthodes.

jean
07/10/2011, 15h59
:-) :-) :-) :-) :-) j'aime bien ta réponse...

+ sérieusement, j'ai tous les noms des scanners rentrés dans mes iptables, et j'ai jeté fail2ban à la poubelle.... enfin, qd meme pas, mais il n'intercepte jamais rien... alors que mes iptables choppent 3-4 scanners / jour

la "beauté" de ces filtres iptables, c'est que le scanner ne voit meme pas le serveur voip... alors que f2b lui révèle (avec ton script, seulement sur le premier serveur attaqué).

je peux faire parvenir l'ensemble des signatures que j'ai en PM, j'ai pas trop envie de trop distribuer, sinon elles vont évoluer !

ds3
07/10/2011, 16h05
la "beauté" de ces filtres iptables, c'est que le scanner ne voit meme pas le serveur voip... alors que f2b lui révèle (avec ton script, seulement sur le premier serveur attaqué).


C'est vrai, mais ou est le plaisir ;)



je peux faire parvenir l'ensemble des signatures que j'ai en PM, j'ai pas trop envie de trop distribuer, sinon elles vont évoluer ! Avec plaisir. je t'enverrai en échange la collecte faite depuis 4 ans :) un peu lourd le fichier.

Comdif
07/10/2011, 21h30
Tout ça est très bien mais suite à pas mal d'audits sur des serveurs ayant eu des
cracks importants, sauf quelques rares cas de serveurs mal configurés, 9 fois sur 10 un bon hacker arrive avec tout ce qu'il faut pour utiliser le compte
ayant déjà collecté les infos coté point faible, l'utilisateur,
j'ai publié il y à quelques mois un code pour hacker les audiocodes avec 50% de réussite.
Bricolez un petit
robot (même pas dur a faire) pour scanner des ranges d'ip en permanence
ou mieux (mais légèrement plus complexe) le distribuer le sous forme de Virus :-) et vous pouvez scanner le monde et obtenir des comptes valides frais chaque matin en vous levant :-)

jean
08/10/2011, 00h24
pas franchement compris ta réponse...

bien sur, l'utilisateur est un point faible (nous serions tous plus heureux sans utilisateurs... ou pas !). C'est pour ca que certains soft, comme freepbx ont des modules de détection de password faibles

en revanche, bien sur que c'est simple de scanner... mais avec un bon iptables et un fail2ban, un scanner sans relation avec un utilisateur a du mal rentrer

ds3
08/10/2011, 10h24
nous serions tous plus heureux sans utilisateurs... ou pas

Il est quand même préférable d'avoir des utilisateurs, que ferions nous sans eux ?!

ffossard
08/10/2011, 18h02
Il pourrait être intéressant de mettre en place un serveur Asterisk "pot de miel" qui récupère les ip, le nombre de tentatives depuis chaque, la date de la dernière, etc... et de partager tout ça entre les membres de l'asso :hello:

jean
08/10/2011, 19h00
@ds3 - Umour évidemment ;-) (sans bande dessinée...)

@ffossard - il y a tellement d'ip qui scannent... en fait j'ai un honey pot, mais qui me permet de récupérer les signatures des scanners, et je les rajoute dans mes iptables.

je reste convaincu que cette technique (signatures dans iptables) est la plus efficace en premier niveau... il en faut d'autres pour ceux qui passent, mais ils sont rares !

J.

ds3
10/10/2011, 09h44
@Jean
Tu vois, nous sommes pas les seuls à vouloir des solutions rigolotes et nous torturer l esprit et a chercher un max de log. ;)

@ffossard
En voilà une idée quelle est bonne.
Vous hébergez le service pour collecter les infos ?
Le seul point noir est de connaitre la pertinence des ip renvoyées et collectées par les extérieurs disposant du 4sipvicous.

2 idées me traversent l'esprit,

- Nous utilisons toutes nos bandes passantes OHV/COGENT pour renvoyer des flux aussi pénibles vers l’attaquant.
Cela n'a aucun intérêt hors lui passer un trafic monstrueux.

Récupération du DNS reverse, extraction du transitaire et envoi email à abuse@transitaire : même si ce transitaire n'apportera aucun intérêt à notre demande, cela aura le mérite d’être fait.

Cela dit, la technique de Jean est très bien. Mais trop passive dans l'active à notre goût. heuu c'est clair ?

jean
10/10/2011, 10h01
la seule fois ou j'ai balancé un mail à abuse@domain, c'était un gars hébergé par amazon (aws), et ca n'a fait qu'énerver encore plus le gars, et monter le volume de trafic vers chez moi....

en revanche, si n personnes envoient un mail, peut etre que l'effet est plus percutant

ds3
10/10/2011, 11h14
C'est la même idée lui faire exploser ses compteurs de BP.

qui sont tes transitaires ?

jean
10/10/2011, 14h47
pas sur de comprendre "transitaire" ! le gars avait son IP chez amazon, et la machine était dans l'offre aws

Reaper
10/10/2011, 17h24
J'ai du envoyer les messages tout le temps, le dernier fois c’était la bibliothèque publique de San Francisco (leur serveur) J'ai du les appeler pour que les attaques cessent.

ds3
10/10/2011, 17h28
pas sur de comprendre "transitaire" ! le gars avait son IP chez amazon, et la machine était dans l'offre aws

Ceux qui te fournissent ta connectivité, Néo, Jaguar, Cogent, TATA, Interoute, L3 ...

ds3
10/10/2011, 17h29
J'envoi les messages tout le temps, le dernier fois c’était la bibliothèque publique de San Francisco (leur serveur) J'ai du les appeler pour que les attaques cessent.

Et tu as quoi comme retour, sur les abuse@ ? rien ...

Reaper
10/10/2011, 17h29
Ce qui agaçant chez aws, ces cochons mettent la pub même dans leur message d'abuse, WTF.

Reaper
10/10/2011, 17h31
Et tu as quoi comme retour, sur les abuse@ ? rien ...

Admin en façe a du couper la machine.
AWS = Rien
1&1 = Rien
Transit = Rien
Boite privées = une bonne réaction.
Les pires c'est transit, ils ont rien a foutre franchement, c'est du traffic.

Comdif
10/10/2011, 20h51
la seule fois ou j'ai balancé un mail à abuse@domain, c'était un gars hébergé par amazon (aws), et ca n'a fait qu'énerver encore plus le gars, et monter le volume de trafic vers chez moi....

en revanche, si n personnes envoient un mail, peut etre que l'effet est plus percutant

J'ai eu a faire à eux avec le fichier log a l'appui, heure serveur, etc..
et contrairement a toi ceci a été pris très au sérieux et le serveur à été coupé
assez vite, juste quand j'ai demandé à juste titre l'identité du hacker que ça a coincé, je peux comprendre l'éthique informatique etc.. mais la quand même
trop c'est trop, les hackers sont la pollution du net.

ds3
11/10/2011, 09h41
J'ai eu a faire à eux avec le fichier log a l'appui, heure serveur, etc..
et contrairement a toi ceci a été pris très au sérieux et le serveur à été coupé
assez vite, juste quand j'ai demandé à juste titre l'identité du hacker que ça a coincé, je peux comprendre l'éthique informatique etc.. mais la quand même
trop c'est trop, les hackers sont la pollution du net.

Et comme toujours les bons paient pour les mauvais, la dure loi de la vie.

ds3
11/10/2011, 09h52
Admin en façe a du couper la machine.
AWS = Rien
1&1 = Rien
Transit = Rien
Boite privées = une bonne réaction.
Les pires c'est transit, ils ont rien a foutre franchement, c'est du traffic.

Pour préciser les contacts tech et admin qui doivent gérer abuse@, il existe la base des RIR Ripe, afnic etc ...
C'est une info, nous n'avons jamais effectué cette démarche. Enfin pas pour ce type de problèmes.

Example pour 1&1

https://apps.db.ripe.net/whois/lookup/ripe/person-role/AFI5-RIPE.html


person: Axel Fischer
address: 1&1 Internet AG
address: Brauerstr. 48
address: D-76135 Karlsruhe
phone: +49 721 91374 0
e-mail: axel.fischer@oneandone.net
nic-hdl: AFI5-RIPE
notify: ripe-role at oneandone.net
abuse-mailbox: abuse at oneandone.net
mnt-by: AS8560-MNT
changed: axel.fischer at oneandone.net 20070813
changed: ripe-role at oneandone.net 20090514 <#### A éviter, très mal perçu. Cet email est pour les échanges RIPE vs adhérant
source: RIPE

Reaper
11/10/2011, 10h48
J'utilise toujours abuse trouvé par "whois" généralement il me renvoi la confirmation de réception et c'est tout.

jean
22/02/2013, 15h37
alors que mes iptables choppent 3-4 scanners / jour


Salut à tous

Je reviens sur le sujet des scanners... ce thread a 15 mois si je ne trompe, et j'étais à 3-4 scans par jour... je suis maintenant à 10-15 robots par jour qui essaient de scanner mes ips... (par ip)

Est ce que vous aussi, vous avez constaté une augmentation du nombre de scans ?

J.

fastm3
22/02/2013, 18h05
Je regarde meme plus les logs de scans 5060 vu qu'il n'y aucune chance que le hack puisse avoir lieu par la sur mes installs.
Pour les extensions locales , l'authentification n'est de plus autorisée que depuis le subnet local juste au cas ou...Les extensions remotes , seulement de l'ip prevue.

Pour debuter ( on voit souvent le contexte defaut utilisé pour tout...), il est vraiment conseiller de ne pas laisser le port sip ouvert à tous avec un systeme de liste blanche ou meme tout fermer en s'amusant en local.

Mais oui, les logs montre que le port 5060 est de plus en plus scanné. Le changer n'est pas vraiment plus safe, mais au moins limite les probabilités de scans.
Fastm3.

Comdif
22/02/2013, 19h49
Perso pas le choix puisque j'exploite et entretient des switch online
ce que je fais en général c'est évaluer les clients susceptibles de s'y connecter
fai, pays ou mieux ip fixe et je bloque tout le reste sur Iptables.
Refus des forward anonymes et quand j'en ai besoin je crée un pseudo trunk.
Avec ces quelques règles les scan SIP et tentatives sont devenus assez rares.

celya
04/03/2013, 23h38
Nous aussi nous avons des machines ouvertent sur des IP Public.
Outre les protections par des mots de passe de type PWGEN, on utilise fail2ban+une ouverture des IP sur le FIREWALL+SNORT.