Press "Enter" to skip to content

Mitigando tráfego malicioso originado da rede TOR

Rede TOR

A rede Tor foi originalmente desenvolvida por pesquisadores da US Naval Research Laboratory e atualmente mantida pelo Electronic Frontier Foundation (EFF)[1], ela foi criada com o objetivo de ser uma rede destinada a prover comunicação anônima com a finalidade de proteger a privacidade dos usuários.

Entretanto, a rede TOR tem sido utilizada por atores maliciosos como vetor para diversos tipos de ataque[2] como:

  • DDoS
  • Distribuição de Malware ( e.g. OnioDuke)[3]
  • C&C (e.g. LusyPOS)[4]
  • Botnet (e.g. Sefnit)[5]
  • Brute-force

Segundo a Cloudflare[6], 94% das requisições originadas dos exits nodes da rede TOR podem ser classificadas como maliciosas.

Tor Exit Nodes

Os exit nodes da rede TOR são gateways de onde saem o tráfego para Internet,  a arquitetura da rede dificulta a identificação de onde o tráfego foi originado. Vale resaltar que o tráfego de saída dos exit nodes não é encriptado, possibilitando a identificação ou captura de informações.

Fonte: SecurityFairs

O gráfico abaixo apresenta a localização geográfica dos exit nodes conforme dados apresentados pela Hacker Target.

Fonte: HackerTarget

O grande desafio é, como bloquear requisições originadas da rede TOR sem recursos para investir em serviços pagos como Cloudflare e segurança de borda NextGeneration?

Cenário

Pense no cenário onde você tem um servidor hospendando uma aplicação exposta para Internet sem Web Application Firewall e apenas com os recursos do sistema operacional, esse cenário se torna bastante desafiador para mitigar requisições maliciosas originadas de redes tão complexas e dinâmicas como a rede TOR.

Com base neste cenário, realizei testes com o objetivo de identificar e bloquear requisições originadas de exit nodes usando apenas os recursos disponibilizados pelo sistema operacional Linux e serviços existentes.

Abordagens “na unha” para bloquear requisições de exit nodes

Irei utilizar a lista disponibilizada pelo site https://www.dan.me.uk/torlist/ como fonte para obter os IPs dos exit nodes, essa lista é atualizada a cada 30 min.

Solução 1 – Iptables

Neste primeiro teste obtive a lista dos IPs filtrando apenas os IPv4 e criando regras de bloqueio na chain TOR_NODE do Iptables, para isso criei um script que será executado a cada 40 min. Como referência usei um script disponibilizado no site Security Online[7] adequando à minha necessidade.

#!/bin/bash
RULE="DROP"
CHAIN="TOR_NODE”
CMD=$(cat /home/jdoe/Reseach/TorBlock/full.tor | uniq | sort)
if ! iptables -L TOR_NODE -n >/dev/null 2>&1 ; then
iptables -N TOR_NODE >/dev/null 2>&1
iptables -A INPUT -p tcp -j TOR_NODE 2>&1
fi
cd /home/jdoe/Research/TorBlock
touch /home/jdoe/Research/TorBlock/full.tor
wget -q -O - https://www.dan.me.uk/torlist/ > /home/jdoe/Research/TorBlock/full.tor
sed -e '/^#/d' -e '/:/d' /home/jdoe/Research/TorBlock/full.tor
iptables -F TOR $CMD
for IP in $CMD; do
let COUNT=COUNT+1
iptables -A TOR -s $IP -j DROP
done

Saída do iptables após a execução do script:

jdoe@ninahartley:~$ sudo iptables -L --line-numbers -n
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
4 TOR_NODE tcp -- 0.0.0.0/0 0.0.0.0/0

Chain TOR_NODE (1 references)
num target prot opt source destination
1 DROP all -- 100.12.87.114 0.0.0.0/0
2 DROP all -- 100.14.174.187 0.0.0.0/0
3 DROP all -- 100.34.61.24 0.0.0.0/0
4 DROP all -- 100.40.215.157 0.0.0.0/0
...
6400

