# [ot] antiproxy

## flocchini

vorrei che al web server sulla mia gentoo-box (ma mi piacerebbe una soluzione implementabile per qualsiasi servizio) non si potesse connettere nessuno che usa openproxy (analogx ecc, roba da lamerozzi quindi ) Ho cercato in lungo e in largo ma non ho trovato nulla, avete qualche idea da suggerirmi? Una cosa del tipo: cura la porta $numeroporta: chiunque si connette li' e ha aperta la porta $numeroportatipicadelproxy lo metti in iptables. Tnx  :Wink: 

----------

## .:chrome:.

come vuoi fare te non è possibile. il motivo è semplice

spero tu sappia che se io navigo appoggiandomi ad un qualunque gateway, quello che si vede come indirizzo sorgente non è quello della mia macchina, ma quello del gateway.

ora... se questo gateway ha un proxy (supponiamo squid) io mi collego da una porta non privilegiata della mia macchina alla sua 3128. da qui in poi è il proxy che naviga al posto mio, ma la connessione di partenza non parte dalla 3128, ma da una porta non privilegiata qualuqnue, ed è diretto alla porta 80 della tua macchina.

in sostanza, è impossibile distinguere una connessione diretta da una attraverso proxy basandosi sulle porte.

ti consiglio di leggerti qualche appuntino sulle reti.

----------

## Kernel78

Lungi da me contraddire k.gothmog ma ...

se il problema (dico se perchè non sono sicuro di aver capito) è di voler escludere dalla visione del proprio sito tutti coloro che passano per un proxy pubblico allora si può fare (con un certo margine di incertezza).

Se io metto in piedi un proxy pubblico questo deve avere una porta aperta accessibile pubblicamente (normalmente questi proxy hanno sempre aperta la 8080 a prescindere dal server che gira ma non ci metterei la mano sul fuoco) quindi se io controllo se chi si collega a me ha questa porta aperta posso presumere con un certo mergine di sicurezza (non il 100%) che si tratti di un proxy e quindi dropparlo.

Mi rimetto cmq al giudizio di chi ne sa più di me.

----------

## .:chrome:.

evidentemente non sono riuscito a spiegarmi

situazione 1: navigo dal mio pc normalmente

la mia connessione va da A (porta non privilegiata) a B (porta 80)

situazione 2: navigo attraverso un proxy (P)

la connessione va da A (porta non privilegiata) e P (porta 8080, per restare sul tuo esempio)

poi il proxy naviga per conto mio, e la sua connessione andrà da P (porta non privilegiata) a B (porta 80)

B non sa distinguere tra me e il proxy

te lo dico in un altro modo: la porta a cui tu fai riferimento è quella di "ingresso" delle connessioni, se mi si concede il termine, e non quella di "uscita"

la porta di "uscita" è sempre e comunque una porta non privilegiata, e non quella del proxy

----------

## Kernel78

 *k.gothmog wrote:*   

> evidentemente non sono riuscito a spiegarmi
> 
> 

 

evidentemente nemmeno io   :Wink: 

 *k.gothmog wrote:*   

> 
> 
> situazione 2: navigo attraverso un proxy (P)
> 
> la connessione va da A (porta non privilegiata) e P (porta 8080, per restare sul tuo esempio)
> ...

 

Mi pare di aver capito che il problema sia di impedire a chi usa proxy pubblici di accedere al sito quindi analizzo solo la seconda situazione che hai proposto.

Che il proxy navighi per conto mio l'ho capito, che la connessione da parte sua inizi da una porta non privilegiata l'ho capito ma se si tratta di un proxy pubblico dovrà avere una porta privilegiata aperta (altrimenti verrebbe a mancare la sua qualifica di "pubblico") e questo si può controllare facilmente (nmap va benissimo).

Se si riscontra tale porta aperta significa (con buona probabilità) che sulla macchina connessa al sito sia in esecuzione un proxy e quindi si può dropparlo.

