find open proxy

Un poco annoiato, ieri ho deciso di annotarmi qualche proxy aperto che potesse servire a vari scopi... :P

nmap

H pensato sarebbe stato un ottimo playground per python e xml (xml.minidom,xml.etree,BeautifulSoup) ma sono rimasto scottato dalle mie risorse; il Vps sul quale sto lavorando è un Lxc (Linux container) openvz con 512Mb di ram.

Dato che le liste di indirizzi sono /16, il file in formato xml  è grosso più di 20Mb, python si mangiava tutta la memoria all'atto di importare il file.

Certo, avrei potuto cominciare studiando la maniera di ottimizzare il codice e prende chunk di dati, ma dato che volevo produrre qualcosa di funzionante prima di lasciare un'altra idea a metà, ho rifatto tutto in 3 linee di bash senza nemmeno utilizzare un decimo della memoria che python utilizza, solo a leggere il file...

Con questo non voglio dire nulla, se non che le mie conoscenze di python sono così basse che non mi permettono nemmeno di implementare 3 righe di script senza perdere 3 giorni; pazienza, sarà per la prossima idea (tanto quelle non finiscono mai :P ).

Quindi, passando al topic, ho creato un piccolo script che facesse al caso mio.

Le dipendenze sono:

Nulla di più.

Il codice lo trovate nel gist linkato.

Lo script è triviale, ma vale la pena annotare qualche switch e comando utilizzato in modo da risparmiare tempo la prossima volta che ci si trova ad affrontare certi problemi.

Per prima cosa il comando nmap utilizzato:

nmap --script http-open-py.roxnse  -Pn -P0 -n --unprivileged  -T4 $1.0.0/16  -p 8080 -oX ${1}.0.0

lo script http-open-proxy.nse è utilizzato per testare la porta 8080 (nel codice ho trovato riferimenti a 4 porte, ma non ho avuto tempo di capire se aggiungendo porte allo switch -p vengono scansionate anch'esse) e cercare di scremare i target possibili.

altro switch degno di nota è --unprivileged, dal man page:

--unprivileged (Assume that the user lacks raw socket privileges)

This option is the opposite of --privileged. It tells Nmap to treat the user as lacking network raw socket and sniffing privileges. This is useful for testing, debugging, or when the raw network functionality of your operating system is somehow broken. The NMAP_UNPRIVILEGED environment variable may be set as an equivalent alternative to --unprivileged.

Questo flag è stato indispensabile affinché nmap funzionasse a causa di due concorrenti cause:

In ultima analisi, ho creato un output in formato xml; perché, direte? Dato che stavo tentando di parsare con pyhton e lo scan era già a metà, non me la sono sentita di cambiare :P

Magari cambierò il formato in "greppable" con -oG, ma non credo diminirebbe la grandezza del log..

Passando al test del proxy vero e proprio, il protagonista è netcat (il mio tool favorito):

echo -e "GET http://google.com HTTP/1.0\n\host: google.com\n" | nc $i 8080 | grep 'Location: http://www.google.'

questa stringa invia semplicemente due righe all'ip /porta in questione tentando di fare una GET della pagina di google.com.

Se il server è configurato per fare da proxy, instraderà la richiesta passando indietro la pagina di google classica se ci si connette via http:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.it/?gfe_rd=cr&ei=_5H4U7jVB6rD8gee1oDgCA
Content-Length: 258
Date: Sat, 23 Aug 2014 13:07:11 GMT
Server: GFE/2.0
Alternate-Protocol: 80:quic

<HTML>
 <HEAD>
  <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
  <TITLE>302 Moved</TITLE>
 </HEAD>
 <BODY> 
  <H1>302 Moved</H1> 
   The document has moved <A HREF="http://www.google.it/?gfe_rd=cr&amp;ei=_5H4U7jVB6rD8gee1oDgCA">here</A>. 
 </BODY>
</HTML>

Ho messo l'accento sul grep, per considerare (ci ho messo un po a capire) che google rimanda alla homepage del paese di provenienza dell'ip e, dato che stiamo scansionando reti grandi, gli ip potrebbero arrivare da chissà dove, restituendo, come nel caso sopra, l Location a google.it invece che la richiesta (google.com).

Poco altro c'è da dire sullo script, se non che manda una mail all'interessato al termine dello scan, che dura parecchie ore, con in allegato la lista di ip, se almeno un ip è risultato positivo dopo il check incrociato.

Fonti:

it-ovid

nmap.org

unix.com

Happy Hacking & stay TuNeD