Muchas veces hemos escuchado inquietudes sobre la gestión de tráfico de red, compartir internet y bloquear cierto tipo de navegación para ciertos dispositivos, mejorar el rendimiento de un servidor web... Con SQUID podemos administrar todo esto de una forma asequible y "fácil" de instalar, configurar y monitorizar, dado que nos permite levantar un servidor proxy web entre los dispositivos que queramos, además tiene compatibilidad con protocolos muy interesantes como lo es GHOPER o WAIS.
Características y requisitos.
Admite HTTP, HTTPS, FTP, GOPHER y WAIS, WWCP y proxy con SSL.
Oculta tu dirección IP real.
Reduce el ancho de banda y mejora los tiempos de respuesta al almacenar en caché y reutilizar páginas web solicitadas con frecuencia.
Permite controles de acceso
Optimiza el flujo de datos entre el cliente y el servidor para mejorar el rendimiento y almacena en caché el contenido de uso frecuente para ahorrar ancho de banda
Permite enrutar solicitudes de contenido a servidores para crear jerarquías de caché que optimicen el rendimiento de la red.
Permite crear grupos de contenido para enrutar y equilibrar la carga de solicitudes a través de una variedad de servidores web.
Tasa de aciertos de aproximadamente el 75%, cuadriplicando la capacidad de los servidores Apache detrás de ellos.
Sistema operativo actualizado.
Paquetería dependiente de Squid instalada.
Configuración de sistema para funcionalidad de servidor.
Squid web oficial: www.squid-cache.org
Instalación Debian y derivadas.
Como se puede leer en , esta y demás documentación que alberga la wiki de DeliciousHack está en continuo desarrollo por lo que con el paso del tiempo se añadirá la instalación y configuración de Squid en otros sistemas operativos.
Para sistemas Debian y derivadas se procede con la siguiente documentación, donde se utiliza un sistema Debian 11 con las siguientes especificaciones:
❄️ Papi-Shelly > uname -a
Linux skynet 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64 GNU/Linux
Se actualiza el sistema y paquetería, luego se procede con la instalación de Squid. En esta tabla se añaden los outputs correspondientes a estos dos primeros pasos:
❄️ Papi-Shelly > sudo apt install squid -y
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes adicionales:
libdbi-perl libecap3 squid-common squid-langpack
Paquetes sugeridos:
libmldbm-perl libnet-daemon-perl libsql-statement-perl squidclient squid-cgi squid-purge resolvconf smbclient ufw winbind
Se instalarán los siguientes paquetes NUEVOS:
libdbi-perl libecap3 squid squid-common squid-langpack
0 actualizados, 5 nuevos se instalarán, 0 para eliminar y 198 no actualizados.
Se necesita descargar 3.910 kB de archivos.
Se utilizarán 15,5 MB de espacio de disco adicional después de esta operación.
Des:1 http://deb.debian.org/debian bullseye/main amd64 libecap3 amd64 1.0.1-3.2+b1 [17,2 kB]
Des:2 http://deb.debian.org/debian bullseye/main amd64 squid-langpack all 20200403-1 [170 kB]
Des:3 http://deb.debian.org/debian bullseye/main amd64 squid-common all 4.13-10+deb11u2 [315 kB]
Des:4 http://deb.debian.org/debian bullseye/main amd64 libdbi-perl amd64 1.643-3+b1 [780 kB]
Des:5 http://deb.debian.org/debian bullseye/main amd64 squid amd64 4.13-10+deb11u2 [2.627 kB]
Descargados 3.910 kB en 0s (10,1 MB/s)
Seleccionando el paquete libecap3:amd64 previamente no seleccionado.
(Leyendo la base de datos ... 126705 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../libecap3_1.0.1-3.2+b1_amd64.deb ...
Desempaquetando libecap3:amd64 (1.0.1-3.2+b1) ...
Seleccionando el paquete squid-langpack previamente no seleccionado.
Preparando para desempaquetar .../squid-langpack_20200403-1_all.deb ...
Desempaquetando squid-langpack (20200403-1) ...
Seleccionando el paquete squid-common previamente no seleccionado.
Preparando para desempaquetar .../squid-common_4.13-10+deb11u2_all.deb ...
Desempaquetando squid-common (4.13-10+deb11u2) ...
Seleccionando el paquete libdbi-perl:amd64 previamente no seleccionado.
Preparando para desempaquetar .../libdbi-perl_1.643-3+b1_amd64.deb ...
Desempaquetando libdbi-perl:amd64 (1.643-3+b1) ...
Seleccionando el paquete squid previamente no seleccionado.
Preparando para desempaquetar .../squid_4.13-10+deb11u2_amd64.deb ...
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
Desempaquetando squid (4.13-10+deb11u2) ...
Configurando squid-langpack (20200403-1) ...
Configurando libdbi-perl:amd64 (1.643-3+b1) ...
Configurando libecap3:amd64 (1.0.1-3.2+b1) ...
Configurando squid-common (4.13-10+deb11u2) ...
Configurando squid (4.13-10+deb11u2) ...
Setcap worked! /usr/lib/squid/pinger is not suid!
Skipping profile in /etc/apparmor.d/disable: usr.sbin.squid
Created symlink /etc/systemd/system/multi-user.target.wants/squid.service → /lib/systemd/system/squid.service.
Procesando disparadores para man-db (2.9.4-2) ...
Procesando disparadores para libc-bin (2.31-13+deb11u5) ...
Systemd: Unidad de servicio.
Si todo ha ido correctamente, se podrá observar el estado del servicio Squid cargado y activo en el sistema. También se observa los directorios por defecto para el guardado de los logs, la ruta del binario y la ejecución de los procesos dependientes.
❄️ Papi-Shelly > sudo service squid status
● squid.service - Squid Web Proxy Server
Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2023-12-31 17:33:22 CET; 8min ago
Docs: man:squid(8)
Process: 1982 ExecStartPre=/usr/sbin/squid --foreground -z (code=exited, status=0/SUCCESS)
Main PID: 2019 (squid)
Tasks: 4 (limit: 4659)
Memory: 15.8M
CPU: 457ms
CGroup: /system.slice/squid.service
├─2019 /usr/sbin/squid --foreground -sYC
├─2022 (squid-1) --kid squid-1 --foreground -sYC
├─2023 (logfile-daemon) /var/log/squid/access.log
└─2024 (pinger)
dic 31 17:33:22 skynet squid[2022]: Using Least Load store dir selection
dic 31 17:33:22 skynet squid[2022]: Set Current Directory to /var/spool/squid
dic 31 17:33:22 skynet squid[2022]: Finished loading MIME types and icons.
dic 31 17:33:22 skynet squid[2022]: HTCP Disabled.
dic 31 17:33:22 skynet squid[2022]: Pinger socket opened on FD 14
dic 31 17:33:22 skynet squid[2022]: Squid plugin modules loaded: 0
dic 31 17:33:22 skynet squid[2022]: Adaptation support is off.
dic 31 17:33:22 skynet squid[2022]: Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 12 flags=9
dic 31 17:33:22 skynet systemd[1]: Started Squid Web Proxy Server.
dic 31 17:33:23 skynet squid[2022]: storeLateRelease: released 0 objects
En el propio output se obtiene la ruta de la unidad que construye el servicio de Squid en sistema, que corresponde al directorio de systemd y en el que se puede leer las instrucciones de ejecución de este servicio. En la primera captura se indica la ruta y en la segunda se muestra la estructura de la unidad.
Próximamente estará disponible la documentación sobre systemd y la configuración de unidades (.service) y temporalizadores (.timer) aunque no te agobies, ShellDredd tiene un curso de casi dos horas explicando todo esto de una forma deliciosa y con ejercicios prácticos. A continuación ponemos a tu disposición las dos partes del curso gratuito, disfrútalo.
En las especificaciones de la unidad disponemos de la secuencia de inicio o activación de la misma, en la variable de "After" se indica que la unidad se active una vez se detecte el tarjet de network funcionando en sistema, en este momento es cuando systemd como gestor de procesos, activará la unidad de Squid.
[Unit]
Description=Squid Web Proxy Server
Documentation=man:squid(8)
After=network.target network-online.target nss-lookup.target
Configuración de SQUID PROXY
La configuración se encuentra en un archivo .conf en la ruta generada por squid en el directorio /etc/squid/squid.conf , pero antes de modificar esta configuración, se recomienda usar buenas prácticas de trabajo y generar una copia de la configuración por defecto, en este caso se crea un directorio específico para los backups de los programas utilizados en sistema.
❄️ Papi-Shelly > sudo mkdir /etc/backups
❄️ Papi-Shelly > sudo cp /etc/squid/squid.conf /etc/backups/squid-bck.conf
❄️ Papi-Shelly > ls -la /etc/backups/
total 320
drwxr-xr-x 2 root root 4096 ene 1 17:17 .
drwxr-xr-x 117 root root 4096 ene 1 17:15 ..
-rw-r--r-- 1 root root 316292 ene 1 17:17 squid-bck.conf
Una vez realizada la copia se puede modificar el archivo de configuración sin verguenza alguna, para el ejemplo de esta documentación se generará una configuración y funcionalidades concretas, cambiar puerto en escucha, añadir filtros y ACL (reglas), establecer listas de accesos y bloqueos, entre algunas más.
Con el editor de texto "nano" navegamos por el archivo de configuración.
sudo nano /etc/squid/squid.conf
Dentro de la edición del editor, con el atajop de teclas "Ctrl + W" se busca por el número de puerto por defecto para entablar la escucha por parte de Squid, el 3128.
Esto redirige a la parte del archivo correspondiente a la configuración del puerto, aquí se puede cambiar por otro puerto siempre y cuando se revise que este nuevo puerto no está ocupado por otro servicio o aplicación en red.
# Squid normally listens to port 3128
http_port 3128
Se cambia por el puerto 6969 y se reinicia el servicio de Squid.
❄️ Papi-Shelly > sudo service squid restart
❄️ Papi-Shelly > sudo service squid status
● squid.service - Squid Web Proxy Server
Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-01 18:02:57 CET; 1min 26s ago
Docs: man:squid(8)
Process: 2192 ExecStartPre=/usr/sbin/squid --foreground -z (code=exited, status=0/SUCCESS)
Main PID: 2196 (squid)
Tasks: 4 (limit: 4659)
Memory: 15.6M
CPU: 385ms
CGroup: /system.slice/squid.service
├─2196 /usr/sbin/squid --foreground -sYC
├─2199 (squid-1) --kid squid-1 --foreground -sYC
├─2200 (logfile-daemon) /var/log/squid/access.log
└─2201 (pinger)
ene 01 18:02:57 skynet squid[2199]: Using Least Load store dir selection
ene 01 18:02:57 skynet squid[2199]: Set Current Directory to /var/spool/squid
ene 01 18:02:57 skynet squid[2199]: Finished loading MIME types and icons.
ene 01 18:02:57 skynet squid[2199]: HTCP Disabled.
ene 01 18:02:57 skynet squid[2199]: Pinger socket opened on FD 14
ene 01 18:02:57 skynet squid[2199]: Squid plugin modules loaded: 0
ene 01 18:02:57 skynet squid[2199]: Adaptation support is off.
ene 01 18:02:57 skynet squid[2199]: Accepting HTTP Socket connections at local=[::]:6969 remote=[::] FD 12 flags=9
ene 01 18:02:57 skynet systemd[1]: Started Squid Web Proxy Server.
ene 01 18:02:58 skynet squid[2199]: storeLateRelease: released 0 objects
Comprobación del servicio SQUID PROXY
Con la herramienta nmap se comprueba el nuevo cambio de puerto y que realmente el servicio de proxy esté levantado correctamente.
❄️ Papi-Shelly > sudo nmap -sCV -p6969 localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-01 18:06 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000091s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE VERSION
6969/tcp open http-proxy Squid http proxy 4.13
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported: GET HEAD
|_http-server-header: squid/4.13
|_http-title: ERROR: The requested URL could not be retrieved
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.90 seconds
A través de una petición con curl se comprueba las cabeceras y respuestas que reporta el protocolo HTTP.
❄️ Papi-Shelly > curl -I localhost:6969
HTTP/1.1 400 Bad Request
Server: squid/4.13
Mime-Version: 1.0
Date: Mon, 01 Jan 2024 17:10:31 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3494
X-Squid-Error: ERR_INVALID_URL 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from skynet
X-Cache-Lookup: NONE from skynet:6969
Via: 1.1 skynet (squid/4.13)
Connection: close
Que nadie enloquezca, Skynet no enviará a ningún T-800 a por ti, lo que se indica es el hostname del sistema en red (Debian Server) que chistosamente ShellDredd ha denominado con ese nombre tan peculiar. Además de este detalle también se observa que el proxy Squid está entablado correctamente para gestionar el tráfico de peticiones.
Estructura de logs y accesos.
Antes de continuar con las configuraciones, se debe conocer la estructura de logs y caché correspondiente a este proxy. Tras la instalación se ha generado un directorio para alamacenar estos datos y que se encuentra en la ruta /var/log/squid/
❄️ Papi-Shelly > sudo ls -a /var/log/squid/
. .. access.log cache.log
Contenido de los archivos de log:
El archivo access.log se puede utilizar para conocer detalles sobre los usuarios del servidor squid, como qué direcciones IP se están conectando, qué URL visitan, etc.
En el archivo de cache.log se obtiene por ahora el trazo de inicio del proceso y demás dependencias del proxy Squid en sistema. Este tipo de comprobaciones siempre son recomendables en caso de algún tipo de problema en el arranque de un programa o servicio ya que, seguramente se podrá detectar en los logs de caché.
2024/01/01 18:02:57| Created PID file (/run/squid.pid)
2024/01/01 18:02:57 kid1| Set Current Directory to /var/spool/squid
2024/01/01 18:02:57 kid1| Starting Squid Cache version 4.13 for x86_64-pc-linux-gnu...
2024/01/01 18:02:57 kid1| Service Name: squid
2024/01/01 18:02:57 kid1| Process ID 2199
2024/01/01 18:02:57 kid1| Process Roles: worker
2024/01/01 18:02:57 kid1| With 1024 file descriptors available
2024/01/01 18:02:57 kid1| Initializing IP Cache...
2024/01/01 18:02:57 kid1| DNS Socket created at [::], FD 5
2024/01/01 18:02:57 kid1| DNS Socket created at 0.0.0.0, FD 9
2024/01/01 18:02:57 kid1| Adding nameserver DELICIOUS_IP from /etc/resolv.conf
2024/01/01 18:02:57 kid1| Adding nameserver DELICIOUS_IP from /etc/resolv.conf
2024/01/01 18:02:57 kid1| Logfile: opening log daemon:/var/log/squid/access.log
2024/01/01 18:02:57 kid1| Logfile Daemon: opening log /var/log/squid/access.log
2024/01/01 18:02:57 kid1| Local cache digest enabled; rebuild/rewrite every 3600/3600 sec
2024/01/01 18:02:57 kid1| Store logging disabled
2024/01/01 18:02:57 kid1| Swap maxSize 0 + 262144 KB, estimated 20164 objects
2024/01/01 18:02:57 kid1| Target number of buckets: 1008
2024/01/01 18:02:57 kid1| Using 8192 Store buckets
2024/01/01 18:02:57 kid1| Max Mem size: 262144 KB
2024/01/01 18:02:57 kid1| Max Swap size: 0 KB
2024/01/01 18:02:57 kid1| Using Least Load store dir selection
2024/01/01 18:02:57 kid1| Set Current Directory to /var/spool/squid
2024/01/01 18:02:57 kid1| Finished loading MIME types and icons.
2024/01/01 18:02:57 kid1| HTCP Disabled.
2024/01/01 18:02:57 kid1| Pinger socket opened on FD 14
2024/01/01 18:02:57 kid1| Squid plugin modules loaded: 0
2024/01/01 18:02:57 kid1| Adaptation support is off.
2024/01/01 18:02:57 kid1| Accepting HTTP Socket connections at local=[::]:6969 remote=[::] FD 12 flags=9
2024/01/01 18:02:57| pinger: Initialising ICMP pinger ...
2024/01/01 18:02:57| pinger: ICMP socket opened.
2024/01/01 18:02:57| pinger: ICMPv6 socket opened
2024/01/01 18:02:58 kid1| storeLateRelease: released 0 objects
Configuración avanzada.
En el archivo de configuración "/etc/squid/squid.conf" se modifican y añaden las siguientes variables:
Se configura la dirección IP y el puerto por el cual se hará la escucha de tráfico de peticiones por parte del proxy Squid.
# Squid normally listens to port 3128
http_port 192.168.1.54:8080
Los ACL (Lista de Control de Acceso) son reglas de accesos que permiten configurar unas normas dentro del proxy, "localnet" hace referencia a este mismo y con "src" se entrabla la IP que tendrá acceso al proxy, desde donde se origina la solicitud bajo esta ACL, es decir, tu dirección IP.
acl localnet src 192.168.1.54
Permite el flujo de red a través del localhost del servidor donde se ejecuta el proxy Squid.
http_access allow localhost
Se guarda el archivo con los nuevos cambios y se reinicia el servicio.
sudo service squid restart
Ejemplo práctico de uso.
Se comprueba con una petición a través de curl especificando la cadena de conexión, indicando la IP y puerto de origen así como la url para la consulta. En este caso se realiza dos peticiones con curl.
Las dos últimas líneas muestran los intentos de acceso y el estado de la petición realizada por lo que oficialmente el servidor proxy de SQUID está funcionando correctamente con una configuración básica de prueba. Pero lo interesante es ver los accesos de equipos externos hacia el servidor con Squid, para ello se utiliza un sistema Windows 10 virtualizado que accede por red local y en concreto al puerto 8080 que es el que se ha configurado anteriormente en el archivo de configuración de Squid.
Observando el cache.log se encuentra el socket de conexión como se muestra a continuación:
Desde el otro dispositivo Windows se accede por navegador web a la IP del servidor y al puerto 8080 dentro de la red local.
Ahora desde el access.log se obtiene la traza de conexión y los detalles correspondientes.
Vulnerar Squid Proxy (abusar de fallo en el proxy)
Esta documentación está en proceso de desarrollo, hasta este punto se recoge la instalación y configuración básica de Squid Proxy pero poco a poco se implementarán nuevas secciones con configuraciones más avanzadas. Si quieres estar al día te recomendamos unirte al servidor de Discord y al grupo de Telegram ya que, notificamos en estos medios todas las actualizaciones de la Wiki.
Gracias por visitar DeliciousHack y esperamos que este proyecto sea de ayuda.
Squid Wiki oficial:
Squid carece de soporte para ser utilizado como Servidor Proxy para protocolos como SMTP, POP3, TELNET, SSH, IRC, etc. Si se requiere intermediar para cualquier protocolo distinto a HTTP, HTTPS, FTP, GOPHER y WAIS se requerirá implementar obligatoriamente un enmascaramiento de IP o NAT (Network Address Translation) o bien hacer uso de un servidor SOCKS como Dante ().
Como ejemplo práctico se utiliza la máquina CTF apodada "Cache" y disponible en la plataforma . En esta ocasión se hace uso del vídeo técnico publicado por el usuario Condor, colaborador de DeliciousHack y creador de contenido en Youtube, donde recientemente ha subido el writeup de esta maquina y donde se puede comprender y aprender técnicas para enumerar y vulnerar un proxy Squid.