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 😊
- Sortir les flux RSS du code et les intégrer dans un fichier externe au format CSV.
- Ne plus avoir besoin de renseigner le fichier Config.txt au préalable
# 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
- Ajout des domaines "Red Flag" 🚩 français référencés par Red Flag Domains
- 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 :
🙏🏻 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.