Bloquer les attaques Brute Force RDP 17

Si vous laissez une machine connectée à Internet avec le protocole RDP ouvert, vous pourrez constater que dans le journal d’évènement énormément de machines essaient de se connecter en utilisant divers comptes.

L’idée est de bloquer ces attaques de manière automatique.

On va donc créer un script PowerShell qui sera déclencha dès la détection d’attaque au travers des journaux d’évènements et puis modifiera une règle du firewall Windows afin de stopper l’attaque.

Étape 1

Sur Windows 2012 R2, Microsoft ne nous a pas spécialement aidé car dans le journal de sécurité on détecte bien la tentative de connexion, en revanche l’ip source n’est pas spécifiée (ce n’est plus le cas dans Windows 2016):

On sait donc juste que une attaque a eu lieu…

Mais si l’on regarde dans le journal  Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational on retrouve un évènement 140  nous fournissant l’adresse du coupable.

Malheureusement, cet evenement n’est déclanché que lorque le nom utilisé est inconnu. Si le nom existe alors cet évenement n’est pas déclanché.

La solution consiste donc a corréler 2 évènement:

L’événement 131 du journal Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational qui signale une connexion:

et l’évènement du journal de sécurité

 

Ainsi l’on connaît l’adresse source d’où proviens la tentative de connexion !

Étape 2

Créer le script qui va récupérer l’adresse IP pour la mettre dans une règle Firewall

Petit prérequis, créer un règle de blocage pour le rdp 3389:

 

Ensuite ile faut créer un PowerShell pour alimenter cette règle:

 

 

 

On utilise PSSQLite afin de stocker les adresses Ip ainsi que l’heure de stockage. Cela permet 2 choses:

  • Savoir si une adresse récurrente essaie de se connecter et donc de la bloquer après x tentatives
  • Permettre au script de dé bannir une adresse après un certain temps.

Il ne reste plus qu’a attacher l’exécution de ce script a l’évent 4625 au sein du Task Scheduler:

Les adresse IP avec des connexions échouée se retrouvent dans la base :

 

Et la règle de Firewall est mise a jour:

 

17 thoughts on “Bloquer les attaques Brute Force RDP

  1. Reply Anthony Août 9,2017 09:02

    Bonjour,

    Merci pour ce script, il fonctionne impec sur notre serveur.

    Anthony

  2. Reply Vecteur IT Août 30,2017 07:45

    Merci !!

  3. Reply Vince Oct 11,2017 08:57

    Bonjour,

    J’ai découvert votre solution et je voulais faire des tests mais impossible d’installer un module dans powershell … et impossible de trouver le module d’installation de module sur le web…

    Si vous auriez un lien a partager….

    Je suis sur un serveur en 2012 avec powershell en version 4.

  4. Reply Arch21 Mar 24,2018 10:25

    Bonjour,

    Merci pour ce super script ! il va nous être très utile prochainement et les premiers résultats sont très concluants !

    J’ai cependant une petite question : La ligne 46 ({$csv= $csv += ‘,127.0.0.1’ # Anti lockout) permet logiquement d’inscrire des adresses à ne pas bloquer ?
    Chez nous elle fait exactement l’inverse… 127.0.0.1 est directement bloqué.

    Ai-je oublié quelque chose ?

  5. Reply Vecteur IT Avr 3,2018 16:48

    Bonjour,
    La ligne 46 contient toutes les ip à bloquer.
    De mémoire ,j’ai ajouté le loop-back car si la variable $csv est vide alors la règle de blocage s’applique a toutes les IP sans distinction

  6. Reply Bourle Avr 12,2018 20:25

    Bonjour

    Serait-il possible d’avoir le script pour créer la DB « IPTable.SQLite » ?
    (oui je sais 1 an après, mais fallait pas faire un script intéressant :p )

  7. Reply Bourle Avr 12,2018 23:24

    Alors je me réponds à moi-même :
    – l’erreur ne vient pas de la DB qui se génère automatiquement, mais de mes journaux sous Windows Server 2016

  8. Reply aegirson Nov 8,2018 19:26

    Bonjour à tous,
    merci pour l’astuce en revanche j’ai une erreur sur le script :

    La propriété « RemoteAddresses » est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut être définie.

    Je comprends pas le problème, quelqu’un à une idée ?

  9. Reply Vecteur IT Nov 12,2018 09:17

    Vous avez bien créé la regle avec la commande New-NetFirewallRule -DisplayName « BLACK LIST » -Direction Inbound -LocalPort 3389 -Protocol TCP -RemoteAddress « 8.8.8.8 » -Action Block ??

  10. Reply Protyon Fév 7,2019 07:19

    Bonjour,

    Merci pour le script, par contre je reçois une erreur à chaque commande « Invoke-SqliteQuery ».

    Merci de votre aide !!!

    Invoke-SqliteQuery : Exception calling « Fill » with « 1 » argument(s): « SQL logic error or missing database
    no such table: IP »
    At C:\scriptipblock\rdp-block.ps1:18 char:1
    + Invoke-SqliteQuery -DataSource $Database -Query $query_purge -SqlParameters @{TS …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Invoke-SqliteQuery

  11. Reply Vecteur IT Fév 7,2019 15:12

    A priori il n’y a pas de table IP dans la base SQLite: La base est elle créé (vérifier son chemin…) ?

  12. Reply Protyon Fév 7,2019 17:41

    La base se crée mais elle reste vide.
    Aucune table n’est créée

  13. Reply Protyon Fév 7,2019 17:58

    Mon log event 131 ressemble à ceci

    The server accepted a new TCP connection from client 185.156.177.230:45419.

    Est-ce que le fait d’avoir un port au bout de l’adresse ip pourrais changer quelque chose ???

    Merci !!!

  14. Reply Vecteur IT Fév 17,2019 12:12

    Oui, effectivement, il faut créer la table IP dans SQLite 🙂

  15. Reply Vecteur IT Fév 17,2019 12:21

    Import-Module PSSQLite

    $Database = « E:\Firewall\IPTable.SQLite »
    $Query = « CREATE TABLE IP (IP VARCHAR(20),Timestamp DATETIME) »
    Invoke-SqliteQuery -Query $Query -DataSource $Database

  16. Reply Informatique Rouen Nov 20,2019 09:17

    Merci pour ce script ..c est exactement ce que je recherchais ..et depuis un moment …

Leave a Reply