You are on page 1of 14

[=] + =========--=[ ]=--========== + [=] GNU/Linux Proxy Squid - Part 1 [=] + ============================ + [=] Author: Possesso

XXXXXXX Introducao Este paper foi escrito para a minha qualificacao especializada em TI, no qual (agora) estamos mexendo com o squid :) O squid eh um proxy muito usado no Unix, comecou a ser escrito pelo governo dos EUA em parceria com a Universidade do Colorado e vem sendo usado por muitos hackas por aih. Vale Lembrar que o squid nao trabalha com os protocolos IMAP, POP, Telnet e SMTP por exemplo, esses costumeiramente situados na DMZ de uma rede; mas por outro lado trabalha bem com HTTP/HTTPs, Gopher, FTP e WAIS e mais nada. Vale lembrar que o squid antes de ser um bom proxy eh tambem um servidor cache, ou seja, ele guarda pages acessadas pelo pessoal da rede para uma conseguinte mais rapida visualizacao. Eh necessario salientar o fato de que com esse breve paper voce nao vai ser ninja no squid, mas vai te dar uma boa nocao sobre o proxy. Vou estar dedicando o paper aos verdadeiros mestres do nosso hacking nacional *blackhats* ---AciDmuD, VooDoo e Cheat Struck. Tambem eh uma boa salientar que nao eh pelo fato de estar ensinando como fechar rede para users de dentro do squid, que vou me tornar um "cana virtual", pelo contrario, ensino porqu sou um black hat e nos precisamos saber como as coisas funcionam para entao termos conhecimento suficiente (ou um bom ponto de partida) p/ burla-las. hoje eu to no Debian XXXXXXX Tipos de proxy Proxy Autenticado: Como o proprio nome jah dar a entender eh o proxy que requer autorizacao (login & senha) pra nos podermos fazer uso dele. Algumas 'boas' ferramentas de hacking podem usar proxy autenticado, tal como o httrack, largamente usado pra fazer clones de sites. Proxy Transparente: Esse nada mais eh do que um "termo" da nomenclatura/terminologia do hacking largamente utilizado para designar a *passagem* de pacotes das maquinas da rede pelo proxy (squid), o nome transparente vem do fato de que muitos kras nem se quer sabem que estao passando por um proxy quando requisitao alguma page pela porta 80 ;), porta essa que eh redirecionada para a porta que o squid ta rodando. Redirecionamento que por sua vez eh dado por algum firewall.

Existem alguns outros bons proxy servers por aih, tais como o delegate escrito pelo Yutaka Sato, OOPS e o ICS (official) da Microsoft. XXXXXXX instalando Pra instalar o squid eh facil, no FreeBSD voce pode usar o ports, jah no Debian eh o bom e velho dpkg ou o apt (pra ganhar tempo). # dpkg -i squid-common-x.x.x.deb # dpkg -i squid-x.x.x.deb apt-get install squid x.x.x eh a versao do pacote que voce baixou. Se preferir o source code: mv squid-x.x.x-src.tar.gz /usr/src/ cd /usr/src tar -zxvf squid-x.x.x-src.tar.gz cd squid-x.x.x ./configure ; make make install XXXXXXX configurando Bem, futilidade ou nao ;) voce vai poder, se quiser, limpar o arquivo de configuracao do squid, que fica (adivinha) como sempre em /etc . Ou seja, vai poder tirar os comentarios se por alguma razao algum lamah entrou na maquina. cd /etc/squid/ cp /etc/squid/squid.conf /etc/squid/squid.conf.bk mv squid.conf ../ egrep -v "^#|^$" squid.conf.bk > squid.conf rulez ,) XXXXXXX tags http_port: O squid jah vem setado pra ouvir na porta 3128, ou seja, voce nao vai precisar estar editando a linha "http_port 3128" se nao tiver afim de mudar a tal no seu squid.conf - Para abrir no "firewall" a porta que o squid fica escutando (se voce nao manjar nada de iptables): iptables -A INPUT -i eth0 -p tcp --dport 3128 -j ACCEPT <-- dependencias

