OPNsense Suricata Eigene Regeln: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 16: Zeile 16:
 
=Beispiele=
 
=Beispiele=
 
*cat own.rules
 
*cat own.rules
<pre>
 
# ICMP: einfacher Ping/Traceroute (schneller Funktionstest)
 
# Test: ping -c1 <ZIEL>
 
alert icmp any any -> any any (msg:"ICMP Test"; classtype:misc-activity; sid:41;)
 
  
# HTTP: mögliches Command-Injection-Merkmal (Semikolon) in POST-Body
+
{{suricata-rules}}
# Test: curl -X POST http://<ZIEL>/ -d "q=test%3Bls"
 
alert http any any -> any any (msg:"Command Injection - Semicolon in POST DATA"; classtype:web-application-attack; flow:established; content:"%3B"; nocase; http_client_body; sid:2;)
 
  
# HTTP: mögliches SQLi-Merkmal (einfaches Hochkomma) in POST-Body
+
{{suricata-rules-beschreibung}}
# Test: curl -X POST http://<ZIEL>/login -d "u=a&p='%20OR%201=1"
 
alert http any any -> any any (msg:"Possible SQL Injection (singlequote in POST)"; classtype:web-application-attack; flow:established,to_server; content:"%27"; nocase; http_client_body; sid:3;)
 
 
 
# DNS: Policy – verbietet "google" in DNS-Queries
 
# Test: dig google.com @<FW>
 
drop dns any any -> any any (msg:"Kein Googlen"; dns.query; content:"google"; nocase; classtype:policy-violation; sid:43;)
 
 
 
# DoS: viele identische kurze HTTP-GETs (LOIC-ähnlich)
 
# Test: ab -n 1000 -c 500 http://<ZIEL>/
 
drop tcp any any -> any any (msg:"ET DOS Terse HTTP GET Likely LOIC"; flow:to_server,established; dsize:18; content:"GET / HTTP/1.1|0d 0a 0d 0a|"; depth:18; threshold:type both,track by_dst,count 500,seconds 60; classtype:own-dos; sid:54; rev:2; metadata:created_at 2014_10_03, confidence Medium, signature_severity Major, updated_at 2019_07_26;)
 
 
 
# Scan: TCP SYN-Sweep (viele SYN in kurzer Zeit)
 
# Test: nmap -sS -p1-100 <ZIEL>
 
drop tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"OWN SCAN TCP SYN sweep"; flow:stateless,to_server; flags:S; detection_filter:track by_src,count 20,seconds 5; classtype:attempted-recon; sid:60; rev:1;)
 
 
 
# Scan: TCP NULL-Scan (keine Flags gesetzt)
 
# Test: nmap -sN -p1-100 <ZIEL>
 
drop tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"OWN SCAN TCP NULL scan"; flow:stateless,to_server; flags:0; detection_filter:track by_src,count 5,seconds 10; classtype:attempted-recon; sid:61; rev:1;)
 
 
 
# Scan: TCP FIN-Scan (nur FIN)
 
# Test: nmap -sF -p1-100 <ZIEL>
 
drop tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"OWN SCAN TCP FIN scan"; flow:stateless,to_server; flags:F; detection_filter:track by_src,count 5,seconds 10; classtype:attempted-recon; sid:62; rev:1;)
 
 
 
# Scan: TCP XMAS-Scan (FIN+PSH+URG)
 
# Test: nmap -sX -p1-100 <ZIEL>
 
drop tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"OWN SCAN TCP XMAS scan"; flow:stateless,to_server; flags:FPU; detection_filter:track by_src,count 5,seconds 10; classtype:attempted-recon; sid:63; rev:1;)
 
 
 
# Scan: UDP-Sweep mit leerer Payload
 
# Test: nmap -sU --min-rate=1000 <ZIEL>
 
drop udp $EXTERNAL_NET any -> $HOME_NET 1:65535 (msg:"OWN SCAN UDP sweep (empty probes)"; flow:to_server; dsize:0; detection_filter:track by_src,count 15,seconds 10; classtype:attempted-recon; sid:64; rev:1;)
 
 
 
