Como bloquear pontos "." em uma regra do iptables?

Como bloquear pontos "." em uma regra do iptables?

Eu tenho esta regra no meu iptables para bloquear domínios que terminam com .watch:

sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp

Mas o problema é que .não pode ser igualado. Portanto, a linha acima não corresponde a nada. Mas se eu remover o ponto, .watchtudo watchfuncionará bem.

Como posso bloquear os pontos "." nas regras do iptables?

Responder1

Sintaticamente, isso parece correto, mas sua abordagem não é adequada para esse propósito. Opatch de cordacorresponde a uma string em qualquer lugar do pacote:

  • Você está descartando qualquer pacote que tenha watchou .watchem qualquer lugar. É provável que isso cause falsos positivos e até introduza um novo vetor para ataques de negação de serviço.
  • Ele não consegue lidar com tráfego criptografado. Não é possível bloqueara maior parte do tráfego da web.
  • Embora você tenha opções relativamente boas para o algoritmo de correspondência ( bmBoyer–Moore & kmpKnuth–Pratt–Morris), o uso do filtro de string ainda pode exigir muita computação.

A documentação também alerta explicitamente contra isso:

Por favor, use esta partida com cautela. Muita gente quer usar essa combinação para parar worms, junto com o alvo DROP. Este é um grande erro. Seria derrotado por qualquer método de evasão de IDS.

De maneira semelhante, muitas pessoas têm usado essa correspondência como um meio de interromper funções específicas em HTTP, como POST ou GET, descartando qualquer pacote HTTP contendo a string POST. Por favor, entenda que este trabalho é melhor executado por um proxy de filtragem. Além disso, qualquer conteúdo HTML com a palavra POST seria eliminado com o método anterior. Esta correspondência foi projetada para ser capaz de enfileirar pacotes interessantes para o usuário para melhor análise, só isso. A eliminação de pacotes com base nisso seria anulada por qualquer método de evasão de IDS.

Existem alternativas melhores para o que você está tentando alcançar:

  • Filtragem baseada em DNS. Qualquer servidor DNS pode fazer isso. Por exemplo,Dnsmasqé um encaminhador DNS leve e comum: você pode simplesmente adicionar address=/watch/0.0.0.0à sua configuração.
  • Filtragem baseada em proxy da Web.

Responder2

Os nomes DNS são codificados como rótulos com prefixo de comprimento (consulteRFC 1035para obter detalhes), então você precisa usar --hex-string "|05|watch|00|"para corresponder nomes que terminam em .watch(observe que o comprimento é escrito como 2 dígitos hexadecimais, por exemplo, serverfault.comseria codificado como "|0b|serverfault|03|com|00|"). Observe que isso deve ser combinado com -p udpe --destination-port 53(ou 5353 se corresponder .localaos endereços), caso contrário, é provável que corresponda a muitos outros pacotes não relacionados.

Consultas de DNS também podem ser feitas por TCP, mas a filtragem de TCP é mais complexa e os comentários existentes sobre solicitações criptografadas e sugestões sobre o uso de filtragem em nível de aplicativo com um DNS e/ou proxy da web ainda se aplicam.

informação relacionada