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 tale attacco, uno dei passaggi è quello di ottenere il controllo del contatore del programma, che identifica l'istruzione successiva da eseguire. Il flusso del programma può quindi essere reindirizzato al codice inserito. Il codice intrusivo della macchina è chiamato payload dell'attacco ed è l'elemento comunemente indicato dal termine shellcode. Questo metodo è stato spesso utilizzato per concedere a un utente malintenzionato l'accesso aprendo una shell dei comandi 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 in genere possono evitare questa minaccia definendo rigorosamente i dati di input e rifiutando valori errati. Se deselezionato, i valori che richiedono più spazio di archiviazione rispetto alla memoria assegnata per quel valore potrebbero essere accettati. Ciò provoca un problema di sicurezza chiamato overflow del buffer, 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à di destinazione, tuttavia, è possibile ottenere lo stesso risultato inserendo il codice per un linguaggio di script interpretato, come PERL, o bytecode per una macchina virtuale, come JAVA. Il codice può essere impiantato prima, durante o dopo il dirottamento del contatore del programma. Pertanto, il codice intrusivo può essere contenuto in un file sulla macchina target o trasmesso su una connessione di rete in tempo reale.
Gli exploit di shellcode locali sono progettati per fornire a un utente malintenzionato il controllo di 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 di successo concederebbe temporaneamente lo stesso livello di accesso all'intruso.
I processi in esecuzione su una macchina remota possono essere sfruttati utilizzando i protocolli di rete standard per comunicare con il computer di destinazione. Shellcode Connect-back indica al computer 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 sul computer remoto. Il metodo di connessione è ampiamente utilizzato, poiché i firewall raramente vietano le connessioni in uscita.