Kesako "Threat Intelligence Teams Bot" ? En une phrase c'est un bot 🤖 qui publie sur un canal Microsoft Teams les dernières informations sur la Cyber Sécurité 🏴‍☠️. Très utile pour faire de la Threat Intelligence.

J'ai développé Threat Intelligence Teams Bot en m'inspirant très fortement 😛 du bot de VX-Underground écrit en python.

⚠️ J'utilise la fonction match ... case qui nécessite Python 3.10 minimum !!!

J'y ai apporté les modifications suivantes par rapport à la version de VX-Underground :

  • Publier sur Microsoft Teams au lieu de Discord.
def send_teams(webhook_url:str, content:str, title:str, color:str="000000") -> int:
    response = requests.post(
        url=webhook_url,
        headers={"Content-Type": "application/json"},
        json={
            "themeColor": color,
            "summary": title,
            "sections": [{
                "activityTitle": title,
                "activitySubtitle": content
            }],
        },
    )
    return response.status_code
  • Mettre en forme les publications pour MS-Teams (avec des emojis  😇)
  • Utilisation de la base JSON générée par Ransomwatch pour les remontées de Ransomware en utilisant la lib JSON de python.
  • Modifier le code pour accepter les flux RSS d'ATT et de l'ENSIA (problème avec le champ date)
 try:
    DateActivity = time.strftime('%Y-%m-%dT%H:%M:%S', RssObject.published_parsed)
 except: 
    DateActivity = time.strftime('%Y-%m-%dT%H:%M:%S', RssObject.updated_parsed)

D'ailleurs cette solution a été depuis intégrée dans le bot original de VX-Underground suite à mon PR 😊

# Correction for issue #1 : https://github.com/JMousqueton/CTI-MSTeams-Bot/issues/1
        try:
            TmpObject = FileConfig.get('main', Entries["group_name"])
        except:
            FileConfig.set('main', Entries["group_name"], " = ?")
            TmpObject = FileConfig.get('main', Entries["group_name"])
  • Ajouter des flux RSS (ANSSI, Cyber-News, et d'autres)  
  • Ajouter quelques vérifications au démarrage du bot pour éviter la gestion des erreurs pendant l'execution (oui ce n'est pas bien 😛)
 # Make some simple checks before starting 
    if sys.version_info < (3, 10):
        sys.exit("Please use Python 3.10+")
    if (str(Url) == "None" and options.Debug == 'False'):
            sys.exit("Please use a MSTEAMS_WEBHOOK variable")
    if not exists("./Config.txt"):
        sys.exit("Please add a Config.txt file")
    if not exists("./Feed.csv"):
        sys.exit("Please add the Feed.cvs file")
  • Ajouter des options pour l'utilisation en ligne de commande
python3 TeamsIntelBot.py -h
Usage: TeamsIntelBot.py [options]

Options:
  --version    show program's version number and exit
  -h, --help   show this help message and exit
  -q, --quiet  Quiet mode
  -D, --debug  Debug mode : only output on screen nothing send to MS Teams
  • Ajouter une vérification de nouvelle version du script
  • Utiliser Github-Action pour ne pas avoir à installer sur un serveur le bot  
name: Fetch-CTI

on:
  schedule:
    - cron: '15 * * * *'
  workflow_dispatch:

jobs:
  CTI:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    environment: CI
    steps:
      - name: checkout the repo
        uses: actions/checkout@v3
      - name: Use Python 3.10 
        uses: actions/setup-python@v4
        with:
          python-version: '3.10' 
      - name: install dependencies
        run: |
          pip3 install -r requirements.txt
      - name: run scraper
        env:
          MSTEAMS_WEBHOOK: ${{ secrets.MSTEAMS_WEBHOOK }} 
        run: |
          python3 TeamsIntelBot.py
      - name: save changes
        run: |
          git config --global user.email "bot-parser@users.noreply.github.com"
          git config --global user.name "Bot-Parser"
          DATE=$(date -Iseconds)
          git commit --all --message "Updated by Bot-Parser on $DATE" || echo "no changes to commit"
          git push

Si vous ne souhaitez pas utiliser Github-Action il suffit de définir une variable d'environnement MSTEAMS_WEBHOOK avant de lancer le script

Exemple fictif (les ID ont été générés avec uudigen 😛 ) :

MSTEAMS_WEBHOOK=https://mousqueton.webhook.office.com/webhookb2/08589F1C-EEA2-4C92-A08B-66E59692FDE3/IncomingWebhook/3DEFFDD9-F3A8-4351-BDA7-142FAFB7473A

Voilà le résultat

Le code source est disponible sur mon repository GitHub :

GitHub - JMousqueton/CTI-MSTeams-Bot: 🤖 Bot to get the last Cyber Security information in a Microsoft Teams channel 🏴‍☠️
🤖 Bot to get the last Cyber Security information in a Microsoft Teams channel 🏴‍☠️ - GitHub - JMousqueton/CTI-MSTeams-Bot: 🤖 Bot to get the last Cyber Security information in a Microsoft Teams chan...

🙏🏻 Je profite de ce billet pour remercier VX-Underground pour l'idée et le bot original ainsi que les étudiants de l'école 2600 pour leurs supports et conseils la nuit pendant que je développais.