Suricata & Iptables cheatsheet

Reading time: 7 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Iptables

Chains

В iptables списки правил, відомі як ланцюги, обробляються послідовно. Серед них три основні ланцюги є універсально присутніми, з додатковими, такими як NAT, які можуть підтримуватися в залежності від можливостей системи.

  • Input Chain: Використовується для управління поведінкою вхідних з'єднань.
  • Forward Chain: Використовується для обробки вхідних з'єднань, які не призначені для локальної системи. Це типово для пристроїв, що діють як маршрутизатори, де отримані дані призначені для пересилання в інше місце. Цей ланцюг є актуальним переважно тоді, коли система бере участь у маршрутизації, NAT-уванні або подібних діяльностях.
  • Output Chain: Призначений для регулювання вихідних з'єднань.

Ці ланцюги забезпечують впорядковану обробку мережевого трафіку, дозволяючи визначати детальні правила, що регулюють потік даних у систему, через неї та з неї.

bash
# Delete all rules
iptables -F

# List all rules
iptables -L
iptables -S

# Block IP addresses & ports
iptables -I INPUT -s ip1,ip2,ip3 -j DROP
iptables -I INPUT -p tcp --dport 443 -j DROP
iptables -I INPUT -s ip1,ip2 -p tcp --dport 443 -j DROP

# String based drop
## Strings are case sensitive (pretty easy to bypass if you want to check an SQLi for example)
iptables -I INPUT -p tcp --dport <port_listening> -m string --algo bm --string '<payload>' -j DROP
iptables -I OUTPUT -p tcp --sport <port_listening> -m string --algo bm --string 'CTF{' -j DROP
## You can also check for the hex, base64 and double base64 of the expected CTF flag chars

# Drop every input port except some
iptables -P INPUT DROP # Default to drop
iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT


# Persist Iptables
## Debian/Ubuntu:
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v4
##RHEL/CentOS:
iptables-save > /etc/sysconfig/iptables
ip6tables-save > /etc/sysconfig/ip6tables
iptables-restore < /etc/sysconfig/iptables

Suricata

Встановлення та налаштування

bash
# Install details from: https://suricata.readthedocs.io/en/suricata-6.0.0/install.html#install-binary-packages
# Ubuntu
add-apt-repository ppa:oisf/suricata-stable
apt-get update
apt-get install suricata

# Debian
echo "deb http://http.debian.net/debian buster-backports main" > \
/etc/apt/sources.list.d/backports.list
apt-get update
apt-get install suricata -t buster-backports

# CentOS
yum install epel-release
yum install suricata

# Get rules
suricata-update
suricata-update list-sources #List sources of the rules
suricata-update enable-source et/open #Add et/open rulesets
suricata-update
## To use the dowloaded rules update the following line in /etc/suricata/suricata.yaml
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules

# Run
## Add rules in /etc/suricata/rules/suricata.rules
systemctl suricata start
suricata -c /etc/suricata/suricata.yaml -i eth0


# Reload rules
suricatasc -c ruleset-reload-nonblocking
## or set the follogin in /etc/suricata/suricata.yaml
detect-engine:
- rule-reload: true

# Validate suricata config
suricata -T -c /etc/suricata/suricata.yaml -v

# Configure suricata as IPs
## Config drop to generate alerts
## Search for the following lines in /etc/suricata/suricata.yaml and remove comments:
- drop:
alerts: yes
flows: all

## Forward all packages to the queue where suricata can act as IPS
iptables -I INPUT -j NFQUEUE
iptables -I OUTPUT -j NFQUEUE

## Start suricata in IPS mode
suricata -c /etc/suricata/suricata.yaml  -q 0
### or modify the service config file as:
systemctl edit suricata.service

[Service]
ExecStart=
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0 -vvv
Type=simple

systemctl daemon-reload

Визначення правил

З документації: Правило/підпис складається з наступного:

  • дія, визначає, що відбувається, коли підпис збігається.
  • заголовок, визначає протокол, IP-адреси, порти та напрямок правила.
  • опції правила, визначають специфіку правила.
bash
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)

Дійсні дії

  • alert - згенерувати сповіщення
  • pass - зупинити подальшу перевірку пакета
  • drop - скинути пакет і згенерувати сповіщення
  • reject - надіслати RST/ICMP помилку недоступності відправнику відповідного пакета.
  • rejectsrc - те ж саме, що й reject
  • rejectdst - надіслати RST/ICMP помилку пакета отримувачу відповідного пакета.
  • rejectboth - надіслати RST/ICMP помилки пакетів обом сторонам розмови.

Протоколи

  • tcp (для tcp-трафіку)
  • udp
  • icmp
  • ip (ip означає 'всі' або 'будь-які')
  • протоколи рівня 7: http, ftp, tls, smb, dns, ssh... (більше в документації)

Джерела та адреси призначення

Підтримує діапазони IP, заперечення та список адрес:

ПрикладЗначення
! 1.1.1.1Кожна IP-адреса, крім 1.1.1.1
![1.1.1.1, 1.1.1.2]Кожна IP-адреса, крім 1.1.1.1 та 1.1.1.2
$HOME_NETВаша настройка HOME_NET у yaml
[$EXTERNAL_NET, !$HOME_NET]EXTERNAL_NET і не HOME_NET
[10.0.0.0/24, !10.0.0.5]10.0.0.0/24, за винятком 10.0.0.5

Порти джерела та призначення

Підтримує діапазони портів, заперечення та списки портів

ПрикладЗначення
anyбудь-яка адреса
[80, 81, 82]порт 80, 81 і 82
[80: 82]Діапазон від 80 до 82
[1024: ]Від 1024 до найвищого номера порту
!80Кожен порт, крім 80
[80:100,!99]Діапазон від 80 до 100, але 99 виключено
[1:80,![2,4]]Діапазон від 1 до 80, за винятком портів 2 і 4

Напрямок

Можна вказати напрямок правила комунікації, що застосовується:

source -> destination
source <> destination  (both directions)

Ключові слова

Є сотні варіантів доступних у Suricata для пошуку конкретного пакету, який ви шукаєте, тут буде зазначено, якщо знайдено щось цікаве. Перевірте документацію для отримання додаткової інформації!

bash
# Meta Keywords
msg: "description"; #Set a description to the rule
sid:123 #Set a unique ID to the rule
rev:1 #Rule revision number
config classification: not-suspicious,Not Suspicious Traffic,3 #Classify
reference: url, www.info.com #Reference
priority:1; #Set a priority
metadata: key value, key value; #Extra metadata

# Filter by geolocation
geoip: src,RU;

# ICMP type & Code
itype:<10;
icode:0

# Filter by string
content: "something"
content: |61 61 61| #Hex: AAA
content: "http|3A|//" #Mix string and hex
content: "abc"; nocase; #Case insensitive
reject tcp any any -> any any (msg: "php-rce"; content: "eval"; nocase; metadata: tag php-rce; sid:101; rev: 1;)

# Replaces string
## Content and replace string must have the same length
content:"abc"; replace: "def"
alert tcp any any -> any any (msg: "flag replace"; content: "CTF{a6st"; replace: "CTF{u798"; nocase; sid:100; rev: 1;)
## The replace works in both input and output packets
## But it only modifies the first match

# Filter by regex
pcre:"/<regex>/opts"
pcre:"/NICK .*USA.*[0-9]{3,}/i"
drop tcp any any -> any any (msg:"regex"; pcre:"/CTF\{[\w]{3}/i"; sid:10001;)

# Other examples
## Drop by port
drop tcp any any -> any 8000 (msg:"8000 port"; sid:1000;)

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks