wsecure
Goto Top

Script zum auslesen von variabeln in einer logdatei mit weitergabe an netsh advfirewall

hallo zusammen,
ich bin gerade auf der suche nach einem script (batch, vbscript, oder sogar powershell wenn möglich) und habe mehrere einträge gefunden, wo schon ein ähnliches thema von anderen usern erfragt wurde.
bei den scripts konnte ich nur das auslesen einer logdatei und dann übertragen in eine andere logdatei sehen, ich benötige jedoch nach dem auslesen einen befehl an die windows firewall damit eine entsprechende regel hinzugefügt wird.

das problem...
ich habe eine logdatei, die mir zb sowas hier anzeigt:

10/23-03:18:46.074314 [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 188.76.112.X:52135 -> 146.4.94.X:443

ich benötige nun ein script welches permanent (zb jede sekunde) die logdatei auslesen kann, dann die entsprechenden variabeln für die ereignisse setzt und letztendlich an die windows firewall als block events weiter leitet, mit den zuvor gesetzten variabeln.

es sei angemerkt, dies habe ich hier erlesen, dass manche es für sinnlos erachten die logs aus einer datei auszulesen, wenn sie doch eh in eine mysql datenbank eingepflegt werden.
der grund ist der, dass das eigentliche programm, welche die logs schreibt nicht direkt mit der datenbank verbunden ist, sondern erst ein zweites die daten einpflegt.
das hauptprogramm hingegen erlaubt mir mehrere ausgabeformate, zb direkter text... s.o.
bevor nun das zweite programm erstmal anfängt den log in die db einzupflegen, ist der eigentliche log ja schon verfügbar und könnte bereits verarbeitet werden (vom benötigtem script).

ich dachte für die umsetzung an:

variabel 1: zeit/datum - 10/23-03:18:46.074314
variabel 2: beschreibung - [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2]
variabel 3: protokoll - {TCP}
variabel 4: ip - 188.76.112.X

variabel 1,2+4 sollen in die beschreibung von der firewall regel eingetragen werden - $description
variabel 3 bestimmt das protokoll - $proto
variabel 4 setzt die remote ip - $blockip und $description

als command wäre dann zb möglich
netsh advfirewall firewall add rule name="$description" dir=in action=block protocol=$proto remoteip=$blockip

mir fehlt hier der ansatz, wie ich nach dem lesen der logdatei den befehl mit den gesetzten variabeln ausführen kann.

ich hoffe bald von euch zu hören.


gruß

Content-Key: 193155

Url: https://administrator.de/contentid/193155

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: bastla
bastla 23.10.2012 um 12:42:12 Uhr
Goto Top
Hallo wsecure!

Das Problem dürfte weniger das Zerlegen der Log-Zeilen sein - als Batch annäherungsweise so:
@echo off & setlocal
for /f "tokens=1*" %%i in ('findstr /c:"Bad Traffic" D:\LogDatei.txt') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        for /f "delims=: " %%r in ("%%c") do (  
            echo netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r  
        )
    )
)
- sondern eher die Frage des zeitnahen Auslesens der (neuen) Einträge.
Was die Sinnhaftigkeit des Erzeugens der Firewallregeln angeht, hast Du vermutlich ohnehin schon Deine Überlegungen angestellt ...

Grüße
bastla
Mitglied: wsecure
wsecure 23.10.2012 um 13:10:00 Uhr
Goto Top
hallo bastla,
zuerst vielen dank für deine antwort!

ich muss noch ein paar überlegungen anfügen, quasi feinschliff, habe diesbezüglich auch noch ein paar fragen.

zu feinschliff:
es sollte immer nur der letzte eintrag gelesen werden, so lang das script im speicher selbst aktiv ist.
zusätzlich, sofern der scriptvorgang abgebrochen wurde und/oder neu initialisiert wird, sollte die komplette logdatei geparsed werden, zusätlich die derzeitige firewall konfiguration (welche exportiert werden kann) zum vergleich der gelisteten ip's herangezogen und bei unstimmigkeit die aktive firewall konfiguration angepasst werden. das wäre quasi der perfekte vorgang.

das problem beim auslesen der mysql daten wäre zum einen die versetzte bearbeitung der rule in die firewall.
die exportfunktion der windows firewall lautet:
netsh advfirewall export "d:\current.wfw"

die zeitnahe auslesung
wäre es denn einfacher zu scripten, wenn man die mysql datenbank heranzieht für die auswertung?
was wäre mit einem gesetzten timer in der batch, der quasi die komplette routine in einem gewissen intervall wiederholt?
gibt es sonst praktikable lösungsansätze denen man nachgehen könnte?


gruß face-smile
Mitglied: wsecure
wsecure 23.10.2012 aktualisiert um 15:51:35 Uhr
Goto Top
leider funktioniert das script nicht...

