Bloqueando o UltraSurf em Ambiente Corporativo

Autor: Giovani M. Soares


 

§  O que é?

O UltraSurf é um programa desenvolvido para burlar as restrições de acesso à internet, inicialmente foi desenvolvido para ser usado na China (devido a censura), porém acabou caindo no gosto de usuários corporativos, que usam o programa para acessar sites indevidos dentro da organização.

§  Como funciona?

Atualmente o UltraSurf está na versão 9.9.2, e quando é executado se conecta a algum IP da rede 65.49.2.0/24 usando conexão SSL na porta 443 tornando a própria máquina do usuário em um servidor Proxy. Não adianta bloquear esta rede no firewall, caso o programa não consiga se conectar a algum IP desta rede, ele irá se conectar a uma vasta gama de endereços dinâmicos, o que irá dificultar seu bloqueio.

A lógica que utilizaremos para bloquear o programa segue os seguintes passos:

1.       Toda vez que houver conexão entre algum computador da rede interna com a rede 65.49.2.0/24, representa que o UltraSurf está em execução.

2.       Bloquear todas as conexões na porta 443 para esta máquina, fazendo com que o UltraSurf pare de funcionar.

3.       Quando o Usuário fechar o programa, a regra de bloqueio das conexões na porta 443 (passo 2) será removida, fazendo com que o usuário volte a acessar aplicações que usam a porta 443, como sites de bancos.

 

§  Construindo a Solução

O sniffer tcpdump irá satisfazer o passo 1, sendo responsável por monitorar e detectar as conexões com a rede 65.49.2.0/24 do UltraSurf. Se o tcpdump não estiver instalado,

# apt-get install tcpdump

Com o tcpdump instalado, crie em um caminho de sua preferência, um arquivo com o nome monitor.sh e torne-o executável:

# touch /etc/scrips/ultrasurf/monitor.sh

# chmod +x /etc/scripts/ultrasurf/monitor.sh

Abra o arquivo monitor.sh e coloque o seguinte contudo:

# vim /etc/scripts/ultrasurf/monitor.sh

#!/bin/sh

# Monitoramento das conexoes feitas para a rede do ultrasurf

 

# Arquivo que contem o historico de utilizacao do ultrasurf

historico=/etc/scripts/ultrasurf/log/historico.log

 

killall tcpdump

tcpdump -l -i eth1 -qNnn dst net 65.49.2.0/24 and dst port 443 | tee -a $historico

Notas:

ü  A quinta linha do script, atribui à variável “$historico” o caminho do arquivo “histórico.log”, portanto altere para o caminho em que se encontra o seu arquivo histórico.log.

ü  A sétima linha “mata” todos os processos do tcpdump em execução, isso porque mais adiante colocaremos este script para ser executado de 5 em 5 minutos no crontab, portanto esta linha garante que o processo será finalizado antes de ser executado novamente.

ü  A oitava linha é responsável por monitorar toda a rede interna a procura de conexões para a rede do UltraSurf e gravar um log. Lembre também de especificar qual interface de rede está usando para a rede interna. No exemplo usamos eth1 para a rede interna (tcpdump -l -i eth1 -qNnn dst net 65.49.2.0/24 and dst port 443 | tee -a $historico)

 

Para executar o “monitor.sh” automaticamente, vamos criar um agendamento no cron (agendador de tarefas)  com um intervalo de 5 em 5 minutos.

# vim /etc/crontab

# /etc/crontab: system-wide crontab

# Unlike any other crontab you don't have to run the `crontab'

# command to install the new version when you edit this file

# and files in /etc/cron.d. These files also have username fields,

# that none of the other crontabs do.

 

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

ultrasurf=/etc/scripts/ultrasurf

 

# m h dom mon dow user  command

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

0-59/5 * * * *  root    "$ultrasurf"/monitor.sh | tee "$ultrasurf"/log/monitor.temp

* *     * * *    root    cat "$ultrasurf"/log/monitor.temp | cut -f3 -d" " | cut -f1-4 -d. | sort | uniq | tee "$ultrasurf"/log/hosts.temp

**      * * *    root    “$ultrasurf”/stop.sh

#

 

Notas:

ü  A linha azul faz o script monitor.sh ser executado num intervalo de 5 minutos e salva a saída do script no arquivo monitor.temp.

ü  Na linha vermelha, são extraídos do arquivo monitor.temp os IPs dos computadores que estão executando o ultrasurf, salvando-os no arquivo hosts.temp. Serão estes IPs que iremos bloquear mais tarde. Esta linha é executada num intervalo de 1 minuto.

ü  A linha verde executa o script stop.sh (que criaremos mais adiante) em um intervalo de 1 minuto.

ü  Observe que a variável “$ultrasurf” (linha laranja) guarda o caminho raiz que os scripts estão. No exemplo, estamos utilizando o caminho “/etc/scripts/ultrasurf” para guardar nossos scripts e o “/etc/scripts/ultrasurf/log” para guardar os demais arquivos como o “monitor.temp” e o “hosts.temp”.

ü  Adicione ao arquivo “/etc/crontab” somente as linhas coloridas, o restante do conteúdo já faz parte do arquivo. Depois da edição, não reinicie o serviço do cron, pois ainda não criamos o script “stop.sh”.

 

