RDP2Ban – Fail2Ban für Remotedesktop

Da sich im Moment die BruteForce-Angriffe auf einen (ja… es geht nicht anders) offenen Remotedesktop stark häufen, habe ich ein kleines Powershell-Script vorbereitet, welches wie bei Fail2Ban solche Logins in die Firewall schreibt.

Das Script muss in die Aufgabenplanung eingetragen werden. Ganz nach eigenem Belieben.

Die Parameter / Variablen sind eigentlich selbsterklärend.

<#
.DESCRIPTION
  Count failed RDP sessions (username / password missmatch)
  by IP-Address.
  If the adjustable threshold is exceeded, 
  the address is entered in the firewall.
  After a certain time the entry will be deleted.

.NOTES
  Version:        1.0
  Author:         Bjoern Weis
  Creation Date:  2019-05-21
  Purpose/Change: Initial script development
#>

$storageBasePath = "HKLM:\SOFTWARE"
$storageName = "RDP2Ban"
$itemStorageName = "Items"

$failGraceTries = 2
$failGraceMinutes = 60*12
$failLookbackMinutes = 60*12


$combinedStoragePath = $storageBasePath+"\"+$storageName
$combinedItemPath = $combinedStoragePath+"\"+$itemStorageName
Write-Host -ForegroundColor Yellow $combinedStoragePath
Write-Host -ForegroundColor Yellow $combinedItemPath


if(!(Test-Path -Path $combinedStoragePath)){
    New-Item -ItemType Directory -Path $storageBasePath -Name $storageName
}

if(!(Test-Path -Path $combinedItemPath)){
    New-Item -ItemType Directory -Path $combinedStoragePath -Name $itemStorageName
}

$starttime = (Get-Date).AddMinutes(0 - $failLookbackMinutes)

$events = Get-WinEvent -FilterHashtable @{logname="Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational";level=3;starttime=$starttime}
foreach($event in $events){
  if($event.Opcode -eq 14){
    $ipaddr = $event.Properties[0].Value;
    $ipPath = $combinedItemPath+"\"+$ipaddr
    if(!(Test-Path -Path $ipPath)){
        New-Item -ItemType Directory -Path $combinedItemPath -Name $ipaddr
    }
    
    if(!((Get-Item -Path $ipPath).GetValue($event.TimeCreated) -ne $null)){
        New-ItemProperty -Path $ipPath -Name $event.TimeCreated -PropertyType "DWORD" -Value 0
    }
    
  }
}

$failItems = Get-ChildItem -Path $combinedItemPath

$bannedIPs = @("0.0.0.1")

$currentGrace = (Get-Date).AddMinutes(0 - $failGraceMinutes);
foreach($item in $failItems){
    $ipaddr = $item.PSChildName
    Write-Host -ForegroundColor Magenta $ipaddr
        
    $failCount = 0
    foreach($failure in $item.GetValueNames()){      
       if($currentGrace -lt $failure){
            Write-Host -ForegroundColor Gray $failure
            $failCount++
       }
       
    }
    if($failCount -gt $failGraceTries){
        Write-Host -ForegroundColor DarkRed $failCount $ipaddr
        $bannedIPs += $ipaddr
    }

}


if(!((Get-NetFirewallRule -DisplayName "RDP2Ban") -ne $null)){
    New-NetFirewallRule -DisplayName "RDP2Ban" -Action Block -Profile Any -Direction Inbound -Protocol Any -RemoteAddress $bannedIPs 
    Write-Host -ForegroundColor Yellow "FW Add"
} else {
    $storedBannedIPs = (Get-NetFirewallRule -DisplayName "RDP2Ban" | Get-NetFirewallAddressFilter).RemoteAddress
    $diffCount = (Compare-Object -ReferenceObject $bannedIPs -DifferenceObject $storedBannedIPs).Count
    Write-Host -ForegroundColor Green "ObjDiff" $diffCount
    if(($diffCount -gt 0) -or ($diffCount -eq $null)){
        Write-Host -ForegroundColor Yellow "FW Set"
        Set-NetFirewallRule -DisplayName "RDP2Ban" -RemoteAddress $bannedIPs
    }
}

Code Zeilen zählen: Cloc!

Vor kurzem wollte ich mal wieder vergleichen, wie sehr eins meiner Projekte gewachsen ist.
Ich wusste, dass es mal eine ziemlich geniale Software gab, die den Code genauer unter die Lupe nimmt und die „echten“ Codezeilen zählt.

Nach 30 Minuten ist es mir wieder eingefallen: Cloc [1]

Damit ich es nicht nochmal suchen muss und der Rest der Welt auch was davon hat, stelle ich es kurz vor.

Code Zeilen zählen: Cloc! weiterlesen

RFID und Mikrocontroller

Wer RFID an seinen Mikrocontroller bringen will hat verschiedene Möglichkeiten dies zu tun.

Zur Auswahl stehen I2C, UART, RS232 und SPI.

Aber dann stellt sich die Frage, welchen Kartentyp wir nutzen wollen.
Die Bekanntesten sind wohl Mifare 1/4k Classic und EM410X.

Der Unterschied ist, dass man auf den Mifare Classic Karten 1k bzw. 4k Speicher befinden,
die vor unbefugten lesen / schreiben geschützt sein sollten. Dieser Schutz wurde aber bereits mehrfach ausgehebelt[1].
Der EM4102 Transponder sendet aber nur seine eigene Seriennummer und mehr nicht.

Da ich ein paar Daten auf den Transpondern abgelegen will, habe ich mich für die Mifare Transponder entschieden.
(Soweit ich weiß gibt es auch noch nicht geknakte Mifare Typen [Mifare Plus mit AES und Replay-Schutz], kann diese im Handel aber nicht finden.)

Dafür habe ich mir bei einem Chinesischen Distributor[2] ein paar Lese/Schreibgeräte besorgt, die per UART kommunizieren.
(Für längere Strecken zwischen Mikrocontroller und Lesegerät empfehle ich unbedingt die RS232 Version – benötigt aber einen zusätzlichen UART – RS232 Wandler, wie z.B. der Max232).

Links:
[1] http://www.heise.de/newsticker/meldung/Schwaechen-des-RFID-Systems-Mifare-Classic-bestaetigt-191623.html