Pacotes de entrada (INPUT) que tenham como destino a minha iface(eth0) de rede atraves do -protocolo TCP, pacotes esses com a porta de destino (--dport) 3128 serao aceitos (ACCEPT). Assim permitindo o trafego ;P visible_hostname: nas msgs de erro que os clientes recebem vai aparecer o que estah setado nessa tag. Citei ela aqui porque se ela nao estiver recebendo valor nenhum o squid simplesmente nao starta. visible_hostname squid.domain.com XXXXXXX tags de cache cache_dir: Como jah era de se esperar e nessa tag que nos vamos podemos setar o diretorio e a quantidade de subdiretorios onde o cache vai estar. valor default cache_dir ufs /var/spool/squid 100 16 256 cache_dir ufs /var/spool/squid 100 16 256 -> tag -> forma de armazenamento. aufs pra outras plataformas (leia o squid.conf }:) -> diretorio do cache -> Valor contado em MB que determina quanto de espao pode ser usado em disco pro cache. -> Quantidade de diretorios que o cache pode ter. -> Numero de subdiretorios que pode ter.

cache_mgr: O mail do admin do proxy. Se acontecer algum problema o sysop "provavelmente" ficarah sabendo... o sysadmin receberah um email notificando o fato..:) Email esse exibido em alguma mensagem de erro. cache_access_log: Do cao. Se quiser saber quem acessou o que dentro da rede do squid venha aqui e saiba. Valor default cache_access_log /var/log/squid/access.log cache_effective_user: Diz para o squid com qual user(privilegios) rodar. Voce nao vai conseguir setar root nas versoes mais atuais. cache_effective_user squid <-- valor padrao

cache_effective_group: Por sua vez essa vai setar o grupo. XXXXXXX

ACL - Lista de controle de acesso Aqui eh a nossa boa e velha Access Control List. Eh atraves do esquema de acl do squid que dizemos a ele o que pode e o que nao pode ser feito dentro da rede dele. Os tipos de acls sao: proxy_auth: Usada nos casos em que voce seta autenticacao, ou seja, ela define user names. proto: determina o protocolo de transferencia. port : determina a porta de destino (especifica a porta do servidor). time : com essa acl nos podemos setar um horario (e dia da semana). dstdomain: dominio de destino. Identifica e restringe o acesso a um dominio. url_regex: Faz comparacao de uma determinada string com uma URL "completa". Tambem usado p/ bloqueio de sites. urlpath_regex: procura "partes" na URL. Costuma bloquear extensoes de arquivos. src: determina IP/host e rede de origem. dst: determina IP/host e rede de destino.

XXXXXXX Action Dentro do squid.conf voce verah a area para escrever as acls. Examples: acl acc3ss dstdomain sexandandputaria.com www.sexandandputaria.com http_access deny acc3ss Acima crio a acl acc3ss e determino que o dstdomain sex* e www.sex* serao bloqueados, com o tag acesso_http, ou seja, ninguem poderah ter acesso web a esse site/dominio . Bem, falando a verdade o squid analisa a partir do 'www' ateh o FQDN quando usamos acls do tipo 'dominio'. Veja como eh estruturada uma acl -> deny (nega) os dominios "dentro" de acc3ss Example II: acl palavrabloqueada url_regex -i sexo http_access deny palavrabloqueada Bloqueia a palavra "sexo" na acl 'palavrabloqueada'. O -i acima faz com que o squid nao distingua letras minusculas de maiusculas. Veja que seto o tipo de acl logo apos a declaracao do nome da mesma. De nada adiantaria criar uma acl sem a utilizacao da tag http_access,

a mesma que bloqueia ou faz a liberacao do que estah sendo dito com a criacao da acl. XXXXXXX Running it Botar o squid pra rodar fazendo com que todos tenham acesso livre a ele eh facil, basta procurar e substituir a seguinte linha no squid.conf: http_access deny all por http_access allow all Depois de feito isso basta rodar o parametro -k reconfigure do squid para reiniciar as configuracoes do mesmo assim fazendo com que as novas configuracoes entrem em vigor. Ou (como era feito antigamente) voce pode tambem restartar o servico squid com o mesmo proposito, ou seja, voce sempre vai precisar fazer isso depois de modificar o squid.conf squid -k reconfigure /etc/init.d/squid restart Outros comandos uteis para voce squid squid squid squid stop restart -z status -> -> -> -> para o squid reinicia o servico do squid reinicia o cache verifica se o squid estah em execucao

