Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ich und Astorion (Freund von mir) kamen schon letzte Woche auf die Idee, FSRM dafür einzusetzen.
- Das Problem bei Monitoring ist jedoch, dass wir nicht nur zusehen wollen, wie die Dateien verschlüsselt werden sondern dies gar nicht erst erlauben wollen.
- Daher haben wir uns dazu entschlossen, ein Block beim Schreibeversuch benannter Dateien mit Endung .locky(.crypt, etc..) bei File-Screening zu erzeugen.
- Tritt so ein Event am Server auf, wird ein PowerShell Scrip aufgerufen, welches die IP des Clients ermittelt und diese auf der Server Firewall für Microsoft-SMB-Ports blockt.
- Unten angeführtes Script enthält derzeit kein foreach Statement bei der „net session“ Auswertung – wäre erforderlich, wenn ein Benutzer von 2 oder mehreren Rechner mit demselben Benutzernamen auf den Share zugreift. Dies ist wichtig, da beim „net session“ die aktuelle Verbindung nicht immer an erster Stelle der Liste steht.
- Script wurde auf folgenden Betriebssystemen getestet:
- Windows 2008, Windows 2008r2, Windows 2012, Windows 2012r2
- Aufgrund der Vielzahl an OS, sind nicht alle Befehle im Script selbst reine Powershell-Befehle, da manche Befehle erst ab bestimmten Powershell- bzw. Betriebssystemversionen verfügbar sind.
- Aus Sicherheitsbedenken haben wir nicht gleich den LANMAN Dienst gestoppt und auch nicht alle Ports des betroffenen Clients am Server geblockt (Stichwort: DDOS)
- Folgende Voraussetzungen müssen für das Script erfüllt sein:
- Als erstes muss natürlich FSRM, wie oben angegeben, eingerichtet werden. Einzige Ausnahme: E-Mail Notification (Benachrichtigung) muss bei File-Screen aktiviert sein, damit man als Admin davon etwas erfährt. Aber gleichzeitig muss Event-Log aktiviert werden – mit folgendem Inhalt (sonst klappt Script nicht):
- User [Source Io Owner] attempted to save [Source File Path] to [File Screen Path] on the [Server] server. This file is in the [Violated File Group] file group, which is not permitted on the server.e.g:
- Und bei Run-Command muss natürlich anstelle dem Lanmanserver Stop unter Program: %system32%\Powershell-Path für powershell.exe drinnen stehen (z.B. c:\windows\system32\WindowsPowershell\V1.0\powershell.exe und als Argument/Parameter muss der Pfad des Scriptes eingebeben werden – z.b.: c:\temp\Blockit.ps1
- Wird nun durch File-Screening ein Block aktiv (= infizierter Client hat versucht einer der Crypto-Dateien zu erstellen), wird erstens dies geblockt, zweitens erscheint im Windows Eventlog Applications der Event 8215 mit folgendem Beispieltext:
- User TestDomain1\Testuser1 attempted to save X:\Userdata\Filename.locky to X:\Userdata on the TESTSERVER1 server. This file is in the „Test-Crypto-File-Screen-FileGroup-Name“ file group, which is not permitted on the server.
- Und drittens wird das Powershell-Script aufgerufen.
- Dieses liest zuerst mal die letzten beiden Einträge vom Windows-Eventlog Applications aus.
- Ist Teiltext von „Test-Crypto-File-Screen-FileGroup-Name“ enthalten, dann wird dieser String eingelesen (sollte obiger Beispieltext sein) – danach wird daraus der Username ermittelt (Computername bzw. Domainname hier nicht wichtig)
- Aus dem Output von „net session“ wird dieser Username ermittelt und die IP-Adresse extrahiert.
- Anhand der IP Adresse können nun die Firewall-Regeln erstellt werden. Das Script loggt auch zusätzlich mit – damit hat man die Sicherheit, zu wissen, was genau das Script gemacht hat – der Einfachheit halber, haben wir für das Beispiel c:\temp\Blockit.log hier genannt
- Hier das Script – dies muss von euch natürlich als [Path\Filename.ps1] gespeichert werden:
- $Messages = get-eventlog -logname application -newest 2 | where { $_.EventID -eq 8215} | select Message
- $old_username = „“
- $Username = „“
- foreach ($M in $Messages)
- {
- if ($M -like „*Test-Crypto-File-Screen-FileGroup-Name*“)
- {
- $Username = Out-String -inputobject $M
- #evaluate the username of the full event-message
- $pos1 = $Username.IndexOf(„\“)
- $pos2 = $Username.IndexOf(„attempted“)
- $string1 = $Username.substring($pos1+1,(($pos2 – $pos1)-2))
- $Username = $string1.trim();
- #compair, if next username is not like the current username
- if($Username -ne $old_username)
- {
- #set old username to current username
- $old_username = $Username
- #start logging for further investigations
- out-file -filepath c:\temp\Blockit.log -InputObject „——————————-“ -Append
- $logdate = „$(get-date)“
- out-file -filepath c:\temp\Blockit.log -InputObject $logdate -Append
- out-file -filepath c:\temp\Blockit.log -InputObject $Username -Append
- #get net session and save it as string
- $sessions = net session
- $sessionstr = Out-String -inputobject $Sessions
- #get IP as String from net session
- $IP = $sessionstr.substring($sessionstr.IndexOf($Username)-21,14)
- out-file -filepath c:\temp\Blockit.log -InputObject $IP -Append
- #Convert String to IP and remove blanks
- [IPAddress]$Address = $IP.Trim();
- #Block IP-Address of infected Client in WindowsFireWall for SMB-Sharing
- netsh advfirewall firewall add rule name=“Block-Crypto Client TCP 139 $IP“ dir=in action=block protocol=tcp localport=139 remoteip=$Address profile=any enable=yes
- netsh advfirewall firewall add rule name=“Block-Crypto Client TCP 445 $IP“ dir=in action=block protocol=tcp localport=445 remoteip=$Address profile=any enable=yes
- netsh advfirewall firewall add rule name=“Block-Crypto Client UDP 137 $IP“ dir=in action=block protocol=udp localport=137 remoteip=$Address profile=any enable=yes
- netsh advfirewall firewall add rule name=“Block-Crypto Client UDP 138 $IP“ dir=in action=block protocol=udp localport=138 remoteip=$Address profile=any enable=yes
- }
- }
- }
- lg
- Full article
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement