Shellcode: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
template citazione; rinomina/fix nomi parametri; converto template cite xxx -> cita xxx; fix formato data |
||
Riga 13:
Lo shellcode remoto è invece utilizzato quando un attaccante vuole sfruttare una vulnerabilità di un processo di un’altra macchina sulla rete locale o su una rete intranet. Se lo Shellcode è eseguito correttamente, questo ritorna il controllo della macchina bersaglio attraverso la rete. Gli shellcode remoti utilizzano normalmente lo standard socket [[TCP/IP]] per consentire l’accesso alla shell della macchina bersaglio.
Si possono classificare ulteriori distinzioni in base al metodo con cui la connessione viene stabilita. Se è lo shellcode stesso che può stabilire la connessione, questo viene chiamato "reverse shell" o ''connect-back'' shellcode, perché lo shellcode in esecuzione sulla macchina remota si connette alla macchina dell’attaccante. Se invece l’attaccante ha bisogno di creare la connessione, lo shellcode viene chiamato ''bindshell'', in quanto lo shellcode esegue il bind su una determinata porta, che verrà utilizzata dall’attaccante per connettersi e controllare la macchina bersaglio. Un terzo tipo di shellcode, meno comune, è il ''socket-reuse'' shellcode. Questo tipo di shellcode è di solito utilizzato quando un exploit stabilisce una connessione al processo vulnerabile che non viene chiusa prima che lo shellcode venga eseguito.
Lo shellcode può riutilizzare questa connessione per comunicare con l’attaccante. Il Socket re-use shellcode è di più complessa realizzazione, perché lo shellcode deve identificare quale connessione può utilizzare (fra le possibili aperte sulla macchina).<ref>{{
|
|
Si può utilizzare un [[firewall]] per identificare le connessioni in uscita effettuate da una connect-back shellcode e il tentativo di connessione in ingresso da parte di una bindshell.
Il firewall può fornire una protezione aggiuntiva contro un attaccante, anche se il sistema è vulnerabile, impedendo in maniera preventiva di ottenere l’accesso alla shell creata dall'esecuzione dello shellcode. Questa è una delle ragioni del perché a volte viene utilizzata una socket re-using shellcode, perché non creando nuove connessioni risulta più difficile da identificare e bloccare.
Riga 21:
=== Downloand and execute ===
Download and execute è un tipo di shellcode remoto che effettua un [[download]] ed esegue una qualche forma di malware sul sistema bersaglio. Questo tipo di shellcode non crea una shell, ma istruisce la macchina di scaricare un certo file eseguibile dalla rete, salvarlo su disco e poi eseguirlo. Al giorno d’oggi, è comunemente utilizzato negli attacchi [[drive-by download]], quando una vittima visita un sito malevolo che cerca di avviare un download e di eseguire una shellcode per installare software sulla macchina vittima. Una variazione di questo tipo di shellcode è “download and loads a library”.<ref>{{
|
|
|
|
=== Staged ===
Riga 38:
Questo tipo di shellcode è simile al egg-hunt, ma effettua una ricerca di più piccoli blocchi (eggs) ricombinandoli in uno più grande (omelette) che viene eseguito successivamente.
Tale tecnica viene utilizzata quando un attaccante è limitato, per qualche ragione, all'inserimento di piccoli blocchi di dati all'interno del processo.<ref>{{
|
|
== Strategia di esecuzione di uno Shellcode ==
Riga 80:
=== Shellcode alfanumerici e stampabili ===
In certe circostanze, un processo bersaglio potrebbe filtrare tutti i bytes provenienti dallo shellcode inserito che non sono stampabili o alfanumerici. In queste condizioni, il range di istruzioni che possono essere utilizzate per scrivere uno shellcode diventano molto limitate. Una soluzione a questo problema è stata pubblicata da Rix in [[Phrack]] 57<ref>{{
|
|
|
|
=== Shellcode a prova di caratteri Unicode ===
Molti programmi moderni utilizzano la codifica di stringhe in formato Unicode per permettere l’internalizzazione del testo. Spesso questi programmi convertono le stringhe ASCII in ingresso prima di processarle. Le stringhe Unicode codificate in [[UTF-16]] utilizzano due byte per decodificare ogni carattere ( o quattro bytes per alcuni caratteri speciali). Quando una stringa [[ASCII]] viene convertita in UTF-16, un byte a zero viene inserito dopo ogni bytes della stringa originale. Obscu ha mostrato in [[Phrack]] 61<ref>{{
|
|
== Piattaforme ==
Molti shellcode sono scritti in codice macchina a causa del basso livello a cui la vulnerabilità consente di effettuare un expolit e dare all'attaccante l’accesso al processo. Lo shellcode è spesso creato per attaccare una specifica combinazione di processore, sistema operativo e service pack, che vengono chiamati comunemente piattaforma. Per alcuni exploit, a causa dei vincoli imposti dal processo bersaglio, è necessario creare uno shellcode specifico. In ogni caso non è sempre possibile per uno shellocde lavorare per exploit multipli, service pack, sistemi operativi e eventualmente processori.<ref>{{
|
|
|