Journal OSSEC et réponse active pour Asterisk

Posté par (page perso) . Licence CC by-sa
13
17
déc.
2013

SPOILER: a la fin, je met un décodeur correct pour bloquer les brute force sur asterisk avec OSSEC

Comme beaucoup d'entre vous, j'héberge un serveur Asterisk et je reçois beaucoup de tentatives de brute-forces tous les jours.
Mon amis OSSEC est censé m'aider à gérer ces situations. Pour ceux qui ne connaissent pas, OSSEC est un host IDS assez bien foutu et Open Source (bon, ok, j'ai pas vérifié la licence).
Les lignes de lot ressemblent à ça:

Dec 17 22:37:25 new asterisk[20110]: NOTICE[20127]: chan_sip.c:25030 in handle_request_register: Registration from '"6100" <sip:6100@176.31.180.43>' failed for '85.25.110.243:5188' - Wrong password

Sauf que OSSEC, ben il s'en fout. Il détecte bien des problèmes (dans /var/ossec/logs/alerts/alerts.log:

** Alert 1387311140.2271: - syslog,asterisk,authentication_failed,
2013 Dec 17 21:12:20 new->/var/log/syslog
Rule: 6210 (level 5) -> 'Login session failed.'
Dec 17 21:12:18 new asterisk[5364]: NOTICE[5387]: chan_sip.c:25030 in handle_request_register: Registration from '"6001" <sip:6001@176.31.180.43>' failed for '85.25.110.243:5581' - Wrong password

Hélas, il ne veut pas faire de réponse active (pcq oui, OSSEC fait de la réponse active). Par défaut, OSSEC bloque toutes les alertes de niveau supérieur ou égal à 10.
Je me dis c'est bien, je vais augmenter le niveau des alertes asterisk (pour ceux qui sont malin, mon alerte, la 6210 est de niveau 5).
Facile, je vais dans /var/ossec/rules/asterisk_rules.xml et je mets ma règle au niveau 10… et là… ben ça marche pas non plus.
Mais c'est cool, j'ai dit à OSSEC que attaquer asterisk, c'est vraiment pas bien.
Je vous passe environs 102 autres essais.
Enfin, je décide de m'attaquer aux décodeurs. Il y a une super commander qui permet de tester une ligne de log et de voir comment elle est traitée:

root@new:/var/ossec/logs# ../bin/ossec-logtest 
2013/12/17 22:33:32 ossec-testrule: INFO: Reading local decoder file.
2013/12/17 22:33:32 ossec-testrule: INFO: Started (pid: 26097).
ossec-testrule: Type one log per line.
Dec 17 22:31:37 new asterisk[20110]: NOTICE[20127]: chan_sip.c:25030 in handle_request_register: Registration from '"6100" <sip:6100@176.31.180.43>' failed for '85.25.110.243:5188' - Wrong password
**Phase 1: Completed pre-decoding.
   full event: 'Dec 17 22:31:37 new asterisk[20110]: NOTICE[20127]: chan_sip.c:25030 in handle_request_register: Registration from '"6100" <sip:6100@176.31.180.43>' failed for '85.25.110.243:5188' - Wrong password'
   hostname: 'new'
   program_name: 'asterisk'
   log: 'NOTICE[20127]: chan_sip.c:25030 in handle_request_register: Registration from '"6100" <sip:6100@176.31.180.43>' failed for '85.25.110.243:5188' - Wrong password'
**Phase 2: Completed decoding.
   decoder: 'asterisk'
**Phase 3: Completed filtering (rules).
   Rule id: '6210'
   Level: '10'
   Description: 'Login session failed.'    
**Alert to be generated.

Et là, bingo! C'est quoi ce décodeur "asterisk" qui me met 3 fois rien comme détails. Il n'extrait même pas la source IP ou le port de destination!
Là j'édite /var/ossec/etc/decoder.xml et je remarque que c'est un décodeur super basique qui est utilisé, ceux qui extraient les infos utiles, ne fonctionnent pas.

<decoder name="asterisk">
  <program_name>^asterisk</program_name>
</decoder>

Ca c'est bon, c'est le parent de base. Le problème est plus là:

<decoder name="asterisk-denied">
  <parent>asterisk</parent>
  <prematch>^NOTICE[\d+]: \S+ in \S+: Registration from </prematch>
  <regex offset="after_prematch">^\S+ failed for '(\d+.\d+.\d+.\d+)'</regex>
  <order>srcip</order>
</decoder>

C'est pas du tout le format de mes lots. Ce serait plus ça qui est bon?