es rattert permanent diese eingabe durch, es werden aber keine rules zur firewall hinzugefügt:

D:\log>(echo netsh advfirewall firewall add rule name="10/23-13:25:02.570283 188.77.32.x [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2] "dir=in action=block protocol=TCP remoteip=188.77.32.x )
netsh advfirewall firewall add rule name="10/23-13:25:02.570283 188.77.32.x [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2] " dir=in action=block protocol=TCP remoteip=188.77.32.x

D:\log>(for /F "tokens=1-3 delims={}" %a in ("[] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 188.77.32.x:61576 -> 146.4.94.x:12345") do (for /F "delims=: " %r in ("%c") do (echo netsh advfirewall firewall add rule name="10/23-13:25:02.570283 %r %a" dir=in action=block protocol=%b remoteip=%r ) ) )

D:\log>(for /F "delims=: " %r in (" 188.77.32.x:61576 -> 46.4.94.x:12345") do (echo netsh advfirewall firewall add rule name="10/23-13:25:02.570283 %r [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2] " dir=in action=block protocol=TCP remoteip=%r ) )

diese drei blöcke wiederholen sich immer und immer wieder, leider jedoch nicht nur einmal. (zumal wie du siehst der output noch nicht funktioniert). das parsen der variabeln kann hingegen eigentlich fast genau so bleiben, zumindest wenn ich von der ersten ausgabe ausgehe, welche aber leider in klammern gesetzt wurde()?


D:\log>(echo netsh advfirewall firewall add rule name="10/23-13:25:02.570283 188.77.32.x [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2] "dir=in action=block protocol=TCP remoteip=188.77.32.x )

liegt wohl einfach daran, dass die eigentliche ausgabe schon soviele klammern hat und dein script die "noch" nicht verarbeitet hat.

[119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2]

ich konnte übrigens mit einer kleinen exe einen loop setzen, wodurch dein script nach belieben wiederholt werden kann.

wäre dir dankbar, wenn du einen runden schliff draus machst! face-smile
Mitglied: wsecure
wsecure 23.10.2012, aktualisiert am 24.10.2012 um 23:51:16 Uhr
Goto Top
ich habe nun die ausgabe ein wenig angepasst und bekomme den output zur windows firewall.
abgesehen davon, dass die regel vom namen her nicht wfw gemäß ist und somit einen fehler ausgibt, sobald man die regel editieren möchte, wird leider jetzt witzigerweise die falsche ip gesperrt und nicht die, welche eigentlich angedacht war. (remote)

hier das derzeitige script: (echo on für fehlersuche)
@echo on & setlocal 
:loop
for /f "tokens=1*" %%i in ('findstr /c:"Bad Traffic" D:\log\alert.id') do (   
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (   
        for /f "delims=: " %%r in ("%%c") do (   
            cmd /K netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r   
        ) 
    ) 
)
ping -n 2 127.0.0.1 > nul
goto loop

(sleep.exe wird nun nicht mehr benötigt, da ein ping zu localhost genau eine sekunde hat und somit der wait/timeout zeitgeber sein wird.)

anbei noch die ausgabe:

D:\log>for /F "tokens=1*" %i in ('findstr /c:"Bad Traffic" D:\log\alert.id') do (for /F "tokens=1-3 delims={}" %a in ("%j") do (for /F "delims=: " %r in ("%c") do (cmd /K netsh advfirewall firewall add rule name="%i %r %a" dir=in action=block protocol=%b remoteip=%r ) ) )

D:\log>(for /F "tokens=1-3 delims={}" %a in ("[] [129:12:1] Consecutive TCP small segments exceeding threshold [] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 146.4.94.X:12345 -> 192.72.54.X:59083") do (for /F "delims=: " %r in ("%c") do (cmd /K netsh advfirewall firewall add rule name="10/21-07:31:31.337781 %r %a" dir=in action=block protocol=%b remoteip=%r )
) )

D:\log>(for /F "delims=: " %r in (" 146.4.94.X:12345 -> 192.72.54.X:59083") do (cmd /K netsh advfirewall firewall add rule name="10/21-07:31:31.337781 %r [] [129:12:1] Consecutive TCP small segments exceeding threshold [] [Classification: Potentially Bad Traffic] [Priority: 2] " dir=in action=block protocol=TCP remoteip=%r ) )

D:\log>(cmd /K netsh advfirewall firewall add rule name="10/21-07:31:31.337781 146.4.94.X [] [129:12:1] Consecutive TCP small segments exceeding threshold [] [Classification: Potentially Bad Traffic] [Priority: 2] " dir=in action=block protocol=TCP remoteip=146.4.94.X )
OK.

