the_open_door
café
ESEN
← Volver al índice

Internal port discovery via Squid

Squid es un proxy HTTP de caché. Cuando queda expuesto sin lista de control de acceso (la directiva http_access mal configurada), un atacante puede usarlo como pivote: las peticiones que le enviamos las reenvía él, de modo que llegan al destino desde la propia máquina del proxy. Eso permite alcanzar servicios que solo escuchan en localhost o en interfaces internas que desde fuera aparecen filtradas.

La consecuencia inmediata es un barrido de puertos a través del proxy. Apuntando curl al puerto del proxy (3128 por defecto) y pidiéndole repetidamente el mismo host en puertos distintos, el código de respuesta delata qué puertos internos están vivos:

curl -s -I --connect-timeout 2 -x http://<ip>:3128 http://<ip>:<port>

Un HTTP/1.1 200 (o cualquier respuesta del servicio) indica que el puerto responde por dentro; un fallo de conexión indica que está cerrado o filtrado. Automatizarlo con un bucle sobre los 65535 puertos revela toda la superficie interna en minutos:

for p in $(seq 1 65535); do
  code=$(curl -s -I --connect-timeout 2 -x http://<ip>:3128 "http://<ip>:$p" | head -1 | cut -d' ' -f2)
  [ "$code" = "200" ] && echo "[+] $p abierto"
done

Por qué pasa. El proxy está pensado para reenviar tráfico de clientes de confianza, pero sin ACL reenvía el de cualquiera. La diferencia frente a un escaneo directo con nmap es el punto de vista: nmap ve lo que está expuesto al exterior; el proxy ve lo que la máquina ve de sí misma, y eso suele incluir paneles de administración pensados para ser locales (un phpMyAdmin, un panel WAMP en 8080, una base de datos en 3306).

Matiz. No todo servicio habla HTTP, así que un 200 solo es fiable para puertos web; otros puertos pueden estar abiertos y no devolver 200. Conviene tratar el resultado como un indicio (puerto que acepta conexión) y confirmar luego apuntando el navegador a través del proxy. Frente a esto, una RCE o un webshell en uno de esos servicios internos es el siguiente paso lógico.

Cómo detectarlo. La firma está en el access.log de Squid: un único cliente pidiendo el mismo host en cientos de puertos distintos en poco tiempo, con muchas líneas TCP_MISS/TCP_DENIED y peticiones a IPs internas o localhost, un patrón de barrido de puertos que un uso legítimo del proxy no genera. Una regla que cuente destinos/puertos distintos por cliente, o que alerte de peticiones del proxy hacia rangos internos, lo detecta. El CONNECT a puertos no-web (3306, 6379) a través del proxy es especialmente delator.

Defensa. Restringir http_access a redes de confianza, no exponer Squid a Internet y segmentar para que el proxy no alcance servicios sensibles que deberían quedar aislados.

Máquinas donde se aplica

  • SquidProving Grounds Practice