----------

## .:chrome:.

tu ti sei spiegato benissimo, ma sai come funzionano le connessioni TCP? sembrerebbe di no

```
chrome@morgoth ~ $ netstat -ant

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 10.0.0.7:38613          66.102.11.104:80        ESTABLISHED
```

la porta a cui ti riferisci tu è quella a cui IO devo fare una CONNECT per avere aperta la connessione. una volta aperta, e una volta che il proxy naviga al posto mio, non è da quella porta che partirà la SUA connessione, ma da una qualunque porta superiore alla 1024 (ovviamente non quella del servizio)

ora... trattandosi di una connessione originata da una porta qualunque, che cambia pure dinamicamente da una connessione all'altra, come puoi le connessioni di uscita a seconda che siano originate da un proxy o meno?

dal proxy che sto usando partirà una connessione da una porta CASUALE (come la mia: 10.0.0.7:38613) verso l'indirizzo destinazione e ripeto che partirà da una porta casuale, non da quella del servizio, perché quella porta esiste solo per accettare direttive di tipo CONNECT, e non per mantenere connessioni ESTABLISHED.

----------

## Kernel78

Ok, a leggere la tua risposta ci sono due possibilità:

1) non mi sono spiegato bene

2) non mi hai capito bene

Io non ho detto che iptables possa filtrare direttamente una connessione che atteraversa un proxy visto che (come continui a far notare anche tu) non si può sapere da quale porta del proxy arrivi la connessione.

Quello che dico io è che qualsiasi proxy pubblico deve avere una porta aperta sulla quale accetta le connessioni da ridirigere verso altri siti, la stragrande maggioranza di proxy pubblici usa la porta 80, la 8080 o la 3128.

Se quando si riceve una connessione si controlla se l'ip da cui arriva ha una di queste porte aperte (anche prima ho fatto l'esempio di nmap per scoprirlo) si ha buona probabilità di rendersi conto se si tratta di un proxy e in questo caso di droppare ciò che arriva da li.

Ovviamente in questo modo non si ha cmq il 100% di sicurezza di beccare tutti (e solo) i proxy ma a mio parere ha un ottimo margine di certezza.

----------

## federico

Non ho voglia ora di accendere il cervello cosi' tanto da fornire una soluzione completa, ma immagino che questi openproxy abbiamo una porta di entrata sulla quale l'utente si connette, e abbiamo anche delle porte di default. Contattando questa porta di default a questo indirizzo, dovrebbe apparire in linea di massima un simpatico banner che ti dice "ciao sei entrato in un proxy".

Se tu tutti gli utenti che si connettono a te, prima li scanni per vedere se hanno un banner noto, e poi li lasci connettere, tagli fuori tutti quelli che utilizzano questi sistemi configurati in default e ti rimane il proble,ma di una nikkia che si e' andata a modificare i sorgenti dell'openproxy a mano.

----------

## .:chrome:.

allora scusa. non avevo capito che intendevi questo.

tuttavia mi sembra comunque impraticambile:

1 - all'arrivo di ogni connessione devi far partire una routine che fa i controlli che dici, ma come?

2 - potresti farlo con snortsam, ma un'operazione del genere è pesantissima per i processori

ammesso e non concesso di riuscirci:

3 - su quali porte fai lo scan? devi sapere a priori queli porte si usano. se ti capita una porta che non hai elencato sei già fregato

4 - fai un nmap? per uno stealth scan senza connect ci vogliono ALMENO 3 minuti per ogni host. ti sembra verosimile che un server web risponda dopo un tempo variabile tra i 3 e i 20 minuti?

5 - hai idea di quale razza di casino avresti nel firewall o nell'hosts.deny della tua macchina?

----------

## mserri

 *k.gothmog wrote:*   