XXXXXXX restricoes de acesso Se quisermos podemos definir ranges de IPs para acesso ao proxy, ou apenas uma rede. Vou explicar. http_access allow all Observe que allow (permitir) all (todos) manipula uma acl, ou seja, a acl "all". Procure a linha no qual ela estah sendo setada e veja: acl all src 0.0.0.0/0.0.0.0 http_access allow all

<-- permitir acl all

O ultimo parametro determina o range de IP que pode fazer uso do squid, veja que estah setado como 0 em todos os octetos, indicando todos. Note que a acl 'all' eh do tipo src, ou seja, ela determina origem (0.0.0.*). Para mudar essa configuracao e comecarmos a filtrar os clientes que

farao uso do proxy simplesmente #comente essas duas linhas. Vamos declarar agora uma nova lista de controle de acesso do tipo src no qual estah contida a "rede" interna que serah cliente do servidor proxy. acl localnetwork src 192.168.1.0/24 Observe /24, essa opcao que determina/seta a rede local, o vinte e quatro que seta a mascara de subrede de classe C, ou seja, "255.255.255.0", enquanto a interface lo (o endereco IP de loopback) eh setada com a especificacao /32 quer dizer ele mesmo (127.0.0.1/32). Eu poderia ter setado o loopback da seguinte maneira: acl localhost src 127.0.0.1/255.255.255.255 Para especifica-lo. Agora de a ordem pro squid comecar a ler essa acl. http_access allow localnetwork Tambem podemos setar um range de IPs dessa forma: acl range src 192.168.1.5-192.168.1.30 http_access allow range Permitindo o acesso do PC com final 5 ao PC com final 30. XXXXXXX Praticidades Voce viu que para bloquear uma determinada palavra com o squid declaramos uma acl do tipo "url_regex" e logo em seguida especificamos qual palavra seria, pois bem, ao inves de uma unica palavra podemos inserir uma lista, bastando utilizar "aspas" seguida do PATH onde estah a lista no disco, observe um exemplo logo abaixo. step 1: Crie um arquivo em branco e escreva palavras proibidas (uma por linha) :> /etc/squid/lists/bloqueado chmod 755 /etc/squid/lists/bloqueado nano /etc/squid/lists/bloqueado Agora insira no squid.conf acl proibido url_regex -i "/etc/squid/lists/bloqueado" http_access deny proibido Pronto, eh soh isso mesmo. Como nem tudo que tem a palavra sex (dentro de "bloqueado") eh concernente a putaria, voce tambem pode setar algumas outras palavras permitidas, como

por exemplo sexologia; se alguem por alguma razao 'virgem de dentro da rede estivesse querendo fazer uma pesquisa em um site chamado sexologia.org. Crie um novo arquivo, sete as permissoes dele para 755 novamente e escreva as palavras permitidas. Mova o novo arquivo para touch /etc/squid/lists/permitidos E logo em seguida adicione a linha acl permitido url_regex -i "/etc/squid/lists/permitidos" Agora escreva a seguinte instrucao http_access deny proibido !permitido Note a exclamacao, isso quer dizer a inversao da proposta da regra. Eh o mesmo que dizer: http_access, nege por favor o acesso as palavras setadas em proibido, mas nao leve em consideracao a acl !permitido. Reinicie o squid para as suas configuracoes terem efeito. /etc/init.d/squid restart

XXXXXXX Jeremias rexona ataque novamente Horario de acessos Com ACL do tipo 'time' podemos configurar um 'determinado horario para acesso ao proxy. Opcao util para previnirmos que algum sabotador se aproveitando de alguma relacao de confianca das maquinas da sua intranet com algum servidor externo, invada a sala de informatica na calada da noite ehehe. acl horariodeboa time MTWHF 08:30-20:00 http_access deny !horariopermitido S M T W H F A Sunday Monday Tuesday Wednesday Thursday Friday Saturday domingo segunda tera quarta quinta sexta sbado