reply OK und wie gesagt der command kommt auch wirklich an, nur halt nicht wfw konform und mit falscher ip...

für hilfe bin ich sehr dankbar! face-smile
Mitglied: bastla
bastla 23.10.2012 um 16:12:55 Uhr
Goto Top
Hallo wsecure!

Über die Benennung der Regeln hatte ich mich schon gewundert ... face-wink

... allerdings ist es Deine Entscheidung, wie diese letztlich lauten soll.
Hinsichtlich der falschen IP könntest Du es so versuchen:
for /f "tokens=4 delims=: " %%r in ("%%c") do (
Grüße
bastla
Mitglied: wsecure
wsecure 23.10.2012 aktualisiert um 16:45:54 Uhr
Goto Top
wir kommen der sache näher... face-smile

diesmal ist es die richtige ip, die regel in der firewall ist auch implementiert, jedoch nutzlos, wegen dem beschreibungsfeld fehler.
der fehler in der beschreibung der rule liegt daran, dass am ende der beschreibung leider ein freizeichen mit angehängt wird.
wie bekomme ich das noch weg?

die vorhandene beschreibung liefert ja die applikation, welche den alert verursacht, leider kann ich diesen jetzt nicht einfach abändern...

edit: habe eben nochmal genau nachgesehen.
es wird die erste zeile der logdatei gelesen, richtig wäre die letzte zeile.

for /f "delims=: " %%r in ("%%c") do ( - gilt in einer rule derzeit als incoming traffic
for /f "tokens=4 delims=: " %%r in ("%%c") do ( - ist der entsprechende outgoing traffic

wie könnte man es noch hinbekommen die originale beschreibung des alerts besser zu parsen, damit das freizeichen am ende verschwindet und zusätzlich wieder die loop funktion funktioniert?
Mitglied: wsecure
wsecure 23.10.2012 um 17:07:39 Uhr
Goto Top
hier hattest du schon einmal das problem gelöst (letzte zeile, sogar mit letztes freizeichen entfernen.)
Letzte zeile einlesen und ausgeben
könntest du mir das bitte auf mein script abändern?

zusammenfassung:
freizeichen am ende des events entfernen und letzte zeile der datei als quelle spezifizieren.
loop funktion

die zwei sachen wären es noch, dank dir! face-smile
Mitglied: wsecure
wsecure 23.10.2012, aktualisiert am 25.10.2012 um 01:14:27 Uhr
Goto Top
ich habe das gefühl, dass es nicht so funktionieren wird mit batch script, wie ich es gern haben möchte...

durch das ändern von tokens=1* nach tokens=* nimmt er ja nicht mehr den ersten wert, sondern geht fröhlich erstmal durch alle einträge und schreibt quasi einen index.
auch erhöhen auf eine große einheit zb tokens=99999* brachte keinen erfolg. abgesehen davon, dass das script noch nicht wirklich so funktioniert wie es sollte.

edit script info:
@echo off & setlocal
:loop
for /f "tokens=1* delims=," %%i in ('findstr /c:"Priority" D:\log\alert.id') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do  (  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
            cmd /c netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r  
        )
    )
)
sleep 30
goto loop

das script macht jetzt fast genau das, was es soll, doch es ist immer noch das freizeichen vorhanden, ich kenne aber auch nicht den batch befehl um es rauszukommentieren...
sleep musste ich jetzt schon auf 30 setzen um nicht ein permanentes gescrolle zu haben.
es ist auch noch keine abfrage routine implementiert, so dass vor einem erneutem ban die bereits vorhandenen regeln abgeglichen werden um nicht tausende gleicher ban's am ende zu haben.

zum script, ich brauche immer die letzte zeile, damit bei fortlaufenden traffic die ips so durchgereicht werden und nicht durch das ewige scrollen in der datei der ganze server bei volllast stirbt.
aus diesem grund wäre auch eine real-time überwachung wünschenswert.
ansonsten müsste man anstatt die letzte zeile, eher wohl die letzten 10 zeilen nehmen, um bei volllast mitloggen zu können, falls erforderlich.

kennt sonst noch jemand eine möglichkeit die hier passen würde?
es kann zur not auch export aus mysql sein, oder powershell...
Mitglied: pieh-ejdsch
pieh-ejdsch 23.10.2012 um 20:07:44 Uhr
Goto Top
moin wsecure,

das Permanente Auslesen der Logdatei um diese zum Beispiel als Puffer zu benutzen ist mit dem Filehandle 0 und einer gleichzeitigen Pipe zu dem Programm, welches die Zeilen verarbeitet möglich.
Die Pipe erzeugt für beide Seiten je eine CMD instanz.
Mit der Findstr Pipe wird nur Zeilenweise aus den Befehl ausgelesen und im zweiten Batch zweilenweise verarbeitet.

Somit bleibst Du später immer in der Letzten Zeile zum auslesen:
:readinput.cmd
@echo off


if "%~1" equ "/?" echo Stellt eine Pufferdatei zum Permaneten auslesen zur verfuegung.^  
 &echo Dies ermoeglicht Tee waerend der Ausfuehrung eines Befehls.^
 &echo(&<nul set /p "=%~n0 " &echo [Logfile] [/.]&echo(^  
 &echo      Logfile    Angabe eines zu Puffernden Logfiles.^
 &echo      /.         Auch Leerzeilen Puffern.&echo(^
 &echo   "%~pd0%~n0-write.cmd"  wird zum^  
 &echo    abarbeiten des Puffers Bereitgestellt.&echo(^
 &echo   Befehle mit Pipe einleiten:^
 &echo    Befehl1 ^| "%~n0" [Logfile] [/.] &exit /b   
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"   
setlocal disabledelayedexpansion
set "Puffertmp=%temp%\Tee%random%.txt"  
set "Puffer=%Puffertmp%"  
set "LN=."  
set "del=/D"  
if "%~1" equ "" goto :noParam  
:Parameter
if /i "%~1" equ "/N" (set "N=1" &set LN="^" ) else set "del=" &set "Puffer=%~1"  
if "%~2" neq "" shift &goto :Parameter  
:noParam

(findstr /n %LN% && ECHO E_O_F_END_OF_FILE:) >"%Puffer%" | <"%Puffer%" "%~pd0%~n0-write.cmd" "%Puffer%" %del%  

exit /b



:INSTALLPuffer
@echo off
setlocal
set /a Limit=60
if "%~1" equ "/?" echo Liest aus einer nummerierten Pufferdatei, bis zur Abschlusszeile "E_O_F_END_OF_FILE:".^  
 &echo oder bis diese Datei kleiner als Vorher wird: ^( type nul ^<PufferDatei ^).&echo(^
 &<nul set /p "=%~n0 Pufferdatei [/d] ^<PufferDatei" &echo(^  
 &echo    /D     Die ^(temporaere^) Datei wird nachher geloescht.^
 &echo   Werden %Limit% Sekunden keine Ausgaben Produziert wird dieses Programm beendet.&exit /b
if not exist "%~1" echo Pufferdatei nicht gefunden! >&2 &exit /b 1  
if /i "%~2" neq /D (set "Del=") else set del=^&del %1 ^>nul  
for %%i in (%1) do set "Z=%%~zi"  

set /a R=limit
:IN
 set /a r-=1
 set "out=1"  
 set "inline="  
 set /p "inline="  
 setlocal enabledelayedexpansion
  rem Abbruch mit AbschlussZeile
 for /f "delims=:" %%i in ("!inline!") do set "out=" &if %%i equ E_O_F_END_OF_FILE (title Verabeitung Fertig.%del%&exit /b) else title Verarbeite Zeile %%i  
  rem Abbruch wenn nach Zeitlimit keine Ausgabe
 if %r% leq 0 title Verabeitung Fertig.%del%&exit /b
  rem Abbruch wenn Datei kleiner
 for %%i in (%1) do if %Z% gtr %%~zi (title Verabeitung Fertig.%del%&exit /b) else set "Z=%%~zi"  
 if defined Out endlocal &waitfor EineSekundePause /t 1 >nul 2>&1 &title Timer %r%&goto :in
  rem  Hier muss die Verarbeitung Hinein zB.
 echo(!inline:*:=!
 for /f "tokens=1,2,3*" %%i in ("!inline:*:=!") do endlocal &echo %%j-%time%-%%l  
 if "%os%" equ "!OS!" endlocal  
 set /a R=limit
goto :in


Dieser Batch erzeugt eine Zweite Batch um mit den readinput.cmd-Write.cmd die Log (nummeriert) ständig abzuarbeiten.
(for /l %i in (1 1 10) do @Dir & ping localhost -n 5 1>nul ) |readinput.cmd Testlog.txt

Gruß Phil
Mitglied: wsecure
wsecure 23.10.2012 um 21:19:23 Uhr
Goto Top
hallo phil,
danke, dass du dir die zeit genommen hast zu antworten.
leider bin ich im scripten nicht so fit dabei wie ihr...

hast du denn mal über das bisherige gesehen, also was genau abgearbeitet werden soll?
bei dir müsste ich meine funktionen ja noch alle erweitern, oder nicht?
ich bräuchte nach möglichkeit eine leicht praktikable lösung, da es gut sein kann, dass ich das script später noch vervielfältigen muss, um genau auf jede regel eine batch zu haben, die entsprechend dann reagieren kann und soll.

danke für eure hilfe! face-smile


gn8
Mitglied: bastla
bastla 23.10.2012, aktualisiert am 25.10.2012 um 23:02:50 Uhr
Goto Top
Hallo wsecure!

Um jeweils nur die letzten 10 Zeilen zu verarbeiten, könntest Du etwa so vorgehen:
@echo off & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id  
set /a Zeilen=10

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
            set "Name=%%i %%r %%a"  
            echo netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r  
        )
    )
)
sleep 30
goto :loop
Grüße
bastla

P.S.: Magst Du Deine Batch-Ansätze nicht auch vernünftig (als Code) formatiert posten (lässt sich sogar noch nachholen face-wink)?

[Edit] Reihenfolge der Zeilen 10 und 11 korrigiert [/Edit]
Mitglied: pieh-ejdsch
pieh-ejdsch 24.10.2012 aktualisiert um 15:23:25 Uhr
Goto Top
moin,

Hier ist das Script zum offenhalten an der letzten Zeile:
@echo off
setlocal disabledelayedexpansion
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"   

set "Datei=D:\log\alert.id"  

 rem wenig CPUlast
 rem Verarbeitet alle Zeilen und wenn eine neue angefügt wird immer die Letzte Zeile

<"%Datei%" "%~pd0%~n0-write.cmd"  
exit /b



:INSTALLPuffer
@echo off
setlocal
set /a Limit=60
set /a R=limit
:IN
 set /a r-=1
 set "out=1"  
 set "inline="  
 set /p "inline="  
 setlocal enabledelayedexpansion

  rem Abbruch wenn nach Zeitlimit keine Ausgabe
 if %r% leq 0 exit /b
 if not defined inline endlocal &waitfor EineSekundePause /t 1 >nul 2>&1&title Timer %r% &goto :in

  rem Verarbeite Zeile mit Programm
for /f "tokens=1*" %%t in ("!inline!") do ^  
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^  
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^  
echo netsh advfirewall firewall add rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" dir=in action=block protocol=%%q remoteip=%%r  

 if "!os!" equ "%OS%" endlocal  
 set /a R=limit
 title verarbeite Zeile
goto :in

So nu aber inne Haia

Gruß Phil
Mitglied: wsecure
wsecure 25.10.2012 aktualisiert um 01:17:43 Uhr
Goto Top
hallo zusammen,
zuerst mal vielen dank für eure bereitschaft hier mitzuwirken! face-smile
ich konnte leider nicht früher antworten...

zuerst zu phil
dein script gibt mir eine neue datei aus wenn ich es ausführe.
bei der neuen datei *.cmd kommt leider nur diese ausgabe ca. 20x, sonst passiert aber nichts:

Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.

bastla! :P
du hast es quasi fast geschafft, jedoch gibt es noch drei klitze kleine probleme...

zusammenfassung:
der loop geht nicht mehr und das schon länger in deinem script, nur das erste script hatte den loop noch akzeptiert. nun werde ich jedesmal aus dem script zurück in dos geschmissen.

das zweite problem ist, dass die beschreibung der regel in der firewall jetzt immer %r anstatt die ip ausgibt.
seltsamerweise stimmt aber die ip in der blockregel der firewall für remote! ???

zuletzt, gibt es noch keine abfrage für die derzeit aktiven firewall einträge, somit werden einträge derzeit auch gern 1000x gesetzt, anstatt 1x, was natürlich etwas unpraktisch ist.


mein lösungsansatz war:
@echo on & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id"  
set /a Zeilen=1
set IDCHECK="Priority"  

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"%IDCHECK%"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        set "Name=%%i %%r %%a"  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
        cmd /K netsh advfirewall firewall show rule name="!Name:~,-1!" >nul  
        if not ERRORLEVEL 1 do (
        cmd /K netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in enable=yes profile=any action=block protocol=%%b remoteip=%%r  
        )
    )
)
sleep 3
goto :loop

die beschreibung der firewall regel bleibt gleich, doch setzt er weiterhin die gleiche regel und die prüfung findet nicht statt.

wenn ich testweise eine variabel für "!Name:~,-1!" setzte:
@echo on & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id"  
set /a Zeilen=1
set IDCHECK="Priority"  
set IDNAME="!Name:~,-1!"  

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"%IDCHECK%"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        set "Name=%%i %%r %%a"  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
        cmd /K netsh advfirewall firewall show rule name="%IDNAME%" >nul  
        if not ERRORLEVEL 1 do (
        cmd /K netsh advfirewall firewall add rule name="%IDNAME%" dir=in enable=yes profile=any action=block protocol=%%b remoteip=%%r  
        )
    )
)
sleep 3
goto :loop

setzt er den regelnamen der firewall auf ~,-1 und beim zweitenmal ausführen der batch wird die regel nicht neu gesetzt, also funktioniert das script seltsamerweise, jedoch stimmt der name der firewall regel nun überhaupt nicht mehr und der loop im script fehlt noch...

ich hoffe ihr seid weiterhin so nett und helft mir beim letzten feinschliff! face-smile


gn8
Mitglied: bastla
bastla 25.10.2012 um 09:23:55 Uhr
Goto Top
Hallo wsecure!

Das "%%r"-Problem sollte einfach zu lösen sein: Variable erst verwenden, wenn es sie gibt (ich hatte oben Zeilen 10 und 11 vertauscht face-sad), also innerhalb der letzten "for /f"-Schleife ...

Grüße
bastla
Mitglied: pieh-ejdsch
pieh-ejdsch 25.10.2012 aktualisiert um 21:37:38 Uhr
Goto Top
moin,

Die Fehlermeldung besagte ja das Fehlen einer Datei also der Datei "D:\log\alert.id".
Sonst sollte es aber laufen.

Ich habs nochmal ein wenig gekürzt (läuft jetzt auch nur als einzelner Batch) und der Eintrag in die Firewall wurde mit bedingter Befehlsverkettung verknüpft.

@echo off
setlocal disabledelayedexpansion
if "%~1" neq "" (set "Datei=%~1") else set "Datei=D:\log\alert.id"  
find "" "%Datei%"|find "-" >nul ||exit /b 1 &for /f %%i in ('more +5 "%datei%" ^|find /c /v "" ') do Call <"%Datei%" :Read_Lines %%i &exit /b  
:Read_Lines
for /l %%i in (1 1 %1 ) do set /p "inline="  
:IN
 set "inline="  
 set /p "inline="  
 if not defined inline waitfor EineSekundePause /t 1 >nul 2>&1 &goto :in
 setlocal enabledelayedexpansion
for /f "tokens=1*" %%t in ("!inline!") do ^  
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^  
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^  
netsh advfirewall firewall show rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" >nul|| netsh advfirewall firewall add rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" dir=in action=block protocol=%%q remoteip=%%r  

 if "!os!" equ "%OS%" endlocal  
goto :in

Wieso steht eigentlich der Zeitstempel im Regelnamen?

Gruß Phil
Mitglied: wsecure
wsecure 25.10.2012 aktualisiert um 23:50:14 Uhr
Goto Top
hallo zusammen,
weiterhin vielen dank für eure bereitschaft mir zu helfen! face-smile

phil:
auch diesmal bekomme ich das gleiche ergebnis, selbst wenn ich testweise die datei mal auf c:\ auslager.

D:\log>logscan.bat

D:\log>setlocal disabledelayedexpansion

D:\log>if "" NEQ "" (set "Datei=" ) else set "Datei=c:\alert.id"

"c:\alert.id" |more +5 |find /c /v "Priority" ') do Call :Read_Lines %i 0<"c:\alert.id" & exit
/b
Das System kann die angegebene Datei nicht finden.

D:\log>


der zeitstempel am anfang im regelnamen wird von dem programm was die angriffe erkennt in den log geschrieben.
der ganze log ist nicht änderbar sondern so wie er ist fest vorgegeben.


bastla:
ich habe jetzt nochmal viel hin und her probiert, doch komme ich nicht wirklich weiter.

mein versuch mit der abfrage für vorhandene firewall regeln scheint auch nicht zu funktionieren, sondern war wohl nur eine eintagsfliege...

zumindest habe ich herausgefunden, falls wir bei der regelbeschreibung mit "%%i %%a %%r" bleiben, dass die ip variabel hinten stehen muss, damit am ende der zeile kein freizeichen mehr vorhanden und somit die regel in der firewall gültig ist.

es sind jetzt nur noch die zwei funktionen, script loopfunktion und auslesen der derzeitigen firewallregeln, ausstehend.

@phil
dir scheint das scripten ja auch zu liegen, könntest du sonst einfach mal über das script von bastla gucken, ob du es auf die zwei fehlenden komponenten erweitern kannst?
@bastla
dich bitte ich natürlich auch weiterhin um deine hilfe...

vielleicht hat aber auch jemand anders noch eine umsetzungsidee?


gruß und gn8! face-smile
Mitglied: bastla
bastla 25.10.2012 um 23:02:04 Uhr
Goto Top
Hallo wsecure!
bei der regelbeschreibung mit "%%i %%a %%r" bleiben, dass die ip variabel hinten stehen muss, damit am ende der zeile kein freizeichen mehr vorhanden und somit die regel in der firewall gültig ist.
Dagegen ist nix einzuwenden (außer, dass mit meinem (inzwischen korrigierten) Ansatz oben bereits das Leerzeichen am ende entfernt sein sollte) ...

Die Verhindern doppelter Regeln sollte sich bei dieser Namensgebung auch vereinfachen lassen und könnte etwa so erfolgen, dass beim Start des Scripts die derzeitigen Regeln in eine Datei exportiert und jeweils nach dem Setzen einer neuen Regel diese Datei ergänzt (bzw wieder neu erstellt wird - vermutlich eine Frage der Performance). Abfragen ließe sich dann am einfachsten das Vorhandensein einer Regel mit der aktuell ermittelten IP:
findstr /e "%%r" "Regeln.txt">nul || (  
    netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r  
)
BTW: Inziwschen hatte ich Zeit, mir Deinen letzten Ansatz genauer anzusehen: Noch schlimmer, als mein Fauxpas mit %%r ist es, wenn Du die (unnötige) Variable %IDNAME% schon vor der ersten Schleife setzt (da gibt es nämlich weder %%r noch %Name%) - daher vielleicht doch noch einmal mit meiner angesprochenen Variante antesten ... face-wink

Grüße
bastla
Mitglied: wsecure
wsecure 25.10.2012 um 23:12:29 Uhr
Goto Top
hallo bastla! face-smile

wie gesagt ich bin leider mit scripten nicht so affin wie ihr, verzeih mir also mein "gefrickel"... :P

wärest du so nett, damit ich nicht wieder einen fehler einbaue, nochmal das gesammte script zu posten? dank dir!


gruß
Mitglied: bastla
bastla 25.10.2012 um 23:37:22 Uhr
Goto Top
Hallo wsecure!

Da sich (wie ich mir zwischenzeitlich angesehen habe) das Ergebnis von "netsh advfirewall export Regeln.wfw" nicht wirklich gut zum Durchsuchen per "findstr" eignet, wäre vielleicht die oben von Dir verwendete Variante der bessere Weg - das könnte dann insgesamt etwa so aussehen:
@echo off & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id  
set /a Zeilen=10

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
            set "Name=%%i %%r %%a"  
            netsh advfirewall firewall show rule name="!Name:~,-1!">nul || (  
                netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r  
            )
        )
    )
)
sleep 30
goto :loop
Die Reihenfolge innerhalb der Benennung kannst Du auf Wunsch in der Zeile 11 natürlich trotzdem anpassen bzw auf die Variable %Name% (bzw wegen der "delayedExpansion" eigentlich "!Name!) ganz verzichten - das sähe dann so aus:
@echo off & setlocal
set "Log=D:\log\alert.id  
set /a Zeilen=10

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
            netsh advfirewall firewall show rule name="%%i %%a %%r">nul || (  
                netsh advfirewall firewall add rule name="%%i %%a %%r" dir=in action=block protocol=%%b remoteip=%%r  
            )
        )
    )
)
sleep 30
goto :loop
Das Ganze ist, falls ich das noch nicht erwähnt haben sollte face-wink, weiterhin ungetestet ...