> tu ti sei spiegato benissimo, ma sai come funzionano le connessioni TCP? sembrerebbe di no
> 
> ```
> chrome@morgoth ~ $ netstat -ant
> 
> ...

 

Ehmm... forse è meglio metterla così:

Il Client si collega al Proxy Pubblico sulla porta 8080. Il proxy riceve richiesta di collegarsi ad altro Server web.

Il Server web riceve una connessione dall'indirizzo del Proxy; OK, il server web verifica se è un proxy, cercando di aprire sull'indirizzo che ha effettuato la connessione le porte tipiche dei proxy (8080; 3128). Se riesce ad aprirle con buona probabilità si tratta di proxy, se non ci riesce rimane nel dubbio.

M.

----------

## federico

 *k.gothmog wrote:*   

> 
> 
> 1 - all'arrivo di ogni connessione devi far partire una routine che fa i controlli che dici, ma come?
> 
> 

 

Un modulo di apache penso, che se non esiste lo si scrive..

 *Quote:*   

> 
> 
> 3 - su quali porte fai lo scan? devi sapere a priori queli porte si usano. se ti capita una porta che non hai elencato sei già fregato
> 
> 

 

Su quelle di default, come ho specificato nel post precedende non è fattibile con tempi macchina ragionevoli lavorare su parametri non standard.

 *Quote:*   

> 5 - hai idea di quale razza di casino avresti nel firewall o nell'hosts.deny della tua macchina?

 

A me sinceramente mi pare facile...

Questa idea non è farina del mio sacco comunque, è gia' utilizzata in altri ambiti, ci sono server irc ad esempio che non ti lasciano connettere se trovano openproxy sul tuo ip, in particolare prima di lasciarti connettere guardano se hai aperta la 1080, la 8080 e la 3128, e poi valutano se farti accedere o meno, e penso che loro non utilizzino ne' piu' ne' meno che il sistema che sopra ho descritto.

----------

## Kernel78

Ho provato a controllare su un proxy pubblico a caso

```

nmap -sT 203.30.184.5 -p 80,3128,8080

