Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: wsecure

wsecure (Level 1) - Jetzt verbinden

23.10.2012, aktualisiert 25.10.2012, 2400 Aufrufe, 23 Kommentare

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ß
Mitglied: bastla
23.10.2012 um 12:42 Uhr
Hallo wsecure!

Das Problem dürfte weniger das Zerlegen der Log-Zeilen sein - als Batch annäherungsweise so:
01.
@echo off & setlocal 
02.
for /f "tokens=1*" %%i in ('findstr /c:"Bad Traffic" D:\LogDatei.txt') do ( 
03.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
04.
        for /f "delims=: " %%r in ("%%c") do ( 
05.
            echo netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r 
06.
07.
08.
)
- 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
Bitte warten ..
Mitglied: wsecure
23.10.2012 um 13:10 Uhr
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ß
Bitte warten ..
Mitglied: wsecure
23.10.2012, aktualisiert um 15:51 Uhr
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!
Bitte warten ..
Mitglied: wsecure
23.10.2012, aktualisiert 24.10.2012
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)
01.
@echo on & setlocal  
02.
:loop 
03.
for /f "tokens=1*" %%i in ('findstr /c:"Bad Traffic" D:\log\alert.id') do (  
04.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do (  
05.
        for /f "delims=: " %%r in ("%%c") do (  
06.
            cmd /K netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r  
07.
        )  
08.
    )  
09.
10.
ping -n 2 127.0.0.1 > nul 
11.
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!
Bitte warten ..
Mitglied: bastla
23.10.2012 um 16:12 Uhr
Hallo wsecure!

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

... 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
Bitte warten ..
Mitglied: wsecure
23.10.2012, aktualisiert um 16:45 Uhr
wir kommen der sache näher...

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?
Bitte warten ..
Mitglied: wsecure
23.10.2012 um 17:07 Uhr
hier hattest du schon einmal das problem gelöst (letzte zeile, sogar mit letztes freizeichen entfernen.)
http://www.administrator.de/articles/detail.php?id=74321
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!
Bitte warten ..
Mitglied: wsecure
23.10.2012, aktualisiert 25.10.2012
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:
01.
@echo off & setlocal 
02.
:loop 
03.
for /f "tokens=1* delims=," %%i in ('findstr /c:"Priority" D:\log\alert.id') do ( 
04.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do  ( 
05.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
06.
            cmd /c netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r 
07.
08.
09.
10.
sleep 30 
11.
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...
Bitte warten ..
Mitglied: pieh-ejdsch
23.10.2012 um 20:07 Uhr
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:
01.
:readinput.cmd 
02.
@echo off 
03.
 
04.
 
05.
if "%~1" equ "/?" echo Stellt eine Pufferdatei zum Permaneten auslesen zur verfuegung.^ 
06.
 &echo Dies ermoeglicht Tee waerend der Ausfuehrung eines Befehls.^ 
07.
 &echo(&<nul set /p "=%~n0 " &echo [Logfile] [/.]&echo(^ 
08.
 &echo      Logfile    Angabe eines zu Puffernden Logfiles.^ 
09.
 &echo      /.         Auch Leerzeilen Puffern.&echo(^ 
10.
 &echo   "%~pd0%~n0-write.cmd"  wird zum^ 
11.
 &echo    abarbeiten des Puffers Bereitgestellt.&echo(^ 
12.
 &echo   Befehle mit Pipe einleiten:^ 
13.
 &echo    Befehl1 ^| "%~n0" [Logfile] [/.] &exit /b  
14.
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"  
15.
setlocal disabledelayedexpansion 
16.
set "Puffertmp=%temp%\Tee%random%.txt" 
17.
set "Puffer=%Puffertmp%" 
18.
set "LN=." 
19.
set "del=/D" 
20.
if "%~1" equ "" goto :noParam 
21.
:Parameter 
22.
if /i "%~1" equ "/N" (set "N=1" &set LN="^" ) else set "del=" &set "Puffer=%~1" 
23.
if "%~2" neq "" shift &goto :Parameter 
24.
:noParam 
25.
 
26.
(findstr /n %LN% && ECHO E_O_F_END_OF_FILE:) >"%Puffer%" | <"%Puffer%" "%~pd0%~n0-write.cmd" "%Puffer%" %del% 
27.
 
28.
exit /b 
29.
 
30.
 
31.
 
32.
:INSTALLPuffer 
33.
@echo off 
34.
setlocal 
35.
set /a Limit=60 
36.
if "%~1" equ "/?" echo Liest aus einer nummerierten Pufferdatei, bis zur Abschlusszeile "E_O_F_END_OF_FILE:".^ 
37.
 &echo oder bis diese Datei kleiner als Vorher wird: ^( type nul ^<PufferDatei ^).&echo(^ 
38.
 &<nul set /p "=%~n0 Pufferdatei [/d] ^<PufferDatei" &echo(^ 
39.
 &echo    /D     Die ^(temporaere^) Datei wird nachher geloescht.^ 
40.
 &echo   Werden %Limit% Sekunden keine Ausgaben Produziert wird dieses Programm beendet.&exit /b 
41.
if not exist "%~1" echo Pufferdatei nicht gefunden! >&2 &exit /b 1 
42.
if /i "%~2" neq /D (set "Del=") else set del=^&del %1 ^>nul 
43.
for %%i in (%1) do set "Z=%%~zi" 
44.
 
45.
set /a R=limit 
46.
:IN 
47.
 set /a r-=1 
48.
 set "out=1" 
49.
 set "inline=" 
50.
 set /p "inline=" 
51.
 setlocal enabledelayedexpansion 
52.
  rem Abbruch mit AbschlussZeile 
53.
 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 
54.
  rem Abbruch wenn nach Zeitlimit keine Ausgabe 
55.
 if %r% leq 0 title Verabeitung Fertig.%del%&exit /b 
56.
  rem Abbruch wenn Datei kleiner 
57.
 for %%i in (%1) do if %Z% gtr %%~zi (title Verabeitung Fertig.%del%&exit /b) else set "Z=%%~zi" 
58.
 if defined Out endlocal &waitfor EineSekundePause /t 1 >nul 2>&1 &title Timer %r%&goto :in 
59.
  rem  Hier muss die Verarbeitung Hinein zB. 
60.
 echo(!inline:*:=! 
61.
 for /f "tokens=1,2,3*" %%i in ("!inline:*:=!") do endlocal &echo %%j-%time%-%%l 
62.
 if "%os%" equ "!OS!" endlocal 
63.
 set /a R=limit 
64.
goto :in 
65.
 

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
Bitte warten ..
Mitglied: wsecure
23.10.2012 um 21:19 Uhr
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!


gn8
Bitte warten ..
Mitglied: bastla
23.10.2012, aktualisiert 25.10.2012
Hallo wsecure!

Um jeweils nur die letzten 10 Zeilen zu verarbeiten, könntest Du etwa so vorgehen:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Log=D:\log\alert.id 
03.
set /a Zeilen=10 
04.
 
05.
:loop 
06.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
07.
if %Setoff% lss 0 set /a Setoff=0 
08.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do ( 
09.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
10.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
11.
            set "Name=%%i %%r %%a" 
12.
            echo netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r 
13.
14.
15.
16.
sleep 30 
17.
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 )?

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

Hier ist das Script zum offenhalten an der letzten Zeile:
01.
@echo off 
02.
setlocal disabledelayedexpansion 
03.
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"  
04.
 
05.
set "Datei=D:\log\alert.id" 
06.
 
07.
 rem wenig CPUlast 
08.
 rem Verarbeitet alle Zeilen und wenn eine neue angefügt wird immer die Letzte Zeile 
09.
 
10.
<"%Datei%" "%~pd0%~n0-write.cmd" 
11.
exit /b 
12.
 
13.
 
14.
 
15.
:INSTALLPuffer 
16.
@echo off 
17.
setlocal 
18.
set /a Limit=60 
19.
set /a R=limit 
20.
:IN 
21.
 set /a r-=1 
22.
 set "out=1" 
23.
 set "inline=" 
24.
 set /p "inline=" 
25.
 setlocal enabledelayedexpansion 
26.
 
27.
  rem Abbruch wenn nach Zeitlimit keine Ausgabe 
28.
 if %r% leq 0 exit /b 
29.
 if not defined inline endlocal &waitfor EineSekundePause /t 1 >nul 2>&1&title Timer %r% &goto :in 
30.
 
31.
  rem Verarbeite Zeile mit Programm 
32.
for /f "tokens=1*" %%t in ("!inline!") do ^ 
33.
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^ 
34.
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^ 
35.
echo netsh advfirewall firewall add rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" dir=in action=block protocol=%%q remoteip=%%r 
36.
 
37.
 if "!os!" equ "%OS%" endlocal 
38.
 set /a R=limit 
39.
 title verarbeite Zeile 
40.
goto :in
So nu aber inne Haia

Gruß Phil
Bitte warten ..
Mitglied: wsecure
25.10.2012, aktualisiert um 01:17 Uhr
hallo zusammen,
zuerst mal vielen dank für eure bereitschaft hier mitzuwirken!
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:
01.
@echo on & setlocal enabledelayedexpansion 
02.
set "Log=D:\log\alert.id" 
03.
set /a Zeilen=1 
04.
set IDCHECK="Priority" 
05.
 
06.
:loop 
07.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
08.
if %Setoff% lss 0 set /a Setoff=0 
09.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"%IDCHECK%"') do ( 
10.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
11.
        set "Name=%%i %%r %%a" 
12.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
13.
        cmd /K netsh advfirewall firewall show rule name="!Name:~,-1!" >nul 
14.
        if not ERRORLEVEL 1 do ( 
15.
        cmd /K netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in enable=yes profile=any action=block protocol=%%b remoteip=%%r 
16.
17.
18.
19.
sleep 3 
20.
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:
01.
@echo on & setlocal enabledelayedexpansion 
02.
set "Log=D:\log\alert.id" 
03.
set /a Zeilen=1 
04.
set IDCHECK="Priority" 
05.
set IDNAME="!Name:~,-1!" 
06.
 
07.
:loop 
08.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
09.
if %Setoff% lss 0 set /a Setoff=0 
10.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"%IDCHECK%"') do ( 
11.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
12.
        set "Name=%%i %%r %%a" 
13.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
14.
        cmd /K netsh advfirewall firewall show rule name="%IDNAME%" >nul 
15.
        if not ERRORLEVEL 1 do ( 
16.
        cmd /K netsh advfirewall firewall add rule name="%IDNAME%" dir=in enable=yes profile=any action=block protocol=%%b remoteip=%%r 
17.
18.
19.
20.
sleep 3 
21.
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!


gn8
Bitte warten ..
Mitglied: bastla
25.10.2012 um 09:23 Uhr
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 ), also innerhalb der letzten "for /f"-Schleife ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
25.10.2012, aktualisiert um 21:37 Uhr
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.

01.
@echo off 
02.
setlocal disabledelayedexpansion 
03.
if "%~1" neq "" (set "Datei=%~1") else set "Datei=D:\log\alert.id" 
04.
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 
05.
:Read_Lines 
06.
for /l %%i in (1 1 %1 ) do set /p "inline=" 
07.
:IN 
08.
 set "inline=" 
09.
 set /p "inline=" 
10.
 if not defined inline waitfor EineSekundePause /t 1 >nul 2>&1 &goto :in 
11.
 setlocal enabledelayedexpansion 
12.
for /f "tokens=1*" %%t in ("!inline!") do ^ 
13.
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^ 
14.
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^ 
15.
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 
16.
 
17.
 if "!os!" equ "%OS%" endlocal 
18.
goto :in
Wieso steht eigentlich der Zeitstempel im Regelnamen?

Gruß Phil
Bitte warten ..
Mitglied: wsecure
25.10.2012, aktualisiert um 23:50 Uhr
hallo zusammen,
weiterhin vielen dank für eure bereitschaft mir zu helfen!

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"

D:\log>find "" "c:\alert.id" | find "-" 1>nul || exit /b 1 & for /F %i in ('type
"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!
Bitte warten ..
Mitglied: bastla
25.10.2012 um 23:02 Uhr
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:
01.
findstr /e "%%r" "Regeln.txt">nul || ( 
02.
    netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r 
03.
)
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 ...

Grüße
bastla
Bitte warten ..
Mitglied: wsecure
25.10.2012 um 23:12 Uhr
hallo bastla!

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ß
Bitte warten ..
Mitglied: bastla
25.10.2012 um 23:37 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Log=D:\log\alert.id 
03.
set /a Zeilen=10 
04.
 
05.
:loop 
06.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
07.
if %Setoff% lss 0 set /a Setoff=0 
08.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do ( 
09.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
10.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
11.
            set "Name=%%i %%r %%a" 
12.
            netsh advfirewall firewall show rule name="!Name:~,-1!">nul || ( 
13.
                netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r 
14.
15.
16.
17.
18.
sleep 30 
19.
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:
01.
@echo off & setlocal 
02.
set "Log=D:\log\alert.id 
03.
set /a Zeilen=10 
04.
 
05.
:loop 
06.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
07.
if %Setoff% lss 0 set /a Setoff=0 
08.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do ( 
09.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
10.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
11.
            netsh advfirewall firewall show rule name="%%i %%a %%r">nul || ( 
12.
                netsh advfirewall firewall add rule name="%%i %%a %%r" dir=in action=block protocol=%%b remoteip=%%r 
13.
14.
15.
16.
17.
sleep 30 
18.
goto :loop
Das Ganze ist, falls ich das noch nicht erwähnt haben sollte , weiterhin ungetestet ...

Grüße
bastla
Bitte warten ..
Mitglied: wsecure
26.10.2012, aktualisiert um 00:29 Uhr
hi bastla!

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:
01.
@echo on & setlocal enabledelayedexpansion 
02.
set "Log=D:\log\alert.id" 
03.
set /a Zeilen=1 
04.
 
05.
:loop 
06.
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen% 
07.
if %Setoff% lss 0 set /a Setoff=0 
08.
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do ( 
09.
    for /f "tokens=1-3 delims={}" %%a in ("%%j") do ( 
10.
        for /f "tokens=4 delims=: " %%r in ("%%c") do ( 
11.
            set "Name=%%i %%r %%a" 
12.
            netsh advfirewall firewall show rule name="!Name:~,-1!" >nul ( 
13.
                if not ERRORLEVEL 1 ( 
14.
                    netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r 
15.
16.
17.
18.
19.
20.
sleep 3 
21.
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
Bitte warten ..
Mitglied: bastla
26.10.2012 um 00:41 Uhr
Hallo wsecure!
mir ist aufgefallen, dass du nun nicht mehr die errorlevel 1 abfrage inkludiert hast.
Ist so nicht ganz richtig - ich habe nur etwas abgekürzt mit "||" (siehe Zeile 11) ...

... 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 ).
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
Bitte warten ..
Mitglied: wsecure
26.10.2012 um 01:12 Uhr
Hi bastla!

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"
netsh advfirewall firewall show rule name="!Name:~,-1!" 1>nul || (netsh advfirewall firewall add
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"
netsh advfirewall firewall show rule name="!Name:~,-1!" 1>nul || (netsh advfirewall firewall add
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] "
netsh advfirewall firewall show rule name="!Name:~,-1!" 1>nul || (netsh advfirewall firewall add
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] "
netsh advfirewall firewall show rule name="!Name:~,-1!" 1>nul || (netsh advfirewall firewall add
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!


gn8
Bitte warten ..
Mitglied: wsecure
26.10.2012 um 01:45 Uhr
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ß
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
Script zum Auflösen einer Ordnerstruktur und zurück gesucht (12)

Frage von websolutions zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...