In iptables, le liste di regole conosciute come catene vengono elaborate in modo sequenziale. Tra queste, tre catene principali sono universalmente presenti, con altre come NAT che possono essere supportate a seconda delle capacità del sistema.
Catena di Input: Utilizzata per gestire il comportamento delle connessioni in entrata.
Catena di Forward: Impiegata per gestire le connessioni in entrata che non sono destinate al sistema locale. Questo è tipico per i dispositivi che fungono da router, dove i dati ricevuti devono essere inoltrati a un'altra destinazione. Questa catena è rilevante principalmente quando il sistema è coinvolto nel routing, NATing o attività simili.
Catena di Output: Dedicata alla regolazione delle connessioni in uscita.
Queste catene garantiscono l'elaborazione ordinata del traffico di rete, consentendo la specifica di regole dettagliate che governano il flusso di dati dentro, attraverso e fuori da un sistema.
# Delete all rulesiptables-F# List all rulesiptables-Liptables-S# Block IP addresses & portsiptables-IINPUT-sip1,ip2,ip3-jDROPiptables-IINPUT-ptcp--dport443-jDROPiptables-IINPUT-sip1,ip2-ptcp--dport443-jDROP# String based drop## Strings are case sensitive (pretty easy to bypass if you want to check an SQLi for example)iptables-IINPUT-ptcp--dport<port_listening>-mstring--algobm--string'<payload>'-jDROPiptables-IOUTPUT-ptcp--sport<port_listening>-mstring--algobm--string'CTF{'-jDROP## You can also check for the hex, base64 and double base64 of the expected CTF flag chars# Drop every input port except someiptables-PINPUTDROP# Default to dropiptables-IINPUT-ptcp--dport8000-jACCEPTiptables-IINPUT-ptcp--dport443-jACCEPT# Persist Iptables## Debian/Ubuntu:apt-getinstalliptables-persistentiptables-save>/etc/iptables/rules.v4ip6tables-save>/etc/iptables/rules.v6iptables-restore</etc/iptables/rules.v4##RHEL/CentOS:iptables-save>/etc/sysconfig/iptablesip6tables-save>/etc/sysconfig/ip6tablesiptables-restore</etc/sysconfig/iptables
Suricata
Installazione e Configurazione
# Install details from: https://suricata.readthedocs.io/en/suricata-6.0.0/install.html#install-binary-packages# Ubuntuadd-apt-repositoryppa:oisf/suricata-stableapt-getupdateapt-getinstallsuricata# Debianecho"deb http://http.debian.net/debian buster-backports main"> \/etc/apt/sources.list.d/backports.listapt-getupdateapt-getinstallsuricata-tbuster-backports# CentOSyuminstallepel-releaseyuminstallsuricata# Get rulessuricata-updatesuricata-updatelist-sources#List sources of the rulessuricata-updateenable-sourceet/open#Add et/open rulesetssuricata-update## To use the dowloaded rules update the following line in /etc/suricata/suricata.yamldefault-rule-path:/var/lib/suricata/rulesrule-files:-suricata.rules# Run## Add rules in /etc/suricata/rules/suricata.rulessystemctlsuricatastartsuricata-c/etc/suricata/suricata.yaml-ieth0# Reload rulessuricatasc-cruleset-reload-nonblocking## or set the follogin in /etc/suricata/suricata.yamldetect-engine:-rule-reload:true# Validate suricata configsuricata-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:yesflows:all## Forward all packages to the queue where suricata can act as IPSiptables-IINPUT-jNFQUEUEiptables-IOUTPUT-jNFQUEUE## Start suricata in IPS modesuricata-c/etc/suricata/suricata.yaml-q0### or modify the service config file as:systemctleditsuricata.service[Service]ExecStart=ExecStart=/usr/bin/suricata-c/etc/suricata/suricata.yaml--pidfile/run/suricata.pid-q0-vvvType=simplesystemctldaemon-reload
Definizioni delle Regole
Dal documento: Una regola/firma consiste nei seguenti elementi:
L'azione, determina cosa succede quando la firma corrisponde.
L'intestazione, definisce il protocollo, gli indirizzi IP, le porte e la direzione della regola.
Le opzioni della regola, definiscono i dettagli specifici della regola.
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;)
Le azioni valide sono
alert - genera un avviso
pass - interrompe l'ispezione ulteriore del pacchetto
drop - scarta il pacchetto e genera un avviso
reject - invia un errore RST/ICMP non raggiungibile al mittente del pacchetto corrispondente.
rejectsrc - stesso di reject
rejectdst - invia un pacchetto di errore RST/ICMP al destinatario del pacchetto corrispondente.
rejectboth - invia pacchetti di errore RST/ICMP a entrambe le parti della conversazione.
Protocolli
tcp (per traffico tcp)
udp
icmp
ip (ip sta per ‘tutti’ o ‘qualsiasi’)
protocolli layer7: http, ftp, tls, smb, dns, ssh... (di più nella docs)
Indirizzi di Origine e Destinazione
Supporta intervalli IP, negazioni e un elenco di indirizzi:
Esempio
Significato
! 1.1.1.1
Ogni indirizzo IP tranne 1.1.1.1
![1.1.1.1, 1.1.1.2]
Ogni indirizzo IP tranne 1.1.1.1 e 1.1.1.2
$HOME_NET
La tua impostazione di HOME_NET in yaml
[$EXTERNAL_NET, !$HOME_NET]
EXTERNAL_NET e non HOME_NET
[10.0.0.0/24, !10.0.0.5]
10.0.0.0/24 tranne 10.0.0.5
Porte di Origine e Destinazione
Supporta intervalli di porte, negazioni e elenchi di porte
Esempio
Significato
any
qualsiasi indirizzo
[80, 81, 82]
porta 80, 81 e 82
[80: 82]
Intervallo da 80 a 82
[1024: ]
Da 1024 fino al numero di porta più alto
!80
Ogni porta tranne 80
[80:100,!99]
Intervallo da 80 a 100 ma 99 escluso
[1:80,![2,4]]
Intervallo da 1-80, eccetto le porte 2 e 4
Direzione
È possibile indicare la direzione della regola di comunicazione applicata:
Ci sono centinaia di opzioni disponibili in Suricata per cercare il pacchetto specifico che stai cercando, qui verrà menzionato se viene trovato qualcosa di interessante. Controlla la documentazioneper ulteriori informazioni!
# Meta Keywordsmsg:"description"; #Set a description to the rulesid:123#Set a unique ID to the rulerev:1#Rule revision numberconfigclassification:not-suspicious,NotSuspiciousTraffic,3#Classifyreference:url,www.info.com#Referencepriority:1; #Set a prioritymetadata:keyvalue,keyvalue; #Extra metadata# Filter by geolocationgeoip:src,RU;# ICMP type & Codeitype:<10;icode:0# Filter by stringcontent:"something"content:|616161|#Hex: AAAcontent:"http|3A|//"#Mix string and hexcontent:"abc"; nocase; #Case insensitiverejecttcpanyany ->anyany (msg: "php-rce"; content:"eval"; nocase; metadata:tagphp-rce; sid:101; rev:1;)# Replaces string## Content and replace string must have the same lengthcontent:"abc"; replace:"def"alerttcpanyany ->anyany (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 regexpcre:"/<regex>/opts"pcre:"/NICK .*USA.*[0-9]{3,}/i"droptcpanyany ->anyany (msg:"regex"; pcre:"/CTF\{[\w]{3}/i"; sid:10001;)# Other examples## Drop by portdroptcpanyany ->any8000 (msg:"8000 port"; sid:1000;)