# Scan: ICMP Ping-Sweep (viele Echo-Requests)
 
# Test: nmap -sn <NETZ>/24
 
drop icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"OWN SCAN ICMP ping sweep"; itype:8; detection_filter:track by_src,count 10,seconds 5; classtype:attempted-recon; sid:65; rev:1;)
 
</pre>
 
 
 
 
 
{| class="wikitable"
 
|-
 
! Schlüsselwort
 
! Beschreibung
 
|-
 
| alert
 
| Dieses Schlüsselwort gibt an, dass ein Alarm ausgelöst werden soll, wenn das Muster in der Regel erkannt wird. Ein Alarm kann eine Benachrichtigung an den Administrator oder eine andere Reaktion auf das erkannte Muster sein.
 
|-
 
| icmp
 
| Dies steht für das Internet Control Message Protocol, das für den Austausch von Nachrichten und Diagnoseinformationen in IP-Netzwerken verwendet wird. Diese Regel überwacht den Verkehr, der das ICMP-Protokoll verwendet.
 
|-
 
| any
 
| Dieser Platzhalter steht für jedes mögliche Quell- oder Zielattribut. In diesem Fall bedeutet any any, dass sowohl der Quell- als auch der Ziel-IP-Adressbereich nicht eingeschränkt sind.
 
|-
 
| ->
 
| Dieser Pfeil zeigt die Richtung des Datenverkehrs an. In diesem Fall bedeutet any any -> any any, dass der Datenverkehr in beide Richtungen (hin und zurück) überwacht wird.
 
|-
 
| (msg:"ICMP Test";)
 
| Dies ist eine optionale Nachricht, die dem Administrator mitteilt, warum der Alarm ausgelöst wurde. In diesem Fall lautet die Nachricht "ICMP Test".
 
|-
 
| classtype:icmp
 
| Dies gibt an, zu welcher Klasse von Angriffen oder Ereignissen die Regel gehört. In diesem Fall ist es ein ICMP-Typ.
 
|-
 
| sid:1
 
| Dies ist die ID (Signatur-ID) der Regel. Sie dient dazu, die Regel eindeutig zu identifizieren. In diesem Fall ist die ID 1.
 
|}
 
 
 
'''alert http any any -> any any (msg: "Command Injection - Semicolon in POST DATA"; ;classtype:command-injection ; flow:established; content:"%3B"; nocase; http_client_body; sid:5;)'''
 
{| class="wikitable"
 
|-
 
! Schlüsselwort
 
! Beschreibung
 
|-
 
| alert
 
| Dieses Schlüsselwort gibt an, dass ein Alarm ausgelöst werden soll, wenn das Muster in der Regel erkannt wird. Ein Alarm kann eine Benachrichtigung an den Administrator oder eine andere Reaktion auf das erkannte Muster sein.
 
|-
 
| http
 
| Dies steht für das Hypertext Transfer Protocol, das für die Übertragung von Daten über das World Wide Web verwendet wird. Diese Regel überwacht den HTTP-Verkehr.
 
|-
 
| any
 
| Dieser Platzhalter steht für jedes mögliche Quell- oder Zielattribut. In diesem Fall bedeutet any any, dass sowohl der Quell- als auch der Ziel-IP-Adressbereich nicht eingeschränkt sind.
 
|-
 
| ->
 
| Dieser Pfeil zeigt die Richtung des Datenverkehrs an. In diesem Fall bedeutet any any -> any any, dass der Datenverkehr in beide Richtungen (hin und zurück) überwacht wird.
 
|-
 
| (msg: "Command Injection - Semicolon in POST DATA";)
 
| Dies ist eine optionale Nachricht, die dem Administrator mitteilt, warum der Alarm ausgelöst wurde. In diesem Fall lautet die Nachricht "Command Injection - Semicolon in POST DATA".
 
|-
 
| classtype:command-injection
 
| Dies gibt an, zu welcher Klasse von Angriffen oder Ereignissen die Regel gehört. In diesem Fall ist es ein Befehlseinjektionstyp.
 
|-
 
| flow:established
 
| Dieser Parameter gibt an, dass die Regel nur auf etablierten Verbindungen überprüft werden soll.
 
|-
 
| content:"%3B"
 
| Dies ist der Inhalt, auf den die Regel prüft. In diesem Fall wird nach dem Semicolon (%3B) im HTTP-Client-Body gesucht.
 
|-
 
| nocase
 
| Dieser Parameter gibt an, dass die Groß- und Kleinschreibung beim Vergleich des Inhalts ignoriert werden soll.
 
|-
 
| sid:5
 
| Dies ist die ID (Signatur-ID) der Regel. Sie dient dazu, die Regel eindeutig zu identifizieren. In diesem Fall ist die ID 5.
 
|}
 
 
 
