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