Para satisfazer os passos 2 e 3, vamos criar o script stop.sh, é ele quem vai bloquear os computadores que estão rodando o UltraSurf. Portanto crie um arquivo com o nome stop.sh (use o mesmo caminho do script monitor.sh) e torne-o executável:

# touch /etc/scripts/ultrasurf/stop.sh

# chmod +x /etc/scripts/ultrasurf/stop.sh


 

Edite o arquivo e insira o seguinte conteúdo:

# vim /etc/scripts/ultrasurf/stop.sh

#!/bin/sh

 

hosts=$(cat /etc/scripts/ultrasurf/log/hosts.temp)

denied=$(iptables -t filter -L fdenyall -n | grep 'DROP' | cut -c21- | cut -f1-4 -d"." | cut -f1-2 -d" " | sort | uniq)

 

# Bloqueia os IPs contidos no arquivo hosts.temp

 

for iptodeny in $(echo "$hosts"); do

  checker=0

 

   for ipdeny in $(echo "$denied"); do

        if [ "$iptodeny" = "$ipdeny" ]

        then

          checker=1;

        fi

   done

 

   if [ "$checker" = 0 ]

   then

     iptables -t filter -A fdenyall -s $iptodeny -p tcp --dport 443 -j DROP

   fi

 

done

 

# Desbloqueia os IPs que nao estao mais no arquivo hosts.temp

 

for ipdeny in $(echo "$denied"); do

checker=0

 

   for iptodeny in $(echo "$hosts"); do

        if [ "$ipdeny" = "$iptodeny" ]

        then

          checker=1;

        fi

   done

 

   if [ "$checker" = 0 ]

   then

     iptables -t filter -D fdenyall -s $ipdeny -p tcp --dport 443 -j DROP

   fi

 

done       

Notas:

ü  Na primeira linha em negrito, a variável “$hosts” recebe o caminho do arquivo hosts.temp. Caso tenha criado o arquivo em um caminho diferente, lembre-se de alterar.

ü  A chain “fdenyall” (em negrito no quadro acima) foi criada especialmente para conter as regras do iptables criada pelo script stop.sh e seu objetivo maior é de organização. No Seu lugar é possível usar a chain padrão do iptables FORWAD. Porém mesmo assim, recomendamos o uso da chain fdenyall, sua tabela do iptables ficará mais organizada, tornando o gerenciamento do iptables mais intuitivo.

Para quem optar por usar a chain “fdenyall” (recomendado), terá que criá-la no iptables, para isto edite o arquivo /etc/rc.local e adicione as seguintes linhas:

# vim /etc/rc.local

#!/bin/sh -e

#

# rc.local

#

# This script is executed at the end of each multiuser runlevel.

# Make sure that the script will "exit 0" on success or any other

# value on error.

#

# In order to enable or disable this script just change the execution

# bits.

#

# By default this script does nothing.

 

# Criar o chain fdenyall

iptables -t filter -N fdenyall

iptables -t filter -I FORWARD 1 -j fdenyall

 

exit 0

Notas:

ü  O arquivo “rc.local” é um script que é executado toda vez que o sistema é inicializado, isto garante que a chain “fdenyall” seja criada a cada inicialização do servidor, visto que o iptables limpa suas regras quando o sistema é desligado.

ü  Adicione somente as linhas em negrito, o restante do conteúdo já faz parte do arquivo.

ü  A segunda linha em negrito cria a chain, enquanto que a terceira cria o pulo da chain “FORWARD” para a chain “fdenyall”

ü  Depois de inserir as linhas ao arquivo, execute o “rc.local” para criar a chain “fdenyall”, então execute:  # /etc/rc.local

Com o script “stop.sh” e a chain “fdenyall” criados, podemos reiniciar o serviço do cron, fazendo com que as modificações feitas anteriormente entrem em vigor. Para isto execute o comando:

# /etc/init.d/cron restart

§  Testando

Até aqui tudo está pronto, vamos apenas revisar e testar o que foi feito.

Para prosseguir com os testes, revise os passos abaixo:

1.       Criar os scripts “monitor.sh” e “stop.sh” para identificar a bloquear a utilização do UltraSurf;

2.       Editar o arquivo “crontab” (/etc/crontab) inserindo os períodos de execução dos scripts;

3.       Criar a chain “fdenyall” e garantir que ela seja criada a cada inicialização do sistema (modificar o rc.local);

4.       Reiniciar o cron.

O primeiro teste a ser feito é verificar se os arquivos “historico.log”, “monitor.temp” e “hosts.temp” foram criados. No nosso exemplo, estes arquivos são criados no caminho “/etc/scripts/ultrasurf/log”. Caso eles não sejam criados, verifique o cron e cheque todos os procedimentos feitos anteriormente.

Agora execute o UltraSurf de alguma estação da rede local e após algum tempo (aproximadamente 5 minutos) verifique o conteúdo dos arquivos “historico.log”, “monitor.temp” e “hosts.temp”, eles devem conter o IP da estação que está executando o UltraSurf. Execute também o comando:

# iptables –t filter –L fdenyall

A saída deste comando também deve apresentar o IP da estação que executa o programa. Pronto, se tudo der certo, não será mais possível navegar usando o UltraSurf na estação de teste. Feche o programa e aguarde aproximadamente 5 minutos, e tente abrir um site de banco ou algum outro que use HTTPS, se o site abrir, representa que o UltraSurf está sendo bloqueado com sucesso.

 

Autor: Giovani M. Soares

.