Brute Force RDP sur Windows 2016: Bloquer les attaques

J’avais déjà écrit un billet à ce sujet concernant Windows 2012 R2. Avec Windows 2016 les choses sont un peu différentes, car l’adresse IP du hacker est présente dans l’évènement système. Donc voici le script mis à jour pour Windows 2016

En prérequis , il faut toujours installer le module PSSQLite  SQLite :

 Install-Module -Name PSSQLite

Ensuite créer la base et la table IP:

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

Puis créér la regle Firewall :

New-NetFirewallRule -DisplayName "BLACK LIST" -Direction Inbound -LocalPort 3389 -Protocol TCP -RemoteAddress "8.8.8.8" -Action Block

Et enfin  créer le script qui sera déclenché par enlèvement 4625:

Import-Module PSSQLite

$regex = [regex] "\d+\.\d+\.\d+\.\d+"
$logfile = "c:\Firewall\blocked.log"
(Get-Date).ToString() + ' Start Script'  >> $logfile
$Database = "c:\Firewall\IPTable.SQLite.db"
$MaxFailedLogon = 5 # NB d'echec d'authentification MAX
$Unban = 48 # NB d'heure avant débannissement 
$query_insert = "INSERT INTO IP (IP, Timestamp) VALUES (@IP, @TS)"
$query_MaxFailed = "SELECT IP,Timestamp, COUNT(*) FROM IP GROUP BY IP HAVING COUNT(*) > @MAXFAILED"
$query_purge = "DELETE FROM IP where TimeStamp < @TS"
$DT = [DateTime]::Now.AddSeconds(-120)
(Get-Date).ToString() + ' requete Event ' + ($DT).ToString()   >> $logfile
$af = Get-WinEvent   -FilterHashTable @{ LogName = "Security"; ID = 4625 ;StartTime = $DT } -MaxEvents 1 | select-string -inputobject {$_.message} -Pattern $regex  |% { $_.Matches } |Select-Object @{n='IpAddress';e={$_.Value} }  
$getip = $af | group-object -property IpAddress  | Select -property Name
# Purge des IP bannies 
(Get-Date).ToString() + ' Purge des IP'  >> $logfile
Invoke-SqliteQuery -DataSource $Database -Query $query_purge -SqlParameters @{TS   = ((get-date).AddHours((-$Unban)))}
Invoke-SqliteQuery -DataSource $Database -Query "DELETE FROM IP WHERE ip is null"
$fw = New-Object -ComObject hnetcfg.fwpolicy2
$BlackListRule = $fw.rules | where {$_.name -eq 'BLACK LIST'}
$IPValue = $getip | where {$_.Name.Length -gt 1 }
#Ajout des IPs dans Sqlite
(Get-Date).ToString() + ' Ajout IP Base'  >> $logfile
if (($IPValue.name).Length -gt 1)
{Invoke-SqliteQuery -DataSource $Database -Query $query_insert -SqlParameters @{
        IP = $IPValue.name
        TS   = (get-date)
    }    
}
#Mise a jour de la regle FireWall
$csv="" 
(Get-Date).ToString() + ' Construction de la liste IP'  >> $logfile
$collection =    Invoke-SqliteQuery -DataSource $Database -Query $query_MaxFailed -SqlParameters @{MAXFAILED = $MaxFailedLogon}
foreach ($item in $collection)
{

  if ($csv.Length -gt 0 ) 
  {$csv= $csv  += ',' + $item.IP}
  else
  { $csv= $item.IP}
  
}

if ($csv.length -gt 1)
{$csv= $csv  += ',127.0.0.1' # Anti lockout
$BlackListRule.RemoteAddresses = $csv
$csv| %{(Get-Date).ToString() + ' Ajout de IP Firewall ' + $IPValue.name >> $logfile}
}

Exit

Reste a attacher le script a l’événement 4625 ( comme décrit dans le précéent article , et le tour est joué !

Si vou désirez controler le contenu de la base, je vous recommande cet outil : https://sqlitebrowser.org/

Enjoy :)

 

 


Comments

Author: Nunizgb
Date: 2019-10-08 22:25:27

Bonjour

Merci pour le script qui ajoute bien les IP dans la table SQL par contre la règle pare-feu n’est pas mis à jour avec les IP de la table SQL.

Lors d’execution du script aucune erreur.

Comment résoudre pour que la règle pare-feu soit mis à jour.

Merci

Author: Jérôme
Date: 2020-01-19 19:30:03

Bonsoir,

Je ne m’imaginais pas si exposé :)

30000 tentatives en 2 jours… (oui oui vous avez bien lu).

Et presque plus rien après la mise en place du script.

16 @ IP bloquées en quelques minutes.

Merci beaucoup pour votre partage et pour l’efficacité de cette solution.

Author: Jérôme
Date: 2020-03-16 08:59:03

Bonjour,

Il y a une petite erreur de syntaxe dans la commande de création de la base :

$Database = « E:\Firewall\IPTable.SQLite »

Il manque le “.db”.

Merci pour cet excellent script qui fait régulièrement son job sur mon infra.

Author: Vecteur IT
Date: 2020-04-03 11:59:50

@ Jérome C’est corrigé !

Author: Maxou
Date: 2020-04-07 05:34:13

Bonsoir,

Le script s’exécute bien et enregistre les ip dans la base de donnée mais j’ai l’impression que la règle dans le pare feux ne s’actualise car j’ai test via mon 4G en faisant une erreur dans le mot de passe et je peux me connecter autant de fois que je veux

Author: Maxou45400
Date: 2020-04-07 18:09:08

Bonsoir,

Normal que l’adresse IP 127.0.0.1 se retrouve dans la blackliste dans le pare feux

Author: Vecteur IT
Date: 2020-04-09 11:34:09

Faut regarder sur la règle FW les ip ajoutées…

Author: Vecteur IT
Date: 2020-04-09 11:35:13

Oui, sinon si il n’y a aucune IP alors tout le trafic 3389 est bloqué: et faire u rdp sur le 127.0.0.1 n’a aucun interet

Author: Jérôme
Date: 2021-09-15 11:43:19

Bonjour,

Tout d’abord merci pour votre script qui fonctionne bien sur la plus part de nos serveurs.

J’en ai un qui me pose problème au niveau de la mise à jour de la règle FireWall “Black List” voici le message que powershell me renvoi:

Type [DBNullScrubber] introuvable.

Au caractère C:\Users\Administrateur.WIN-402Q47JKKTP\Documents\WindowsPowerShell\Modules\PSSQLite\Invoke-SqliteQuery.ps1:536 : 25

  •                     [DBNullScrubber]::DataRowToPSObject($row)
    
  •                     ~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidOperation : (DBNullScrubber:TypeName) [], RuntimeException

    • FullyQualifiedErrorId : TypeNotFound

Auriez-vous déjà eu le cas?

Cordialement

Author: Asdean
Date: 2021-10-13 16:08:37

Bonjour,

Comment peut-on exclure les adresses IP du réseau local de la règle (exemple 192.168.1.x). J’ai plusieurs postes qui génèrent l’ID 4625 alors qu’ils sont connectés en TSE et du coup qui passe dans la règle “BLACK LIST”?

Merci d’avance