Grüße
bastla
Mitglied: wsecure
wsecure 26.10.2012 aktualisiert um 00:29:17 Uhr
Goto Top
hi bastla! face-smile

kein problem, zum testen bin ich ja da... hehe

dein script "kann jetzt auch die datei nicht finden" jedoch läuft es durch und macht auch alle funktionen, bis auf die regel prüfung.
somit wird weiterhin immer die gleiche regel neu in die firewall eingetragen.

mir ist aufgefallen, dass du nun nicht mehr die errorlevel 1 abfrage inkludiert hast.
zum testen hab ich dies gemacht:
@echo on & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id"  
set /a Zeilen=1

:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%  
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (  
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
        for /f "tokens=4 delims=: " %%r in ("%%c") do (  
            set "Name=%%i %%r %%a"  
            netsh advfirewall firewall show rule name="!Name:~,-1!" >nul (  
                if not ERRORLEVEL 1 (
                    netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r  
                )
            )
        )
    )
)
sleep 3
goto :loop

läuft durch, aber hat nicht die regeln geprüft und fügt auch wieder die gleiche regel hinzu... hm.. somit funktioniert diese prüfung nicht (eintagsfliege).
weißt du sonst noch eine möglichkeit die vorhandenen firewall regeln zu lesen und mit dem aktuellen alarm gegen zu checken, damit nicht dauernd die gleiche regel neu eingetragen wird?