drop http any any -> any any (msg: "Possible SQL Injection attack (Contains singlequote POST DATA)"; flow:established,to_server; content:"%27"; nocase; http_client_body; sid:4;)
 

Aktuelle Version vom 30. April 2026, 10:40 Uhr

Eigene Regeln

  • Eigene Regeln kommen nach /usr/local/etc/suricata/rules
  • Mann kann sie nicht auf der Weboberfläche erstellen
  • Am besten man macht eine eigene Datei mit der Endung *.rules
  • Man findet sie auf der Weboberfläche dann direkt unter
  • Indrusion Detection
    • Administration
      • Rules
  • Sie müssen aber noch aktiviert werden.
  • Wenn man den IPS Modus ausgewählt hat, kann man zwischen Alert und Drop auswählen.
  • Drop funktioniert momentan nur bei einem Interface.

Untersuchungen mit Chrome

Beispiele

  • cat own.rules
# ICMP: einfacher Ping/Traceroute (schneller Funktionstest)
# Test: ping -c 1 1.1.1.1
alert icmp any any -> any any (msg:"ICMP Test"; classtype:misc-activity; sid:9000041;)

# HTTP: mögliches Command-Injection-Merkmal (Semikolon) in POST-Body
# Test: curl -X POST http://www.it2XX.int/host.php --data-urlencode "fqdn=example.com;ls" -d "submit=Auflösen"
alert http any any -> any any (msg:"Command Injection - Semicolon in POST DATA"; classtype:web-application-attack; flow:established; content:"%3B"; nocase; http_client_body; sid:9000002;)

# HTTP: mögliches SQLi-Merkmal (einfaches Hochkomma) in POST-Body
# Test: curl -X POST http://www.it2XX.int/sql-classic.php --data-urlencode "username=' OR '1'='1' --"
alert http any any -> any any (msg:"Possible SQL Injection (singlequote in POST)"; classtype:web-application-attack; flow:established,to_server; content:"%27"; nocase; http_client_body; sid:9000003;)

# DNS: Policy - verbietet "google" in DNS-Queries
# Test: host google.de
drop dns any any -> any any (msg:"Kein Googlen"; dns.query; content:"google"; nocase; classtype:policy-violation; sid:9000043;)

# DoS: viele identische kurze HTTP-GETs (LOIC-ähnlich)
# Test: ab -n 1000 -c 500 http://www.it2XX.int/
drop tcp any any -> any any (msg:"ET DOS Terse HTTP GET Likely LOIC"; flow:to_server,established; dsize:18; content:"GET / HTTP/1.1|0d 0a 0d 0a|"; depth:18; threshold:type both,track by_dst,count 500,seconds 60; classtype:own-dos; sid:9000054; rev:2;)

# Scan: TCP SYN-Sweep (viele SYN in kurzer Zeit)
# Test: nmap -sS -p1-100 10.88.2XX.21
drop tcp any any -> any any (msg:"OWN SCAN TCP SYN sweep"; flow:stateless,to_server; flags:S; detection_filter:track by_src,count 20,seconds 5; classtype:attempted-recon; sid:9000060; rev:1;)

# Scan: TCP NULL-Scan (keine Flags gesetzt)
# Test: nmap -sN -p1-100 10.88.2XX.21
drop tcp any any -> any any (msg:"OWN SCAN TCP NULL scan"; flow:stateless,to_server; flags:0; detection_filter:track by_src,count 5,seconds 10; classtype:attempted-recon; sid:9000061; rev:1;)

