regex fail2ban não correspondente

3
Devo admitir, os regex sempre foram um ponto fraco para mim. Eu nunca me sentei e gastei tempo suficiente aprendendo-os a usá-los efetivamente. No entanto, eu realmente estou perdendo por que isso não está combinando. Eu estou tentando fazer um failregex personalizado para impedir que as pessoas tentem explorar qualquer erro xmlrpc.php (e eles estão constantemente brute-forcing em uma tentativa de fazê-lo).

Estou usando o fail2ban v0.9.3, com o Apache 2.4.18 no Ubuntu 16.04.2.

Aqui está o meu regex:

<HOST> - - \[\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} +\d{4}\] "POST /xmlrpc.php HTTP/1.0" 200

E aqui está uma linha de exemplo que não corresponde (IP substituído por 0s):

0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php HTTP/1.0" 200 752 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

Não consigo entender por que não está combinando. Tanto quanto eu posso dizer, isso deve ser uma correspondência exata. Alguém pode lançar alguma luz?

Além disso, seria bom ter a correspondência de deslocamento de fuso horário para os sinais a + e a - ... e acho que substituir HTTP/1.0 por HTTP/1.\d{1} deve corresponder a 1.0 e 1.1, correto? / p>

Obrigado antecipadamente!

EDIT: Depois de brincar na linha de comando com o fail2ban-regex, descobri que com um regex de <HOST> - - \[ ele corresponderá a todas as linhas. No entanto, o segundo eu altero para <HOST> - - \[\d{2} não corresponde a nenhuma linha. Isso não parece fazer sentido!

EDIT 2: Bem, nesse meio tempo, estou usando <HOST> - - \[.* "POST /(xmlrpc|wp-login).php HTTP/1.\d" 200 e isso está combinando as linhas que eu quero. No entanto, eu ainda adoraria saber por que meu original não é compatível, pois prefiro usar um regex mais específico do que o amplo que estou usando agora.

    
por Aurelius 06.04.2017 / 10:10

2 respostas

2

Após algumas iterações com fail2ban-regex , acho que o que acontece é que o fail2ban tenta escolher a data a partir da própria linha de log, antes de testá-la em seu padrão de filtro.

$ line='0.0.0.0 - - [06/Apr/2017:07:45:42 +0000] "POST /xmlrpc.php'

Com .* no lugar do registro de data e hora, ele corresponde, mas, como você percebeu, a procura explícita de um número no início do registro de data e hora não corresponde:

$ ./fail2ban-regex "$line"  '<HOST> - - \[.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

$ ./fail2ban-regex "$line"  '<HOST> - - \[\d+.*\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 0 matched, 1 missed

Mas veja isto:

$ ./fail2ban-regex "$line"  '<HOST> - - \[ \+0000\].*POST /xmlrpc' |grep ^Lines
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

Eu removi todo o timestamp do padrão, em vez disso, esperei que ele estivesse vazio (há apenas o indicador de fuso horário). Ele ainda corresponde, insinuando que o fail2ban na verdade remove o registro de data e hora antes de testar o padrão na configuração.

Assim, talvez seja melhor deixar essa parte fora do padrão de filtro e corresponder a qualquer coisa no lugar do carimbo de data / hora:

<HOST> - - \[.*?\] "POST /xmlrpc.php HTTP/1.0" 200

Como uma nota secundária, o seu RE original tem um + sem aspas, onde o registro de data e hora começa, o sinal de mais significa "pelo menos uma repetição do elemento anterior", então você precisa escapar dele.

    
por 06.04.2017 / 15:53
5

Experimente este regex - testei-o com regexr.com e está definitivamente a ser correspondido:

<HOST> - - \[\d{2}\/\w{3}\/\d{4}(:\d{2}){3} \+0000\] "POST \/xmlrpc.php HTTP\/1.0" 200

Um dos problemas não foi escapar das barras - isso precisa ser feito.

EDIT (depois que eu vi sua edição): Eu tentei simplificá-lo um pouco e surgiu com isso que combina:

failregex = ^<HOST> - - \[.*\] "POST \/xmlrpc.php.*$

Não é exatamente o que você queria, mas funciona

    
por 06.04.2017 / 11:02