IPTABLES bloquear usuário-agente

1

Eu recebo DDoS pelo Wordpress Pingback BOTNET, agora eu quero bloquear todos os clientes que contiverem Wordpress nos Useragents. Por exemplo:

WordPress/4.0; http://vk.lokos.net; verifying pingback from 107.158.239.82

Eu preciso bloquear tanto a porta HTTP 80 quanto a porta HTTPS 443. Como posso fazer isso?

    
por user3135461 10.05.2015 / 00:38

2 respostas

4

Primeiro: Você não quer fazer desta forma , como descrevemos abaixo.

Segundo: um problema muito semelhante é respondido aqui link . Estou transmitindo sua solução para sua pergunta específica. Há um módulo iptables string que você pode usar para corresponder ao agente do navegador. No entanto, o iptables irá inspecionar todos os pacotes ... nós podemos otimizar isso com o módulo connmark . Eu não tentei, então minha resposta é apenas um empurrão na direção certa:

<other rules>
iptables -t mangle -A PREROUTING -m connmark --mark 0xBAD1 -j DROP
iptables -t mangle -A PREROUTING -m connmark --mark 0xBAD0 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "User-Agent: " -j CHECK_UAGENT
iptables -t mangle -A CHECK_UAGENT -m string --string "User-Agent: WordPress/4.0" -j CATCH
iptables -t mangle -A CHECK_UAGENT -j CONNMARK --set-xmark 0xBAD0
<otherrules>
iptables -t mangle -N CATCH 
iptables -t mangle -A CATCH -j LOG --log-level alert --log-prefix "WordPress attack "
iptables -t mangle -A CATCH -j CONNMARK --set-xmark 0xBAD1
iptables -t mangle -A CATCH -j DROP

Aqui está a ideia. O módulo connmark e o alvo associado marcarão um pacote como você deseja, e quaisquer pacotes subsequentes nesse fluxo de conexão serão marcados de maneira semelhante. Então, procuramos por pacotes direcionados para a porta 80 e temos uma string "User Agent". Se eles tiverem o indesejável User Agent, nós o marcaremos como 0xBAD1 - blaclisting it. Nós então registramos e soltamos. Caso contrário, quando virmos "Agente do usuário", mas não o indesejável, ele será colocado na lista de permissões com 0xBAD0. Com a lista branca, reduzimos a carga no inspetor de pacotes (é uma etapa de otimização). Caso contrário, estaríamos pesquisando em todos os pacotes de cada imagem enviada - um desperdício inútil.

** Por que o acima é uma má idéia ** Um: HTTPS não pode ser decodificado no nível do filtro de pacotes. Dois: porque um ataque DDOS com o acima é possível. A conexão começa, abre uma conexão no seu servidor web, então desaparece (do ponto de vista do seu servidor web). Ele irá esperar por um longo tempo antes de desistir do cliente, que não pode mais receber mais pacotes. Enquanto isso, mais tentativas aparecerão. Eventualmente, o HTTP ficará sem recursos e as solicitações no passarão. (Uma maneira de corrigir esse problema é usando o módulo recent . Uma maneira mais completa é ter um processo monitorando o arquivo de log para "ataque do WordPress", fazendo com que observe o IP e a porta remotos e forçando a conexão a ser fechado com cortador , ou cruzando essa conexão com o servidor PID associado a ele e, em seguida, matar esse processo.)

Uma pergunta semelhante foi colocada e respondida com: use um proxy reverso. Essa é a melhor opção, mas requer muita reconfiguração e talvez um servidor intermediário.

Faça desta maneira Use mod_rewrite (no Apache / * ngnx) para corresponder à string User-Agent, defina uma variável de ambiente para fins de registro e retorne o status de erro 403. Isso fecha o lado remoto. Agora, para torná-lo mais permanente, tenha um processo separado que monitore esse arquivo de log para essas conexões descartadas, e adicione o ip remoto à tabela recent , da qual o iptables soltará novas conexões nos próximos 5 minutos. Então ...

# Apache config
RewriteCond %{HTTP_USER_AGENT}  ^WordPress/4\.0
RewriteRule - [L,R=403,E=WordPress]
LogFormat "%t\t%a\t%{remote}p\t%{User-Agent}i"
CustomLog wordpress wordpress.log env=WordPress

O formato de log personalizado facilita a decodificação do processo externo. o IPtables é apenas uma regra:

iptables -A INPUT --syn -m recent --name WordPress --rcheck --seconds 300 -j DROP

e o processo externo (executando como root) é assim:

#!perl 
open(STDIN,"tail -f /var/log/http/wordpress.log|")
while (<>) {
   my ($time,$ip,$port,$useragent)=split('\t');
   open(RECENT,"> /proc/net/xt_recent/WordPress")
   print RECENT "+$ip\n"
   close RECENT
}

A cadeia de data e hora e o agente do usuário são apenas para que você possa verificar se as coisas estão funcionando / não funcionando conforme o esperado. Acrescentarei que, com o modo de reescrever mods, você tem muito mais flexibilidade para rejeitar / banir.

    
por 10.05.2015 / 02:12
1

A execução dos seguintes comandos bloqueará esse ataque específico:

iptables -N Wordpress-PingVerify
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /' -j Wordpress-PingVerify
iptables -A Wordpress-PingVerify -p tcp --dport 80 -m string --to 80 --algo bm ! --string 'User-Agent: WordPress/' -j RETURN
iptables -A Wordpress-PingVerify -p tcp --dport 80 -m string --to 300 --algo bm --string 'verifying pingback from' -j DROP
iptables -A Wordpress-PingVerify -j RETURN

As regras acima presumem que o ataque é destinado a HTTP (porta 80), se você estiver sendo atingido por HTTPS, altere a porta 443 (ou você pode usar multiportas para especificar ambas as portas 80 e 443).

Como alternativa, você pode usar essas regras para bloquear todas as solicitações de pingback do WordPress. Isso bloqueia não apenas as verificações de pingback, mas também as de pingbacks:

iptables -N Wordpress-PingBacks
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /' -j Wordpress-PingBacks
iptables -A Wordpress-PingBacks -p tcp --dport 80 -m string --to 80 --algo bm ! --string 'User-Agent: WordPress/' -j RETURN
iptables -A Wordpress-PingBacks -p tcp --dport 80 -j DROP
iptables -A Wordpress-PingBacks -j RETURN

Fonte: link

    
por 30.07.2016 / 16:30