<decoder name="asterisk-denied">
  <parent>asterisk</parent>
  <prematch>^NOTICE[\d+]: \S+ in \S+: Registration from \S+ \S+</prematch>
  <regex offset="after_prematch">^failed for '(\S+):(\d+)'</regex>
  <order>srcip,srcport</order>
</decoder>

De même

<decoder name="asterisk-denied2">
  <parent>asterisk</parent>
  <prematch>Registration from </prematch>
  <regex offset="after_prematch">failed for '(\d+.\d+.\d+.\d+)'</regex>
  <order>srcip</order>
</decoder>

Doit être remplacé par:

<decoder name="asterisk-denied2">
  <parent>asterisk</parent>
  <prematch>Registration from </prematch>
  <regex offset="after_prematch">failed for '(\S+):(\d+)'</regex>
  <order>srcip,srcport</order>
</decoder>

Pour ceux qui suivent, j'ai commenté les décodeurs foireux et j'en ai fait de nouveau, sans doutes un peu foireux aussi, mais qui au moins bloquent les alertes de mauvais login asterisk.
Maintenant, à chaque mauvais login, on reçoit un bon gros ban de 3600 secondes grâce à la réponse active activée par défaut pour tous les événements de niveau 10 ou plus.
Demain, si ça intéresse quelqu'un, on verra comment ne pas modifier la priorité des règles asterisk (pcq c'est quand même pas très propre) et faire une règle spécifique pour asterisk.
Pcq avec la version actuelle, vous vous faites bloquer 10 minutes si vous vous trompé de mot de passe (ça pousse à la discipline).

  • # Petite mise à jour

    Posté par (page perso) . Évalué à 1.

    Là où c'est super beau, c'est que une fois les décodeurs réparés, OSSEC montre sa pleine puissance.
    En fait, inutile de changer la priorité de la règle 6210 d'asterisk. OSSEC contient déjà une règle disant que si il y a 6 mauvais mots de passe (donc règle 6210) en 300 secondes, c'est un niveau 10 … tadam!!!!!

    • [^] # Re: Petite mise à jour

      Posté par . Évalué à 2.

      petite question, plus sur le déploiement d'asterisk que d'ossec : tu utilises asterisk avec quel provider sip/pstn ? (ou tu fais du full pstn).

      A chaque fois que j'essaie de configurer asterisk il arrive pas à s'enregistrer (free inside) (bon j'avoue que j'essaie pas trop longtemps ,j'ai tellement de projet pour faire mumuse qu'asterisk reste souvent dans les cartons).

      Mais pour rebondir sur ossec : à part le brute force, il y'a quoi comme attaques courante sur asterisk et le sip en particulier ? le paramétrage du rtp/… n'est pas trop bloquant ? On ne peut pas forcer asterisk a faire une authentification par certificat ?

      Je reconnais que je dérive un peu beaucoup, mais comme tu semble plus doué que moi sur asterisk j'en profite :)

      • [^] # Re: Petite mise à jour

        Posté par (page perso) . Évalué à 2.

        Bonjour,

        Alors en vrac, j'utilise asterisk avec OVH. Ca ne se comporte pas toujours super bien (y'a plusieurs ligne) et je reboot toutes les nuits vert minuit pour être sur que ça tourne.

        Pour asterisk, OSSEC se base sur des entrées du log, il ne détecte pas grand chose à part les faut mots de passe et un truc de hijacking que j'ai pas encore creusé. (mais il fait un très bon boulot pour ssh, l'intégrité des fichiers…etc).

        Je crois pas qu'on puisse forcer l'utilisation de certificats avec asterisk. Pour ma part, j'avais créer un OpenVPN et configuré asterisk pour que les clients internes soient seulement sur l'interface virtuelle du VPN. C'est cool, on est moins attaqué mais mon père qui n'a pas le matos pour ne peut créer de tunnel permanent de son réseau vers mon serveur. Donc, j'ai un mot des mots de passe très compliqués et OSSEC en réactif.

  • # fail2ban

    Posté par (page perso) . Évalué à 3.

    C'est quoi la différence fondamentale avec Fail2ban ?

    • [^] # Re: fail2ban

      Posté par . Évalué à 1.

      Fail2ban ne regarde que les logs alors qu'OSSEC peut aussi vérifier l'intégrité de fichiers et contrôler les processus chargés en mémoire. Tu peux aussi installer plusieurs sondes OSSEC dont le traitement est centralisé. Je ne crois pas que ce soit possible, de base, avec fail2ban.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.