Detectando proxies anónimos

Hace ya algún tiempo tuvimos un incidente donde los atacantes estaban utilizando un servidor de la organización afectada como un proxy anónimo, aprovechando una configuración errónea del servidor. Durante el mismo incidente, nos vino a la cabeza la pregunta, ¿Qué usan para detectar que este servidor estaba mal configurado y tiene capacidad de proxy?. La pregunta no iba por la senda de averiguar una técnica muy compleja, sino ver qué podían estar utilizando y añadir dentro de nuestros análisis preventivos uno que compruebe que los servidores no tengan ningún servicio actuando como proxy anónimo, por error. Antes de ponernos a hacer un “pythonito” que haga justo eso, me puse a bucear un poco en la red.

Lo primero que encontré buscando sobre este asunto fue una entrada en un blog cuyo título era “FHTTP + shodan” (Ver I y II)

En esta entrada publican un script sencillo que va cogiendo como fuente Shodan y busca servidores que estén configurados como proxy anónimo. Está bien la idea, pero lo que necesitamos es algo que no dependa de Shodan y de los puertos que decide barrer.

Después de un rato buceando, hice una paradinha, y me dije, seguro que esto ya lo ha hecho alguien para nmap y es bastante probable que lo usen. Y realizando una búsqueda encontré http-open-proxy, ¡Bingo!

Veamos la descripción del plugin:

“The script attempts to connect to www.google.com through the proxy and checks for a valid HTTP response code. Valid HTTP response codes are 200, 301, and 302. If the target is an open proxy, this script causes the target to retrieve a web page from www.google.com”.

Para que el script se active tiene que encontrar alguno de los siguientes puertos:

portrule = shortport.port_or_service({8123,3128,8000,8080},{'polipo','squid-http','http-proxy'})

El script tiene dos parámetros muy útiles:

-- @args proxy.url Url that will be requested to the proxy
-- @args proxy.pattern Pattern that will be searched inside the request results

Un ejemplo de uso de los parámetros sería:

root@saw:~# nmap --script="http-open-proxy" --script-args="proxy.url=www.debian.org,proxy.pattern=
       The Universal Operating System" www.dominio.es -PN

Lo único que estamos diciéndole es que a través de la ip de www.dominio.es se intente conectar a www.debian.org y el patrón que debe buscar es “The Universal Operating System”.

El script por defecto viene con una serie de tests para comprobar si realmente se trata de un proxy o no, que podéis ver al editarlo. Su utilización es tan sencilla como:

root@saw:~# nmap --script="http-open-proxy" www.dominio-conocido.es -p8123,3128,8000,8080 -PN

Starting Nmap 5.21 ( http://nmap.org ) at 2013-03-01 19:47 MSK
Nmap scan report for www.dominio-conocido.es (z.z.z.z)
Host is up (0.024s latency).
PORT STATE SERVICE
3128/tcp closed squid-http
8000/tcp closed http-alt
8080/tcp closed http-proxy
8123/tcp closed polipo

Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds

Ahora lo que vamos a hacer es proporcionarle al script una dirección que es un proxy recogido de un listado público:


root@saw:~# nmap --script="http-open-proxy" x.x.x.x -p8123,8080,8000,3128 -PN -e venet0:0
Nmap scan report for x.x.x.x
Host is up (0.38s latency).
PORT STATE SERVICE
3128/tcp filtered squid-http
8000/tcp filtered http-alt
8080/tcp open http-proxy
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported: GET
8123/tcp filtered polipo

Nmap done: 1 IP address (1 host up) scanned in 11.00 seconds

Ahora probamos con el típico puerto del squid, 3128:


root@saw:~# nmap --script="http-open-proxy" y.y.y.y -p8123,8080,8000,3128 -PN

Starting Nmap 5.21 ( http://nmap.org ) at 2013-03-01 19:54 MSK
Stats: 0:00:01 elapsed; 0 hosts completed (0 up), 0 undergoing Host Discovery
Parallel DNS resolution of 1 host. Timing: About 0.00% done
NSE: Script Scanning completed.
Nmap scan report for y.y.y.y
Host is up (0.11s latency).
PORT STATE SERVICE
3128/tcp open squid-http
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported: GET HEAD
8000/tcp filtered http-alt
8080/tcp filtered http-proxy
8123/tcp filtered pólipo

Nmap done: 1 IP address (1 host up) scanned in 8.14 seconds

Este mecanismo u otro similar sería el que utilizarían los atacantes para descubrir proxy anónimos que no están públicos en el listado y realizar desde ahí sus fechorías. Nosotros ahora mismo podemos utilizar este mismo mecanismo para comprobar sobre nuestros clientes que ningún proxy tiene una configuración que permite su uso de manera anónima.

Comments

  1. buena entrada!

  2. Que grande lo de la paradinha :)

  3. Grande el que la inventó, que fue Didí, según Wikipedia :-)

  4. Vemos el proxy, lo de anonimo…. esto mira el X-Forwarded-For etc etc? :P

  5. Si, buena entrada !! y puedo garantizar que no fué un caso aislado. Recuerdo recientemente detectar un proxy furtivo ( rogue?? furtivo? ) al escanear con nmap todos los puertos y versión de servicio de todos los servidores… pillamos un proxy en el puerto 42343 si no recuerdo mal.

    Nmap tiene tantos scripts … con este nos apuntamos un nuevo control preventivo :-p

  6. @Javi como tú opino que no es un caso aislado. Además, me he encontrado con servidores web (en el típico 80/tcp) que por mala configuración también es posible utilizarlos como proxy.

  7. @Vicente el script lo que hace es conectarse al sitio que estás escaneando y si no le indicas ningún parámetro lanza tres tests que consiste en visitar tres páginas. Por ejemplo uno de los test es visitar google.com a través del equipo que estés analizando y espera en la respuesta que esté en la cabecera “server” la cadena “gws”. Si eso es así determina que el equipo permite navegar a través de él. Para esto prueba con los métodos GET, HEAD y CONNECT.

Trackbacks

  1. […] Hace ya algún tiempo tuvimos un incidente donde los atacantes estaban utilizando un servidor de la organización afectada como un proxy anónimo, aprovechando una configuración errónea del servidor. …  […]