Com essa sintaxe estou dizendo o mesmo que: setar a acl "horariodeboa" do tipo "time" para guardar os valores MTWHF (segunda a sexta) 08:30 <-- horario de inicio, as "-" 20:00, e abaixo digo que quero negar (deny) o acesso http para todos os horarios "!com excessao" do horario setado em horariodeboa, me utilizando do '!'. Facil. Se voce quiser permitir ou bloquear o acesso de uma

maquina em especial, por exemplo 192.168.0.16, em determinados dias e horarios, voce pode se utilizando das sintaxes: acl pc16 src 192.168.0.16/255.255.255.255 acl manhapc16 time MTWHF 8:00-11:00 acl tardepc16 time M T W H F 13:00-15:30 Liberando acesso: [*] - http_access allow pc16 manhapc16 [*] - http_access allow pc16 tardepc16 A sintaxe eh bastante simples amigo, o http_access permite (allow) ao pc16 (acl pc16) acesso ao horario estipulado na acl manhapc16 no qual eh o horario de acesso pela manha, e o acesso a acl tardepc16. Negando acesso: http_access deny pc16 manhapc16 http_access deny pc16 tardepc16

XXXXXXX Ok, essas palavras podem! acl palavrasbloqueadas url_regex -i "/etc/squid/lists/bloqueado" acl pcliberado src 192.168.1.5 http_access allow palavrasbloqueadas pcliberado Essa sintaxe eh mais facil ainda, voce soh precisa especificar a tag de acesso http seguida da instrucao allow e logo depois especificar a acl no qual estah a lista de palavras que foram bloqueadas seguida do nome do PC que terah acesso as tais. Se o proxy for autenticado voce poderah especificar o nome de usuario/login se utilizando da tag proxy_auth acl pcliberado proxy_auth Morgana http_access allow palavrasbloqueadas pcliberado #username # sets

XXXXXXX Podem ver! acl pagesliberadas url_regex -i "/etc/squid/lists/pages" acl podeverpage src 192.168.1.12 http_access deny !pagesliberadas podeverpage Com isso estou dizendo o mesmo que, bloqueie todos os

acessos http com !excessao da acl pagesliberadas p/ o computador podeverpage. Simples. Se o proxy requerer autenticacao basta escrever a linha abaixo acl podeverpage proxy_auth Possesso Agora sete os sites que o Possesso pode ter acesso se utilizando do url_regex. Sete as permissoes de leitura para essa arquivo com o chmod para 755 como de costume e logo em seguida feche a regra http_access deny !pagesliberadas Possesso Liberando para toda a rede -------------------------http_access deny !pagesliberadas all Nem precisava ter escrito, foi soh pra voce nao esquecer. XXXXXXX Negando tipos de downloads As sintaxes de listas como jah mostradas sao muito faceis, mas vamos revisar. Negando dominios ---------------Voce nao quer que seus funcionarios por alguma razao qualquer acessem o facebook, instagram ou o site da h2hc underground empresarial acl dominios dstdomain "/etc/squid/lista" http_access deny dominios No caso de um computador especifico: acl pcnaopode src 192.168.1.9 http_access deny dominios pcnaopode Eh o mesmo esquema para extensoes ;) Voce nao quer que seus funcionarios baixem arquivos executaveis (que possivelmente possam ser cavalos de troia, virus, slave), scripts em lote do MSDOS (.bat), .com ou algo assim, muito menos baixem .mp3 durante o trampo, entao o que voce faz? Voce ler as linhas abaixo. Lembrando pra ti que voce pode bloquear inclusive downloads por FTP. Na lista de extensoes que serao bloqueadas voce deverah escrever as extensoes da seguinte forma. \.exe$ \.bat$ \.com$ \.pif$

