Che cos’è un codice shell?

Shellcode è una sequenza di codice macchina, o istruzioni eseguibili, che viene iniettata nella memoria di un computer con l’intento di assumere il controllo di un programma in esecuzione. In un tale attacco, uno dei passaggi è quello di ottenere il controllo del contatore di programma, che identifica l’istruzione successiva da eseguire. Il flusso del programma può quindi essere reindirizzato al codice inserito. Il codice macchina intrusivo è chiamato payload dell’attacco ed è l’elemento comunemente indicato con il termine shellcode. Questo metodo è stato spesso utilizzato per concedere l’accesso a un utente malintenzionato aprendo una shell di comando del sistema operativo, quindi gli attacchi di iniezione di codice in generale sono diventati noti come shellcode.

La vulnerabilità sfruttata in genere riguarda il modo in cui un programma assegna la memoria, controlla la validità dei dati di input e gestisce gli errori di memoria. Gli sviluppatori di software di solito possono evitare questa minaccia definendo rigorosamente i dati di input e rifiutando i valori impropri. Se non è selezionato, i valori che richiedono più spazio di archiviazione rispetto alla memoria assegnata per quel valore potrebbero essere accettati. Ciò causa una violazione della sicurezza chiamata buffer overflow, in cui parte dei dati viene scritta in posizioni di memoria adiacenti allo spazio assegnato al valore. Se manipolata con cura, questa anomalia può consentire l’introduzione di codice intrusivo.

Shellcode è normalmente scritto in un linguaggio di programmazione con accesso al sistema di basso livello come assembly, C o C++. A seconda della vulnerabilità mirata, tuttavia, lo stesso risultato potrebbe essere ottenuto inserendo codice per un linguaggio di scripting interpretato, come PERL, o bytecode per una macchina virtuale, come JAVA. Il codice può essere impiantato prima, durante o dopo il dirottamento del contatore di programmi. Pertanto, il codice intrusivo può essere contenuto in un file sulla macchina di destinazione o trasmesso su una connessione di rete in tempo reale.

Gli exploit dello shellcode locale sono progettati per dare a un utente malintenzionato il controllo su una macchina a cui ha accesso fisico. Un obiettivo in questo caso potrebbe essere quello di creare un account con privilegi di amministratore, ad esempio. Allo stesso modo, se un processo in esecuzione ha un livello di privilegi elevato, un exploit riuscito concederebbe temporaneamente lo stesso livello di accesso all’intruso.

I processi in esecuzione su una macchina remota possono essere sfruttati utilizzando protocolli di rete standard per comunicare con il computer di destinazione. Il codice shell Connect-back indica alla macchina di destinazione di avviare una connessione al computer dell’intruso. Se l’intruso avvia la connessione, il codice viene chiamato bindshell, poiché tenta di assumere il controllo di una connessione di rete chiamata porta sulla macchina remota. Il metodo di connessione è più diffuso, poiché i firewall raramente vietano le connessioni in uscita.