Usando o Awk para procurar o Bro Log de IPs / palavras-chave encontradas no arquivo de texto on-line

1

Estou examinando os logs do Bro e gostaria de encontrar uma maneira de usar o AWK para capturar IPs de um link e pesquise os logs do Bro para esses IPs automaticamente, imprimindo os resultados de cada correspondência no arquivo [custom-name].txt .

MAIS INFORMAÇÃO:

Eu sou novo no awk, mas tentando juntar as coisas. Eu não estou comprometido com o awk se existe uma maneira melhor de fazer isso. Eficiente seria bom.

Agora eu estou usando manualmente uma função do Excel para concatenar a coluna de IPs ruins (que são atualizados regularmente a partir do link) em uma string OR super longa do awk:

cat http* | awk '/123\.456\.789\.012/ || /2nd IP/ || /3rd IP/' | sort -n > file.txt

Atualmente, o http.log tem os cabeçalhos normais de Bro ... TS UID ID.orig_hID.orig_p etc.

Em termos leigos, o que estou tentando fazer é:

If the IP on line 1 of link is found in http.log, print results to line_1_ip.txt, If the IP on line 2 of link is found in http.log, print results to line_2_ip.txt, et al.

Um snippet dos IPs seria parecido com:

#############################################################################################
# abuse.ch ZeuS IP blocklist "BadIPs" (excluding hijacked sites and free hosting providers) #
#                                                                                           #
# For questions please refer to https://zeustracker.abuse.ch/blocklist.php                  #
#############################################################################################

103.230.84.239
103.241.0.100
103.26.128.84
103.4.52.150
103.7.59.135
104.218.48.99
104.219.232.12
104.236.55.19
107.150.58.84
108.61.193.211

É apenas um arquivo de texto.

Quando se trata de realmente referenciar uma página remota para obter IPs, não tenho a certeza de onde começar. Mas se eu conseguir fazer isso de um arquivo de texto local, isso me dará um ponto de partida para trabalhar.

    
por user112802 02.05.2015 / 09:43

2 respostas

0

Não tenho muita certeza do que você deseja analisar, pois ainda não vi o formato de entrada, mas, se você quiser apenas ler uma lista de IPs e imprimir no arquivo de saída correspondente, tente:

awk 'NR==FNR{a[$1]=NR; next} {
    for(ip in a){ 
        if($0~ip){ 
            print >> "line_"a[ip]"_ip.txt" 
        } 
    }
}}' <(wget -O - "https://zeustracker.abuse.ch/blocklist.php?download=badips" 2>/dev/null | 
    grep -Ev "#|^ *$") http.log 

Isso é um pouco complexo, então vamos dividi-lo:

  • wget -O - https://zeustracker.abuse.ch/blocklist.php?download=badips 2>/dev/null | grep -Ev "#|^ *$" : isso fará o download da lista de IPs, removerá qualquer linha que contenha # ou esteja vazia e imprima na saída padrão.
  • <(command) : Isso é chamado de substituição de processo e é um truque que algumas conchas (bash, zsh e ksh, mas talvez outros também) têm o que permite tratar a saída de um processo como um arquivo de entrada para outro comando.
  • Portanto, o awk snipet vê dois "arquivos", o primeiro é a saída do comando wget canalizado através de grep e o segundo é o arquivo http.log .
  • NR==FNR{a[$1]=NR; next} : NR é o número da linha de entrada atual e FNR é o mesmo, mas o arquivo atual . Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Isto irá, portanto, criar a matriz a cujas chaves são os IPs e cujo valor é o número da linha atual.
  • for(ip in a) : iterar sobre a matriz a , salvando cada uma de suas chaves (os IPs) como ip .
  • if($0~ip){} : se essa linha ( $0 ) corresponder a esse ip .
  • print >> "line_"a[ip]"_ip.txt" : imprime a linha em um arquivo chamado line_ , o número da linha de entrada em que esse IP foi visto e _ip.txt . O >> garante que o arquivo seja anexado e não seja sobrescrito.
por 04.05.2015 / 16:26
0

Observe que bro vem com bro-cut para extrair dados de seus arquivos de log.

Você poderia fazer:

bro-cut id.orig_h id.resp_h < conn.log | grep -wFf <(
  curl 'https://zeustracker.abuse.ch/blocklist.php?download=badips' |
  grep '^[^#]'
)

com awk :

awk '
  NR == FNR {
    if (/^[^#]/) bad[$0]=""
    next
  }
  ($1 in bad) || ($2 in bad)
' <(curl 'https://zeustracker.abuse.ch/blocklist.php?download=badips') \
  <(bro-cut id.orig_h id.resp_h < conn.log)

(mais eficiente como o uso de tabelas hash, em vez da correspondência meticulosa de strings em um loop).

Observe também que o conjunto de regras de ameaças emergentes tem regras que rastreiam as listas de rastreadores do Zeus (e outras). Então, se você usar o snort / surricata com esse conjunto de regras, além dos bro-ids, fazê-lo com o bro acabaria sendo redundante.

    
por 04.05.2015 / 16:37