# Scan: UDP-Sweep mit leerer Payload
# Test: nmap -sU --min-rate=1000 10.88.2XX.21
drop udp any any -> any any (msg:"OWN SCAN UDP sweep (empty probes)"; flow:to_server; dsize:0; detection_filter:track by_src,count 15,seconds 10; classtype:attempted-recon; sid:9000064; rev:1;)

# Scan: ICMP Ping-Sweep (viele Echo-Requests)
# Test: nmap -sn 10.88.2XX.0/24
drop icmp any any -> any any (msg:"OWN SCAN ICMP ping sweep"; itype:8; detection_filter:track by_src,count 10,seconds 5; classtype:attempted-recon; sid:9000065; rev:1;)

# Brute Force SSH
# Test: hydra -l kit -P bad-passwords ssh://10.88.2XX.21
drop tcp any any -> any 22 (msg:"OWN SSH Brute Force"; flow:to_server,stateless; flags:S; detection_filter:track by_src,count 10,seconds 60; classtype:attempted-recon; sid:9000066; rev:1;)

# HTTP: sqlmap User-Agent erkennen
# Test: sqlmap -u "http://www.it2XX.int/sql-classic.php" --data "username=test"
alert http any any -> any any (msg:"SQLmap Scanner detected"; http.user_agent; content:"sqlmap"; nocase; classtype:web-application-attack; sid:9000070; rev:1;)

# HTTP: curl User-Agent erkennen
# Test: curl http://www.it2XX.int/host.php
alert http any any -> any any (msg:"curl User-Agent detected"; http.user_agent; content:"curl"; nocase; classtype:policy-violation; sid:9000071; rev:1;)

# ICMP Tunnel - großes Payload
# Test: ping -c 5 -s 500 10.88.2XX.21
alert icmp any any -> any any (msg:"OWN ICMP Large Payload - possible tunnel"; itype:8; dsize:>200; classtype:misc-attack; sid:9000072; rev:1;)

# TCP SYN Flood
# Test: hping3 -S --flood -V -p 80 10.88.2XX.21
alert tcp any any -> any any (msg:"TCP SYN Flood Potential Detected"; flags:S; threshold: type both, track by_dst, count 150, seconds 10; classtype:misc-attack; sid:9000073; rev:1;)

# SSH Connection Attempt
# Test: ssh root@10.88.2XX.21
alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; content:"SSH"; nocase; classtype:misc-activity; sid:9000074; rev:1;)
Schlüsselwort Beschreibung
alert / drop Aktion bei Regelübereinstimmung. alert erzeugt einen Logeintrag, drop verwirft das Paket zusätzlich.
icmp / tcp / udp / http / dns Protokoll das überwacht wird.
any Platzhalter für beliebige IP-Adresse oder Port.
-> Richtung des Datenverkehrs (Quelle → Ziel).
msg:"..." Beschreibung die im Alert-Log erscheint.
classtype:... Kategorie des Angriffs (z.B. web-application-attack, attempted-recon, policy-violation).
sid:... Eindeutige Signatur-ID der Regel. Eigene Regeln beginnen ab 9000000.
flow:... Verbindungsstatus (z.B. established, to_server, stateless).
content:"..." Zeichenkette nach der im Paketinhalt gesucht wird.
nocase Groß-/Kleinschreibung wird beim content-Vergleich ignoriert.
http_client_body Sucht den content nur im HTTP-Request-Body.
http.user_agent Sucht den content im HTTP User-Agent Header.
dns.query Sucht den content im DNS-Query-Namen.
flags:... TCP-Flags (z.B. S=SYN, F=FIN, FPU=XMAS).
itype:... ICMP-Typ (z.B. 8 = Echo Request).
dsize:... Größe der Nutzdaten in Bytes.
detection_filter:... Schwellenwert für Häufigkeit bevor die Regel auslöst.
threshold:... Begrenzung wie oft ein Alert pro Zeitraum ausgelöst wird.
rev:... Revisionsnummer der Regel.