Log delle intrusioni su MySQL grazie al target ulogd di iptables
by admin on Apr.25, 2009, under Hacking, Sicurezza
Il target -j LOG di iptables/netfilter salva un sommario testuale degli headers dei pacchetti intercettati nel sottosistema di syslog che va poi normalmente a finire in /var/log/messages, o comunque dove sia stato configurato.
Ma come fare, nel caso volessimo registrare l’intero pacchetto, o una porzione particolare di esso, per esami futuri?
Contrariamente a quanto avviene con altri moduli firewall, vi è bisogno di un programma in userspace, nella fattispecie ulogd, per poter trattare i pacchetti ottenuti.
In Debian o Ubuntu, “ulogd” è un software appartenente alla categoria Universe, quindi non ufficilmente supportato. Non ci si deve meravigliare se su Ubuntu 8.10, il package presenta un bug:
Starting netfilter userspace log daemon: Wed Apr 22 23:56:12 2009 <7> ulogd.c:462 load_plugins: ‘/usr/lib/ulogd/ulogd_MYSQL.so’: /usr/lib/ulogd/ulogd_MYSQL.so: undefined symbol: mysql_fetch_field
facilmente aggirabile con un workaround:
# env LD_PRELOAD=/usr/lib/libmysqlclient.so.15 invoke-rc.d ulogd start
Starting netfilter userspace log daemon: ulogd.
Ulogd si connette al device netlink del kernel Linux e legge i messaggi provenienti da netfilter e accodati nel trarget ULOG di iptables.
La cosa funziona così:
Viene registrato con iptables un target di nome ULOG
se il target viene raggiunto, il pacchetto viene inoltrato utilizzando netlink multicast, quindi viene restituito immediatamente NF_CONTINUE
Le impostazioni di ciò vanno fatte editando /etc/ulogd.conf.
Per esempio, si commenti la linea relativa al plugin /usr/lib/ulogd/ulogd_LOGEMU.so, e si decommenti la linea relativa invece al plugin /usr/lib/ulogd/ulogd_PCAP.so. Quindi si faccia ripartire il daemon ulogd con:
# /etc/rc.d/init.d/ulogd start
/var/log/ulogd.log dovrebbe ora contenere alcune linee che indicano che il daemon è avviato, e /var/log/ulogd.pcap dovrebbe essere lungo 24 bytes;
Per fare un semplice test potremmo richiedere al kernel di registrare tutti i pacchetti destinati a 99.99.99.99, e poi provocare la registrazione di una qualche attività:
# iptables -I OUTPUT -d 99.99.99.99 -j ULOG –ulog-nlgroup 1 –ulog-cprange 20
nlgroup è il parametro del kernel per “netlink group”.Usando differenti numeri di nlgroup numbers, è possibile avviare più di una istanza di ulogd, ciascuna in ascolto su un differente netlink group, e quindi inviare i pacchetti a differenti files.
Il parametro cprange specifica quanti bytes catturare di ciascun pacchetto, in modo simile al parametro snap length (-s) di tcpdump. Anziché catturare l’intero pacchetto possiamo catturarne i primi 20 bytes.
Se si prova a effettuare un ping verso l’host prescelto:
# ping -c 5 99.99.99.99
PING 99.99.99.99 (99.99.99.99) 56(84) bytes of data.
— 99.99.99.99 ping statistics —
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
# tcpdump -r /var/log/ulog/pcap.log -qtnp
reading from file /var/log/ulog/pcap.log, link-type RAW (Raw IP)
IP 192.168.1.10 > 99.99.99.99: [|icmp]
IP 192.168.1.10 > 99.99.99.99: [|icmp]
IP 192.168.1.10 > 99.99.99.99: [|icmp]
IP 192.168.1.10 > 99.99.99.99: [|icmp]
IP 192.168.1.10 > 99.99.99.99: [|icmp]
I 20 bytes dell’intestazione IP sono stati sufficienti a riconoscere correttamente indirizzo IP sorgente e protocollo.
Per osservare i pacchetti via via che arrivano, basta dare semplicemente in una shell:
# tail -f /var/log/ulog/ulogd.pcap | tcpdump -r - -qtnp
Per attivare la registrazione su database MySQL occorre invece decommentare la linea seguente in /etc/ulogd.conf:
plugin=”/usr/lib/ulogd/ulogd_MYSQL.so”
Una volta fatto, occorre cercare nel file le linee seguenti e modificarle in linea con le impostazioni dell’utenza mysql che andremo a creare, se non intendiamo utilizzare una utenza già presente:
[MYSQL]
table=”ulog”
pass=”cambiami”
user=”ulog”
db=”ulogd”
host=”localhost”
occorre poi (per allinearsi alle impostazioni mostrate) creare un database chiamato ulogd e un utente ulog con relativa password e dargli i permessi per operare sul database appena creato.
la struttura del database va costruita a partire dal seguente SQL:
CREATE TABLE ulog (id INT UNSIGNED AUTO_INCREMENT UNIQUE,
raw_mac VARCHAR(80),
oob_time_sec INT UNSIGNED,
oob_time_usec INT UNSIGNED,
oob_prefix VARCHAR(32),
oob_mark INT UNSIGNED,
oob_in VARCHAR(32),
oob_out VARCHAR(32),
ip_saddr INT UNSIGNED,
ip_daddr INT UNSIGNED,
ip_protocol TINYINT UNSIGNED,
ip_tos TINYINT UNSIGNED,
ip_ttl TINYINT UNSIGNED,
ip_totlen SMALLINT UNSIGNED,
ip_ihl TINYINT UNSIGNED,
ip_csum SMALLINT UNSIGNED,
ip_id SMALLINT UNSIGNED,
ip_fragoff SMALLINT UNSIGNED,
tcp_sport SMALLINT UNSIGNED,
tcp_dport SMALLINT UNSIGNED,
tcp_seq INT UNSIGNED,
tcp_ackseq INT UNSIGNED,
tcp_window SMALLINT UNSIGNED,
tcp_urg TINYINT,
tcp_urgp SMALLINT UNSIGNED,
tcp_ack TINYINT,
tcp_psh TINYINT,
tcp_rst TINYINT,
tcp_syn TINYINT,
tcp_fin TINYINT,
udp_sport SMALLINT UNSIGNED,
udp_dport SMALLINT UNSIGNED,
udp_len SMALLINT UNSIGNED,
icmp_type TINYINT UNSIGNED,
icmp_code TINYINT UNSIGNED,
icmp_echoid SMALLINT UNSIGNED,
icmp_echoseq SMALLINT UNSIGNED,
icmp_gateway INT UNSIGNED,
icmp_fragmtu SMALLINT UNSIGNED,
pwsniff_user VARCHAR(30),
pwsniff_pass VARCHAR(30),
ahesp_spi INT UNSIGNED,
KEY index_id (id)
);
Ora è possibile riavviare ulogd per iniziare la raccolta dei pacchetti catturati tramite MySQL.
# invoke-rc.d ulogd restart
Se volessimo catturare alcuni dei tentativi di intrusione o semplice scansione che più comunemente mirano ai sistemi Windows per poter assegnare la palma del più sfigato, basterebbe impostare questo filtro, magari dopo aver posto un qualche wrapper ingannevole in ascolto sulle porte specifiche:
# FILTER=”-i eth0″; MSPORTS=”–destination-ports 139,445″ PREFIX=”ms_intrusion”
# iptables -A INPUT $FILTER -m mutiport -p tcp $MSPORTS -j ULOG –ulog-nlgroup 1 –ulog-prefix $PREFIX