gruß

edit: achtung hatte editiert... syntax fehler ist raus
Mitglied: bastla
bastla 26.10.2012 um 00:41:55 Uhr
Goto Top
Hallo wsecure!
mir ist aufgefallen, dass du nun nicht mehr die errorlevel 1 abfrage inkludiert hast.

... was aber offenbar auch egal ist, wenn die Methode mit "show rule" doch nicht funktioniert (und nein, ich kann leider derzeit keine sinnvolle Alternative anbieten face-sad).
Zu
"kann jetzt auch die datei nicht finden"
noch eine Frage: An welcher Stelle im Ablauf (nach welcher Batchzeile) taucht denn diese Fehlermeldung auf?

Grüße
bastla
Mitglied: wsecure
wsecure 26.10.2012 um 01:12:51 Uhr
Goto Top
Hi bastla! face-smile

hier der cmd auszug:
D:\log>set /a Setoff=50-1

D:\log>set /a Setoff=51-1

D:\log>set /a Setoff=52-1

D:\log>set /a Setoff=53-1

D:\log>if 52 LSS 0 set /a Setoff=0

D:\log>for /F "tokens=1*" %i in ('more +52 "D:\log\alert.id"|findstr /c:"
Priority"') do (for /F "tokens=1-3 delims={}" %a in ("%j") do (for /F "tokens=4 delims=: " %r in ("%
c") do (
set "Name=%i %r %a"
rule name="!Name:~,-1!" dir=in action=block protocol=%b remoteip=%r )
) ) )

