🏓Squid Proxy Gnu/Linux
01/01/2024
ShellDredd

Introducción.
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.
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:

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.


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.
❄️ Papi-Shelly > sudo cat /var/log/squid/access.log
1704128774.710 2 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128774.775 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.776 0 127.0.0.1 NONE/400 3885 GET /tasktracker.jsp - HIER_NONE/- text/html
1704128774.776 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128774.776 0 127.0.0.1 NONE/400 3875 GET /status.jsp - HIER_NONE/- text/html
1704128774.776 0 127.0.0.1 NONE/400 3855 POST / - HIER_NONE/- text/html
1704128774.776 0 127.0.0.1 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -
1704128774.777 0 127.0.0.1 NONE/400 3885 GET /flumemaster.jsp - HIER_NONE/- text/html
1704128774.777 0 127.0.0.1 NONE/400 3903 GET /nmaplowercheck1704128774 - HIER_NONE/- text/html
1704128774.777 0 127.0.0.1 NONE/400 3855 PROPFIND / - HIER_NONE/- text/html
1704128774.778 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.778 0 127.0.0.1 NONE/400 3883 GET /jobtracker.jsp - HIER_NONE/- text/html
1704128774.778 0 127.0.0.1 NONE/400 3873 GET /.git/HEAD - HIER_NONE/- text/html
1704128774.778 0 127.0.0.1 NONE/400 3893 GET /browseDirectory.jsp - HIER_NONE/- text/html
1704128774.779 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128774.779 0 127.0.0.1 NONE/400 3875 GET /robots.txt - HIER_NONE/- text/html
1704128774.780 0 127.0.0.1 NONE/400 3861 POST /sdk - HIER_NONE/- text/html
1704128774.780 0 127.0.0.1 NONE/000 0 NONE error:transaction-end-before-headers - HIER_NONE/- -
1704128774.780 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.780 0 127.0.0.1 NONE/400 3855 PROPFIND / - HIER_NONE/- text/html
1704128774.781 0 127.0.0.1 NONE/400 3881 GET /dfshealth.jsp - HIER_NONE/- text/html
1704128774.781 0 127.0.0.1 NONE/400 3873 GET /rs-status - HIER_NONE/- text/html
1704128774.781 0 127.0.0.1 NONE/400 3875 GET /master.jsp - HIER_NONE/- text/html
1704128774.894 115 127.0.0.1 TCP_MISS_ABORTED/200 14081 GET http://www.google.com/ - HIER_DIRECT/142.250.201.68 text/html
1704128774.896 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.896 0 127.0.0.1 NONE/400 3865 GET /HNAP1 - HIER_NONE/- text/html
1704128774.896 0 127.0.0.1 NONE/400 3855 PROPFIND / - HIER_NONE/- text/html
1704128774.897 0 127.0.0.1 NONE/400 3855 FYVE / - HIER_NONE/- text/html
1704128774.912 0 127.0.0.1 NONE/400 3875 GET /evox/about - HIER_NONE/- text/html
1704128774.923 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128774.973 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.976 65 127.0.0.1 TCP_MISS/200 763 HEAD http://www.google.com/ - HIER_DIRECT/142.250.201.68 text/html
1704128774.978 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128774.993 0 127.0.0.1 TCP_DENIED/403 3727 CONNECT www.google.com:80 - HIER_NONE/- text/html
1704128774.994 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128774.994 0 127.0.0.1 NONE/400 359 HEAD / - HIER_NONE/- text/html
1704128775.000 0 127.0.0.1 NONE/400 3877 GET /favicon.ico - HIER_NONE/- text/html
1704128775.006 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.007 0 127.0.0.1 NONE/400 3855 POST / - HIER_NONE/- text/html
1704128775.013 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.013 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.018 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.021 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.024 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.028 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128775.030 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704129031.725 0 ::1 NONE/400 359 HEAD / - HIER_NONE/- text/html
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
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.
curl -v -x https://192.168.1.54:8080 https://www.vulnyx.com
Y como primera comprobación, se obtiene un log de acceso al proxy proveniente de la IP origen, esto se puede ver con una lectura al access.log
❄️ Papi-Shelly > sudo tail -n 10 /var/log/squid/access.log
[sudo] password for shelldredd:
1704128775.013 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.013 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.018 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.021 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.024 0 127.0.0.1 NONE/400 3855 OPTIONS / - HIER_NONE/- text/html
1704128775.028 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704128775.030 0 127.0.0.1 NONE/400 3855 GET / - HIER_NONE/- text/html
1704129031.725 0 ::1 NONE/400 359 HEAD / - HIER_NONE/- text/html
1704136831.440 0 192.168.1.54 NONE/400 3688 NONE error:invalid-request - HIER_NONE/- text/html
1704137398.481 0 192.168.1.54 NONE/400 3688 NONE error:invalid-request - HIER_NONE/- text/html

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.

🐇 (◕ _◕ ) 🎯 cat access.log
1704558134.361 4 192.168.1.35 NONE/400 3858 GET / - HIER_NONE/- text/html
1704558134.519 1 192.168.1.35 TCP_DENIED/403 4280 GET http://skynet:8080/squid-internal-static/icons/SN.png - HIER_NONE/- text/html
1704558134.630 0 192.168.1.35 NONE/400 3880 GET /favicon.ico - HIER_NONE/- text/html
1704563448.212 0 192.168.1.35 NONE/400 3858 GET / - HIER_NONE/- text/html
1704563448.267 1 192.168.1.35 TCP_DENIED/403 4280 GET http://skynet:8080/squid-internal-static/icons/SN.png - HIER_NONE/- text/html
1704563448.348 0 192.168.1.35 NONE/400 3880 GET /favicon.ico - HIER_NONE/- text/html
Vulnerar Squid Proxy (abusar de fallo en el proxy)
Como ejemplo práctico se utiliza la máquina CTF apodada "Cache" y disponible en la plataforma Vulnyx. 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.
📺 Canal de Youtube de Condor: https://www.youtube.com/@condor0777
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.
Última actualización
¿Te fue útil?