Essa solução funciona, entretanto foram criadas 6400 (seis mil e quatrocentas) regras de bloqueio na chain TOR_NODE, isso pode impactar na performance do servidor pois elas ficam armazenadas em memória.

Solução 2 – Framework Ipset

O ipset é um framework que atua em conjunto com o iptables para a criação e manutenção de listas de IPs, MACs e portas TCP/UDP.

Neste teste segui o mesmo príncipio da solução 1, só que utilizando o ipset para auxiliar no amazenamento dos IPs.

#!/bin/bash
URL="https://www.dan.me.uk/torlist/"
CMD=$(cat /home/jdoe/Research/TorBlock/full.tor | uniq | sort)

ipset create tor-nodes iphash
touch /home/jdoe/Research/TorBlock/full.tor
wget -q -O - https://www.dan.me.uk/torlist/ > /home/jdoe/Research/TorBlock/full.tor
sed -e '/^#/d' -e '/:/d' /home/jdoe/Research/TorBlock/full.tor
for IP in $CMD; do
let COUNT=COUNT+1
ipset -q -A tor-nodes $IP
iptables -A INPUT -m set --match-set tor-nodes src -j DROP
done

Essa abordagem é bacana porém não funcionou corretamente comigo, mesmo com a regra criada foi possível acessar a aplicação via TOR. Entendo que posso ter errado na lógica=(, só que mesmo após vários testes os resultados não foram 100% efetivos.

Solução 3 – Apache e/ou Nginx

É possível realizar o bloqueio diretamente no servidor Web Apache ou Nginx. Uma arqutetura interessante é por o Nginx como proxy reverso antes da aplicação, dessa forma a requisição não chegará ao backend reduzindo o consumo de recursos.

Para manter a lista atualizada crei um script que será executado a cada 40 min.

Para o Apache

#!/bin/bash

TMP=/tmp/torip.conf
FINAL=/home/jdoe/Research/torip.conf
URL=https://www.dan.me.uk/torlist/

curl $URL -o $TMP
sed 's/^/Require not ip /' $TMP > $FINAL

Para o Nginx

#!/bin/bash

TMP=/tmp/torip.conf
FINAL=/home/jdoe/Research/torip.conf
URL=https://www.dan.me.uk/torlist/

curl $URL -o $TMP
sed -e 's/^/deny /' -e 's/$/;/' $TMP > $FINAL

#No Nginx o serviço precisa ser recarregado a cada atualização
systemctl reload nginx

No Apache, adicionei a seguinte entrada no arquivo apache2.conf (Debian) ou httpd.conf (RedHat/CentOS)

<Location />
    <RequireAll>
           Require all granted
           Include /home/jdoe/Reseach/torip.conf    </RequireAll>
</Location>
No Nginx adicionei os seguintes parâmetros no arquivo nginx.conf
include /home/jdoe/Reseach/torip.conf;

location / {      include /home/jdoe/Reseach/torip.conf;
}

Bloqueio em funcionamento

Conclusão

Dentre as soluções testadas, o uso do Apache ou Nginx se mostrou o mais elegante entre as outras opções testadas.

Implementei em produção e está funcionando perfeitamente =).

Referências

[1] https://www.torproject.org/about/history/

[2] https://github.com/Attacks-on-Tor/Attacks-on-Tor

[3] https://www.securityweek.com/onionduke-apt-malware-distributed-malicious-tor-exit-node

[4] https://www.securityweek.com/new-lusypos-malware-uses-tor-cc-communications

[5] https://threatpost.com/shedding-new-light-on-tor-based-malware/104651/

[6] https://blog.cloudflare.com/the-trouble-with-tor/

[7] https://securityonline.info/block-tor-client-iptablesiptables-tor-transparent-proxy/

https://www.cisa.gov/uscert/ncas/alerts/aa20-183a

 

Comments are closed.