D:\log>(for /F "tokens=1-3 delims={}" %a in ("[] [137:1:2] (ssp_ssl) Invalid Client H
ELLO after Server HELLO Detected [
] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP}
192.72.33.X:57571 -> 146.4.94.X:12345") do (for /F "tokens=4 delims=: " %r in ("%c") do (
set "Name=10/25-21:59:03.333090 %r %a"
rule name="!Name:~,-1!" dir=in action=block protocol=%b remoteip=%r )
) ) )

D:\log>(for /F "tokens=4 delims=: " %r in (" 192.72.33.X:57571 -> 146.4.94.X:12345") d
o (
set "Name=10/25-21:59:03.333090 %r [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO
Detected [
] [Classification: Potentially Bad Traffic] [Priority: 2] "
rule name="!Name:~,-1!" dir=in action=block protocol=TCP remoteip=%r )
) )

D:\log>(
set "Name=10/25-21:59:03.333090 146.4.94.X [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Serv
er HELLO Detected [
] [Classification: Potentially Bad Traffic] [Priority: 2] "
rule name="!Name:~,-1!" dir=in action=block protocol=TCP remoteip=146.4.94.X )
)
Das System kann die angegebene Datei nicht finden.
OK.


D:\log>sleep 30
^CBatchvorgang abbrechen (J/N)?