\.mp3$ A contrabarra ('\') acima elimina metacaracteres e nesse caso serve para cancelar a funcao do '.' . O uso do cifrao por sua vez eh utilizado para que seja feita uma verificacao ateh o final da string. acl exts urlpath_regex -i "/etc/squid/lists/extensoes" http_access deny exts Veja que a acl exts eh do tipo urlpath_regex, que no caso checa "partes" da string.

XXXXXXX Redirecionamento de trafego NAT - Network Address Translation --------------------------------Vale lembrar que Network Address Translation eh um recurso do proprio kernel do sistema, ou seja, voce apenas precisa ter o iptables instalado no seu sistema para fazer uma. P/ quem sabe do que se trata recomendo que pule o capitulo, para quem nao continue lendo. Bem, NAT nada mais eh do que (como mencionado) um 'recurso que possibilita aos usuarios de uma "rede" interna terem apenas um endereco IP valido, o do gateway da rede, que normalmente eh um proxy, ou seja o trafego de pacotes provenientes de IPs da rede local passam pelo proxy para poderem ter acesso a internet, esse que por sua vez recebe a resposta do site e repassa para a NAT, que "nao" possui enderecos IPs roteaveis, como por exemplo os iniciados por 192.168. Para fazer a NAT vce vai precisar... Setar o iptables (duas opcoes) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE Habilitar o IP Forwarding (redirecionamento de pacotes) echo 1 > /proc/sys/net/ipv4/ip_forward Pronto, NAT feita =P Como voce jah provavelmente sabe, a chain POSTROUTING da tabela nat eh verificada quando os pacotes necessitam de modificacao apo's o roteamento, entao eh ela que utilizamos }:) Muito usada para masquerading, que eh o que estamos fazendo, ou seja, as maquinas da rede interna podem acessar a net usando uma outra Linux. A tabela NAT por sua vez tambeh eh a utilizada para fazer proxy transparente. -t especifica uma tabela, -A adiciona uma regra (que no caso eh a chain POSTROUTING, contida na tabela "nat"). As opcoes '-s' ou ' src (source/origem) servem para especificar um endereo de origem (enquanto a opcao -d destination = destino). Voce pode setar

um endereco IP, FQDN, hostname ou (que eh o que fizemos) uma rede. Se ele nao for especificado na sintaxe eh usado o 0/0 (que especifica todas as maquinas de todas as redes). -j especifica o alvo da regra, que nesse caso eh o MASQUERADE. O -o ( out-interface) especifica a interface dos pacotes, ou seja, nao precisamos especificar a rede, jah que somos o gateway. Agora a unica coisa que precisamos fazer eh configurar as maquinas clientes para acessar o servidor GNU/Linux/gateway que acabamos de configurar, pra quem nao entendeu -> sete essa maquina como gateway no cliente }:P Fazer masquerading no velho ipchains eh mais facil ainda. Logo depois de habilitar o IP forwarding: ipchains -A FORWARD -s 192.168.1.0/24 -d 0.0.0.0/0 -j MASQ XXXXXXX Proxy transparente Lembrando-te, "proxy transparente" na nomenclatura eh o que "forca" as maquinas da rede local a terem seus pacotes TCP (nesse caso) destinados a porta 80 de algum host 'fora da rede local (WAN - Wide Area Network), a passar pela porta do squid para que ele possa por sua vez receber do site na internet a resposta p/ o requerimento da NAT e repassar de volta ao cliente da sua rede. Muito simples entender! Ainda dentro de squid.conf escreva ou deixe essas linhas caso as encontre. httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on Isso se seu release do squid for anterior a 2.6 mas se voce estiver usando outro release (como o 2.6 ;P ou posteriores) basta escrever isso abaixo pra dar suporte ao modo transparent"e" do squid http_port 3128 transparent Tan dan! Ou seja, voce soh precisa adicionar a linha de comando 'transparent' depois de http_port+porta. Para saber qual eh a versao do squid que vce ta usando basta escrever o comando squid -v. Entao depois de voce setar o suporte a transparencia: /etc/init.d/squid restart Ou se preferir voce poderar usar o bom e velho service. service squid restart Lembrando que estou usando o Debian. -----------------------------

