Trinux - Copertina - PHP |
Articolo
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.
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.
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.
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
Trinux - Copertina - PHP |