[precedente] Trinux - Copertina - PHP [successivo]

Articolo


Allarme anti intrusione

Introduzione

Io chatto spesso su IRCnet, e così facendo ho scoperto che ci sono un sacco di furbacchioni (o sarebbe meglio dire LAMER?) che con programmini automatici ti sondano alcune porte tipiche alla ricerca di backdoors.

Sfumata la moda dei nuke (ormai anche win98 pare abbastanza refrattario a questo tipo di attacchi DoS), ora ci sono un sacco di trojan che sotto windows permettono a persone smaliziate di introdursi nel computer di ignare vittime quando queste ultime sono connesse a internet.

I pił noti trojan di questo tipo si chiamano Back Orifice e Netbus, ma ce ne sono altri e inoltre pare che lo stesso Wingate si comporti allo stesso modo. In pratica questi trojan sono come dei demoni che ascoltano le connessioni in arrivo su una certa porta e quando interpellati permettono all'invasore di fare cose molto antipatiche, come leggere o scrivere files sul disco rigido, oppure inviare le password utilizzate dal sistema (anche quella di connessione al provider!) etc. Fortunatamente noi linuxari siamo immuni a questi inconvenienti (almeno per ora). :)

Ma come fanno questi programmini ad arrivare sulla macchina della vittima? Beh, esistono tools in grado di inglobare i trojan all'interno di altre applicazioni dall'aspetto molto innocente. Quando queste applicazioni vengono scaricate da internet e messe in esecuzione, "staccano" l'ospite parassita e lo insediano nella parte del sistema operativo che viene caricata automaticamente al boot. E così si apre la falla.

Gli antipatici intrusori scannano la rete alla ricerca di macchine che abbiano aperta una certa porta stabilita, e quando ne trovano uno gli si scagliano addosso. Le porte tipiche sono la 31337 per il Back Orifice, la 12345 per il Netbus, la 1080 per Wingate. Ho poi riscontrato tentativi di connessione alla porta 20034 ma non so bene a cosa si riferisca.

Teoria dell'accoppiata inetd-tcpd

Fatta questa introduzione, vi propongo un metodo semplice semplice per scoprite quando qualcuno vi sta sondando alla ricerca di questi trojan. Il mio metodo si basa sull'uso di tcpd, un wrapper utilissimo che lavora in coppia con il superdemone inetd.

Il meccanismo è questo: inetd ascolta una serie di porte impostate in /etc/inetd.conf e quando qualcuno cerca di connettersi a queste porte, logga l'evento via syslogd (di solito in /var/log/messages) e cede il controllo della porta ad un opportuno demone. Tutto questo succede normalmente quando avviene una connessione telnet, ftp etc.

La maggior parte delle distribuzioni configura inetd in modo che invece di chiamare direttamente il demone giusto, passi prima per il wrapper tcpd, il quale si occupa di decidere se la connessione deve essere autorizzata o no (ma può fare tante altre cose!) in base all'IP di provenienza. I files chiave per tcpd sono /etc/hosts.allow e /etc/hosts.deny.

Se tcpd decide che la connessione è autorizzata, allora cede il controllo della porta ad un processo che sta sulla sua linea di comando. Tale processo avrà la porta connessa ai normali stream di input e output (se la connessione è tramite protocollo tcp).

Vediamo un esempio:

leggendo la riga dedicata al telnet in /etc/inetd.conf vediamo:


telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd

ovvero, inetd ascolta le connessioni alla porta telnet (numero 23, definita in /etc/services) con protocollo tcp, e quando se ne verifica una, allora lancia il comando /usr/sbin/tcpd in.telnetd con UID di root, associandogli la porta in questione sugli stream stdin e stdout, e senza aspettare il risultato (nowait) si mette ad ascoltare di nuovo. In pratica inetd è solo un passacarte che è utile per non tenere caricati in RAM i demoni che vengono interpellati soltanto raramente.

A questo punto viene chiamato tcpd, il quale analizza la richiesta di connessione e decide se autorizzarla o meno... se la autorizza allora cede il controllo a /sbin/in.telnetd facendogli ereditare il controllo della porta 23.

Apriamo le porte!