als evtl. lösungsansatz:
es gibt ja noch die möglichkeit die firewall regeln zu exportieren.
den suchbegriff haben wir mit "!Name:~,-1!" in diesem moment ja auch schon spezifiziert.
ich habe gerad in der registry nach der gesetzten regel gesucht, doch hab sie bis jetzt noch nicht finden können, ein export der kompletten regel funktioniert und ich bekomme dies gelistet:

| A c t i o n = B l o c k | A c t i v e = T R U E | D i r = I n | P r o t o c o l = 6 | R A 4 = 1 4 6 . 4 . 9 4 . X | N a m e = 1 0 / 2 5 - 2 1 : 5 9 : 0 3 . 3 3 3 0 9 0 1 4 6 . 4 . 9 4 . X [ * * ] [ 1 3 7 : 1 : 2 ] ( s s p _ s s l ) I n v a l i d C l i e n t H E L L O a f t e r S e r v e r H E L L O D e t e c t e d [ * * ] [ C l a s s i f i c a t i o n : P o t e n t i a l l y B a d T r a f f i c ] [ P r i o r i t y : 2 ] |

also auffindbar.

seltsam, dass ich die regel nicht in der registry finden konnte, alle anderen regeln schon... hm
in der registry sind nicht so viele freizeichen und der name müsste mit "!Name:~,-1!" auslesbar sein.
ich muss nochmal gucken, aber wenn du vielleicht schon einen ansatz hast, dann immer her damit! face-smile


gn8
Mitglied: wsecure
wsecure 26.10.2012 um 01:45:59 Uhr
Goto Top
hab nochmal nachgesehen wo die firewall rules gespeichert werden, damit sie einfacher ausgelesen werden können:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

dort lautet zb ein eintrag dann:
{9512BE9F-4D01-4121-A5A8-3E172649E654}

mit dem wert:
v2.10|Action=Block|Active=TRUE|Dir=In|Protocol=6|RA4=146.4.94.X|Name=10/25-21:59:03.333090 146.4.94.X [] [137:1:2] (ssp_ssl) Invalid Client HELLO after Server HELLO Detected [] [Classification: Potentially Bad Traffic] [Priority: 2]|

ergo müsste dann auch nicht der eintragsname, sondern dessen wert ausgelesen werden.

ich hoffe das hilft dir irgendwie weiter?


gruß