--- /dev/null
+alert dns any any -> any any (dns.query; datarep:dns_string, >, 200, load dns_string.rep, type string; sid:1;)
--- /dev/null
+Z29vZ2xlLmNvbQ==,255
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ files:
+ - src/datasets.c
+
+args:
+ - -k none
+
+checks:
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 1
--- /dev/null
+#!/usr/bin/env python
+from scapy.all import *
+
+pkts = []
+
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='255.255.255.255', src='192.168.0.1')/UDP(dport=53)/DNS(rd=1, qd=DNSQR(qname='google.com'))
+
+wrpcap('input.pcap', pkts)
--- /dev/null
+alert dns any any -> any any (dns.query; to_md5; datarep:dns_md5, >, 200, load dns_md5.rep, type md5; sid:1;)
+alert dns any any -> any any (dns.query; to_sha256; datarep:dns_sha256, >, 200, load dns_sha256.rep, type sha256; sid:2;)
+alert dns any any -> any any (dns.query; datarep:dns_string, >, 200, load dns_string.rep, type string; sid:3;)
--- /dev/null
+1d5920f4b44b27a802bd77c4f0536f5a,255
+5ababd603b22780302dd8d83498e5172,100
--- /dev/null
+d4c9d9027326271a89ce51fcaf328ed673f17be33469ff979e8ab8dd501e664f,255
+a379a6f6eeafb9a55e378c118034e2751e682fab9f2d30ab13d2125586ce1947,100
--- /dev/null
+Z29vZ2xlLmNvbQ==,255
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ - HAVE_NSS
+ files:
+ - src/datasets.c
+
+args:
+ - -k none
+
+checks:
+ - filter:
+ count: 3
+ match:
+ event_type: alert
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 1
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 2
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 3
--- /dev/null
+#!/usr/bin/env python
+from scapy.all import *
+
+pkts = []
+
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='255.255.255.255', src='192.168.0.1')/UDP(dport=53)/DNS(rd=1, qd=DNSQR(qname='google.com'))
+
+wrpcap('input.pcap', pkts)
--- /dev/null
+#!/bin/sh
+
+exec cmp datasets.csv ${TEST_DIR}/expected/datasets.csv
--- /dev/null
+Y3VybC83LjQzLjA=
--- /dev/null
+alert http any any -> any any (http.user_agent; dataset:set,ua-seen,type string,save datasets.csv; sid:1;)
--- /dev/null
+requires:
+ files:
+ - src/datasets.c
+
+command: |
+ ${SRCDIR}/src/suricata --set classification-file="${SRCDIR}/classification.config" \
+ --set reference-config-file="${SRCDIR}/reference.config" -l ${OUTPUT_DIR} \
+ -c "${SRCDIR}/suricata.yaml" -r ${TEST_DIR}/input.pcap -S ${TEST_DIR}/test.rules \
+ --data-dir="${OUTPUT_DIR}"
--- /dev/null
+Y3VybC83LjQzLjA=
--- /dev/null
+alert http any any -> any any (http.user_agent; dataset:isset,ua-seen,type string,load datasets.csv; sid:1;)
+alert http any any -> any any (http.user_agent; dataset:isnotset,ua-seen,type string,load datasets.csv; sid:2;)
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ files:
+ - src/datasets.c
+
+args:
+ - -k none
+
+checks:
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 1
+ - filter:
+ count: 0
+ match:
+ event_type: alert
+ alert.signature_id: 2
--- /dev/null
+alert dns any any -> any any (dns.query; dataset:set,dns-seen, type string; sid:1;)
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ files:
+ - src/datasets.c
+
+args:
+ - -k none
+
+checks:
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 1
--- /dev/null
+#!/usr/bin/env python
+from scapy.all import *
+
+pkts = []
+
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=1, rd=1, qd=DNSQR(qname='example.com'))
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=2, rd=1, qd=DNSQR(qname='example.com'))
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=3, rd=1, qd=DNSQR(qname='example.com'))
+
+wrpcap('input.pcap', pkts)
--- /dev/null
+alert dns any any -> any any (dns.query; dataset:set,dns-seen, type string; sid:1;)
+alert http any any -> any any (http.host; dataset:set,dns-seen, type string; sid:2;)
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ files:
+ - src/datasets.c
+
+args:
+ - -k none
+
+checks:
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ - filter:
+ count: 1
+ match:
+ event_type: alert
+ alert.signature_id: 1
+ - filter:
+ count: 0
+ match:
+ event_type: alert
+ alert.signature_id: 0
--- /dev/null
+#!/usr/bin/env python
+from scapy.all import *
+
+pkts = []
+
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=1, rd=1, qd=DNSQR(qname='example.com'))
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/TCP(sport=6666, dport=80, flags='P''A')/"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
+
+wrpcap('input.pcap', pkts)
--- /dev/null
+#!/bin/sh
+
+exec cmp ${OUTPUT_DIR}/state.csv ${TEST_DIR}/expected/state.csv
--- /dev/null
+ZXhhbXBsZS5jb20=
--- /dev/null
+alert dns any any -> any any (dns.query; dataset:set,dns-seen, type string, state state.csv; sid:1;)
--- /dev/null
+requires:
+ features:
+ - HAVE_LIBJANSSON
+ files:
+ - src/datasets.c
+
+command: |
+ ${SRCDIR}/src/suricata --set classification-file="${SRCDIR}/classification.config" \
+ --set reference-config-file="${SRCDIR}/reference.config" -l ${OUTPUT_DIR} \
+ -c "${SRCDIR}/suricata.yaml" -r ${TEST_DIR}/input.pcap -S ${TEST_DIR}/test.rules \
+ --data-dir="${OUTPUT_DIR}"
--- /dev/null
+#!/usr/bin/env python
+from scapy.all import *
+
+pkts = []
+
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=1, rd=1, qd=DNSQR(qname='example.com'))
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=2, rd=1, qd=DNSQR(qname='example.com'))
+pkts += Ether(dst='ff:ff:ff:ff:ff:ff', src='00:01:02:03:04:05')/ \
+ Dot1Q(vlan=6)/ \
+ IP(dst='1.2.3.4', src='5.6.7.8')/UDP(dport=53)/DNS(id=3, rd=1, qd=DNSQR(qname='example.com'))
+
+wrpcap('input.pcap', pkts)