Ora che abbiamo capito come funziona, costruiamoci un semplice demone basato su uno script bash, quindi editiamo il file /usr/sbin/in.intruderdetector e mettiamoci dentro questo testo:


#!/bin/sh
echo
echo "IntruderDetector v1.0 by Simone \"pioppo\" Piunno <pioppo@4net.it>"
echo "Your connection attempt was logged."
echo

rendiamo eseguibile il file con chmod 755 /usr/sbin/in.intruderdetector poi rendiamolo disponibile a inetd. Per prima cosa definiamo le porte che ci interessano in /etc/services aggiungendo le righe:


socks             1080/tcp
backorifice       31337/tcp
netbus            12345/tcp
backdoor-unknown  20034/tcp

poi aggiungiamo le seguenti righe in /etc/inetd.conf


socks            stream  tcp  nowait  nobody  /usr/sbin/tcpd in.intruderdetector
backorifice      stream  tcp  nowait  nobody  /usr/sbin/tcpd in.intruderdetector
netbus           stream  tcp  nowait  nobody  /usr/sbin/tcpd in.intruderdetector
backdoor-unknown stream  tcp  nowait  nobody  /usr/sbin/tcpd in.intruderdetector
ora attiviamo il tutto facendo rileggere la configurazione a inetd con il comando killall -HUP inetd. Possiamo subito provare ad eseguire un telnet sulle porte attivate:

[root@abulafia pioppo]$ telnet localhost 31337
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

IntruderDetector v1.0 by Simone "pioppo" Piunno 
Your connection attempt was logged.

Connection closed by foreign host.
[root@abulafia pioppo]$

A scanso di equivoci per chi pensa che aprire le porte sia come abbassare il livello di sicurezza del sistema, metto in evidenza che il demone da noi costruito viene eseguito con l'UID di nobody, e quindi non può fare assolutamente nulla di dannoso al nostro sistema.

Ora il nostro malcapitato invasore viene avvisato di quello che sta succedendo, ma noi invece abbiamo soltanto i log... e stare tutto il giorno a leggerli non è il massimo della comodità... in ogni caso vedremo qualcosa del tipo (la prima e la terza riga le vedrete soltanto se avete installato il demone tcplog):


[root@abulafia root]# tail -n 4 /var/log/messages
Jun  8 18:08:42 abulafia tcplog: auth connection attempt from localhost:1178
Jun  8 18:08:42 abulafia identd[1453]: from: 127.0.0.1 ( localhost ) for: 1177, 31337
Jun  8 18:08:42 abulafia tcplog: backorifice connection attempt from root@localhost:1177
Jun  8 18:08:42 abulafia identd[1453]: Successful lookup: 1177 , 31337 : root.root
[root@abulafia root]#

identd è il demone di autenticazione che viene eseguito automaticamente da inetd ad ogni tentativo di connessione. Se c'è un suo gemello sulla macchina chiamante, allora riuscirà a dirci anche il login dell'utente che ha provato a connettersi.

Suona l'allarme!

Per rendere il tutto un po' più interessante ora faremo in modo che il nostro tcpd ci suoni qualcosa quando c'è un tentativo di intrusione. Per far questo sfruttiamo le sue potenzialità ed inseriamo in testa a /etc/hosts.allow questa riga:

in.intruderdetector : ALL : spawn (/usr/bin/play /usr/share/enlightenment/themes/ShinyMetal/snd/estart.wav)

la quale dice a tcpd che il demone in.intruderdetector è autorizzato ad essere eseguito da ogni IP di origine, e che prima di eseguirlo deve essere lanciato in background il processo tra parentesi. Ho scelto estart.wav di enlightenment per il suo carattere molto tetro e cattivo, adatto alla situazione, ma non ci starebbe niente male una bella sirena tipo polizia :)

Ora potete provare anche voi: connettetevi alle vostre porte 1080, 31337, 12345, 20034 usando telnet e ascoltate cosa succede.

Come ultimo esercizio, collegatevi a irc, entrate sul canale #italia e..... buon ascolto!


di Simone "Pioppo" Piunno,
Ferrara Linux User Group


[precedente] Trinux - Copertina - PHP [successivo]