Starting nmap 3.83.DC13 ( http://www.insecure.org/nmap/ ) at 2005-10-23 18:48 CEST

Interesting ports on 203.30.184.5:

PORT     STATE  SERVICE

80/tcp   open   http

3128/tcp closed squid-http

8080/tcp open   http-proxy

Nmap finished: 1 IP address (1 host up) scanned in 2.972 seconds

```

3 secondi non mi sembrano tanti ...

----------

## .:chrome:.

fai uno scan del genere su una mia macchina (a parte che le mie macchine sono invisibili a quel tipo di scan) e finisci in una banlist. poi te la vedrai tu con il tuo provider.

e questa non è solo una mia politica, ma una politica adottata da molti amministratori.

se leggi bene io ho detto che lo scan deve essere di tipo stealth e senza connessione. sono gli unici che puoi fare senza incorrere nelle ire degli amministratori.

@federico:

non mi risulta che esista un modulo di apache che fa una cosa simile.

ad ogni modo resta il problema del come. io continuo a sostenere che secondo me non è una cosa banale, almeno ad occhio.

oltretutto scusatemi... ma perché mai uno dovrebbe adottare una politica simile?

----------

## flocchini

so come avvengono le connessioni e forse mi sono spiegato male, cmq  federico ha capito esattamente cio' che mi serve, in pratica vorrei che succedesse come quando ti connetti ad alcuni server irc che sondano alla ricerca di openproxy non ti va bene? Cambi server. Punto), soltanto volevo sapere se esisteva un qsa di "standalone" e quindi non legato ad un servizio irc (che non rientra nel mio caso). Il perche' di una ricerca del genere? Esempio stupido, si potrebbe applicare ad un server opennap, banno l'ip di qno e quello rientra passando da un proxy aggirando il divieto. Gli scan sarebbero effettuati su 3 o 4 porte standard, sono i lamerozzi da tener fuori, mica chissachi. L'idea e' partita rilevando un troyan sul computer di un amico, che apriva un proxy proprio sulla 3128. Grazie comunque a chi e' intervenuto finora, anche se ciascuno con il proprio stile as usual   :Wink: 

----------

## .:chrome:.

uhm... temo di non avere capito niente  :Wink: 

a questo punto temo quindi di essere anche andato fuori strada. chiedo scusa se ho fatto casino  :Confused: 

----------

## flocchini

hai solo pensato una cosa piu' complicata, ma il concetto di base e' quello  :Wink:  tu pincopallino che ti connetti a me, hai la porta $numeroporta aperta? ok, me ne accorgo e finisci in deny. Ora la domanda e': come posso effettuare un'operazione del genere su ogni client che si connette alla mia macchina senza andare a ravanare nel codice/moduli del servizio al quale gli host remoti tentano di connettersi ? (ho l'influenza, perdonatemi ripetizioni o inesattezze ma in quanto malato questo e' l'unico momento che posso concedere alle pippe mentali come questa  :Laughing:  )

----------

## comio

 *federico wrote:*   

> 
> 
> Questa idea non è farina del mio sacco comunque, è gia' utilizzata in altri ambiti, ci sono server irc ad esempio che non ti lasciano connettere se trovano openproxy sul tuo ip, in particolare prima di lasciarti connettere guardano se hai aperta la 1080, la 8080 e la 3128, e poi valutano se farti accedere o meno, e penso che loro non utilizzino ne' piu' ne' meno che il sistema che sopra ho descritto.

 

Secondo me fanno di più... Cioè tentano di aprire una pagina/canale standard tramite l'utente (che potrebbe essere un openproxy) senza autenticarsi (open non per nulla). Se questo è un openproxy, otterranno l'informazione, quindi la connessione utente può essere chiusa (piuttosto che mettere in deny l'ip). Se non è un open proxy avremo o una pagina di errore per mancata autenticazione oppure semplicemente trovare le porte chiuse.

Il problema è che con http... la pagina standard può essere modificata, quindi si potrebbe fare un trucco, tipo metterci un numero casuale dentro e vedere se si riesce a leggere. Con altri protocolli più stringenti si può tentare di fare una specie di "mirror".

devo smettere di lavorare 25 ore (che periodo di meeee...) quindi perdonate le castronate.

ciao

PS.: il mio logo che fine ha fatto? Mi collego poco ultimamente... e vedo che succedono cose strane al forum!

----------

## kaosone

io lo farei con php, sono poche righe di codice e dovrebbe essere discretamente veloce

salvi tutti i proxy in un file che con cron vai a ripescare, metti dei ban temporanei e li cancelli dalla lista

----------

## federico

 *kaosone wrote:*   

> io lo farei con php, sono poche righe di codice e dovrebbe essere discretamente veloce
> 
> salvi tutti i proxy in un file che con cron vai a ripescare, metti dei ban temporanei e li cancelli dalla lista

 

Veramente il problema non è bannare i proxy quanto identificarli. Se parti dal presupposto di sapere quali sono i proxy da bannare, stiamo perdendo di vista il problema.

----------

## kaosone

era sottointeso il metodo che gia' avete indivuato: controllare le porte

non ci sono altri modi utilizzabili himo, se non confrontare il remote address reale con quello che invia il browser, ma sui proxy anonimi non funziona

----------

## flocchini

 *kaosone wrote:*   

> era sottointeso il metodo che gia' avete indivuato: controllare le porte

 

alt. ok il metodo lo sapevo pure io prima di aprire il thread   :Laughing: ... controllo se ha aperta la porta $numerporta. Il problema e': come dire alla mia macchina (e non solo ad apache, lo scopo e' avere un metodo indipendente dal servizio) "controlla che chiunque si connetta nn abbia la tal porta aperta"? Il numero delle porte e' noto, e' la reazione alla connessione che non so come attivare. 

Avevo in mente un qsa del tipo "iptables -A INPUT -i eth0 -m tcp --dport $portadelserviziodamonitorare --esegui $script"

e in $script ci metto 2 righe di nmap sull'ip in connessione e un if che in caso di porta aperta lo sbatte in deny. Da dove recupero pero' l'ip sorgente? Come faccio a far lanciare un comando esterno ad una regola di iptables?    :Idea: 

----------

## kaosone

come ho scritto prima, con php e cron e' un lavoro da 10 minuti

----------

## makoomba

 *flocchini wrote:*   

> Avevo in mente un qsa del tipo "iptables -A INPUT -i eth0 -m tcp --dport $portadelserviziodamonitorare --esegui $script"
> 
> e in $script ci metto 2 righe di nmap sull'ip in connessione e un if che in caso di porta aperta lo sbatte in deny

 

una cosa del genere non è possibile e se fosse possibile non sarebbe praticabile.

ciò che otterresti è che per ogni pacchetto in ingresso con destinazione  $portadelserviziodamonitorare sarebbe invocato lo script.

risultato: load average 10000, flood, aumento dell'entropia dell'universo e alterazione del continuum spazio-tempo.

certo, potresti limitare il controllo solo alle connessioni NEW, ma la sostanza non cambia.

Per come la vedo io, l'unica soluzione sarebbe quella di utilizzare il target QUEUE di iptables, demandando quindi il filtraggio ad un'applicazione userspace.

Un pò come snort-inline, che, tra peraltro, è l'unico software di mia conoscenza a far uso del suddetto target.

----------

## flocchini

all'idea di farlo solo cn le connessioni cn stato NEW ci avevo pensato, ma davvero e' impraticabile a livello prestazionale? Ora do un'occhiata a QUEUE e snort inline

@kaosone: mi rispiegheresti un po' piu' esaustivamente come pensi di farlo in php?

----------

## KingOfSka

se usi php nel tuo webserver, puoi usare tutte pagine php, che includono una paginetta che tramite la funzione fsock si collega alla porta 8080 del visitatore, se riesce a collegarsi allora fai morire lo script con "die" altrimenti si prosegue...

potrebbe andare ?

----------

## kaosone

in ogni pagina in cima metti un include di un pezzo in php che faccia questo:

crea una sessione

controlla indirizzo reale con quello spedito dal browser, se diversi scrive in un file l'indirizzo

in caso contrario apre una connessione verso le porte note (con socket) e se rispondono scrive in un file l'indirizzo

dice alla sessione di non verificare piu' questo client

a questo punto interviene cron che controlla il file , banna temporaneamente chi deve bannare e svuota il file   :Wink: 

----------

## makoomba

 *flocchini wrote:*   

> all'idea di farlo solo cn le connessioni cn stato NEW ci avevo pensato, ma davvero e' impraticabile a livello prestazionale? Ora do un'occhiata a QUEUE e snort inline

 

l'inefficienza è insita nel metodo, anche utilizzando un'applicazione ad hoc.

per non parlare di simpatici effetti collaterali quali syn floods, dos, o pacchetti spoofed con ip del pentagono ....

/me che ti suggerisce caldamente di cercare soluzioni alternative.

edit:

a questo proposito, la maggior parte degli open proxy non è anonima, quindi puoi filtrare già a livello apache con setenvif + mod_access controllando l'header HTTP_VIA.

per gli altri, posto che se uno utilizza un proxy anonimo, al 99% l'ha beccato da una lista trovata su google, potresti fare uno script che preleva dal web gli ip e li trasforma in altrettante DROP per iptables.

----------

## flocchini

ah ok le soluzioni con php, pero' funziona solo con apache...Io avevo in mente un qsa scritto ad hoc proprio per poterlo applicare a qualsiasi servizio, ma a questo punto viste la vostra scarsa fiducia desisto anche io.... mi fido  :Wink: 

----------

## gutter

Moved from Italian to Off Topic.

----------