Agora vamos setar o kernel com o iptables ----------------------------iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 Com isso estou dizendo o mesmo que: Meu caro companheiro iptables, utilize (-A) a chain PREROUTING da tabela (-t) nat, para que as requisicoes a minha -interface de rede (-i in-interface) eth0 que utilizem o protocolo TCP com a porta de destino 80, sejam por sua vez redirecionadas (-j REDIRECT) para (--to-port) a porta 3128 (que no caso eh a porta que o squid escuta). Agora todos os resquests a sites da internet vao entao passar pelo squid, que farah o seu papel de proxy. Caso voce nao tenha setado o um proxy transparente voce precisarah entao configurar manualmente nos browsers o IP do servidor squid e a port que o squid estah escutando in ;) Nesse caso aqui: 3128. XXXXXXX Knock, Knock... Quem eh? Bem, todo hacku sabe que existem maneiras de se invadir um PC usando TCP/IP sem precisar usar uma porta TCP/IP (nada contra quem IPX/SPX), como vimos em uma das saudosas publicacoes do nosso amado Cheat Struck atraves da Fatal Error-zinha dele.E que anos depois veio sendo "ree-scrita" como "port knocking". Pessoalmente gosto da nomenclatura/terminologia "port knock", ateh porque esse negocio de ICMP backdoor eh muito tosco. Mas nao custa nada saber com filtrar as portas. Vamos criar uma lista de controle de acesso do tipo port, que nada mais eh do que um tipo que armazena porta (original). acl portas port 80 21 443 210 http_access deny !portas Simples! Nega tudo, com !excessao eh claro das portas especificadas na acl portas. Se alguma maquina na rede precisar ter acesso a determinada porta: acl pc14 src 192.168.1.14 acl servidorssh port 22 http_access deny !servidorssh pc14 Tambem poderia ter feito da seguinte maneira: acl portas port 80 #http acl portas port 21 #ftp acl portas port 443 #https Qualquer coisa da uma olhada em /etc/services :)

XXXXXXX Meu proxy publico? Para evitar que algum "expertalhao" use seu proxy a torto e eh direito para visitar pages por aih c/ o seu endereco IP, precisamos fazer o seguinte macete: Exp: ************************************************ * acl localnetwork src 192.168.1.0/24 * * acl loopback src 127.0.0.1/255.255.255.255 * * * * http_access allow localnetwork * * http_access allow loopback * * * * http_access deny all * ************************************************ = = = = = = = = =

Simples! Isso acontece porque como voces jah sabem o a acl all (acl all src 0.0.0.0/0.0.0.0) estah setada para todos os enderecos, quando digo todos, me refiro tambem -> "a internet", ou seja, voce permite acesso http (ver pages) usando o squid para a rede local e para a interface de rede de lo, mas nega para todos os outros enderecos IP. A ordem das regras dentro do squid.conf eh muito importante pq se o squid achar uma regra que possibilita determinado range acessar a net e voce colocar outra negando para o mesmo range, as maquinas continuarao acessando deboa devido a precedencia das regras que permitem sobre as que proibem. Claro que estou falando que isso funciona tambem para um host especifico. <----+ | | | | | | | | XXXXXXX | Tips e Hints | | | Voce entao pergunta: Como eh que eu faco pra bloquear todos os | websites e permitir soh algumas paginas? | | acl pagesdeboa url_regex -i "/etc/squid/podeacessar" | http_access allow pagesdeboa # <----+----------------------------+ http_access deny all # <----+ Logo mais abaixo voce poderah ver mais um belo exemplo de set. Exemplo: http_access deny blockedlist http_access allow all # <-- nega acesso http a acl blockedlist # <-- permite para todos

O exemplo acima nega acesso http em pesquisas contendo palavras

especificadas em blockedlist e logo abaixo permite acesso http a tudo, com excessao eh claro da lista previamente negada. Fiz isso porque se tivesse setado a blist depois de allow all nao aconteceria nada (por razoes jah citadas).

XXXXXXX Adios amigos Fiz algumas pesquisas sobre o servidor proxy squid como voce pode notar, e cheguei a conclusao de que ele eh realmente o melhor :) Valew pela revisao do texto professor ,) []'s

You might also like