Eu preciso extrair o endereço IP e o caminho do arquivo de um relatório do Nessus usando um manipulador de texto

1

EuprecisoextrairoendereçoIPeocaminhodoarquivodeumrelatóriodoNessususandomanipuladoresdetextocomoGrep/Awk/Sed/Tretc....

EutenhooscriptparaisolaroendereçoIPeocaminhodoarquivo,masprecisolidarcomotextoaindamaiseremoveraversãoremota"não foi corrigida ..."

192.168.1.1   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.2 THE REMOTE HOST IS MISSING ONE OF THE FOLLOWING ROLLUP KBS :   - 4022719  - 4022722C:\WINDOWS\SYSTEM32\BCRYPT.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.1.7601.23796    SHOULD BE      : 6.1.7601.23816"

192.168.1.3   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.4   - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE HAS NOT BEEN PATCHED.    REMOTE VERSION : 2014.120.5000.0    SHOULD BE      : 2014.120.5203.0"

Portanto, o resultado final deve mostrar o seguinte dos exemplos acima:

192.168.1.1 \ WINDOWS \ SYSTEM32 \ GPPREF.DLL

192.168.1.2 \ WINDOWS \ SYSTEM32 \ BCRYPT.DLL

192.168.1.3 \ WINDOWS \ SYSTEM32 \ GPPREF.DLL

192.168.1.4 \ ARQUIVOS DE PROGRAMA \ MICROSOFT SQL SERVER \ MSSQL12.ACT7 \ MSSQL \ BINN \ SQLSERVR.EXE

Meu script até agora:

! / bin / bash

* se ["$ 1" == ""]; então

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

else

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | grep "has not been patched." | sort -u | awk '{ match($0,/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*[cC]:\(.*) has.*/; ip=substr $0,RSTART,RLENGTH);print ipadd ip} '

*

A seção do código abaixo manipula o texto para os exemplos acima, com US $ 5 imprimindo o endereço IP e US $ 13 imprimindo o caminho do arquivo:

! / bin / bash

if ["$ 1" == ""]; então

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

else

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | 

grep "não foi corrigido." | sort -u *

O segundo cano do awk

awk '{match ($ 0, / ([0-9] +. [0-9] +. [0-9] +. [0-9] +). [cC]: \ (. ) tem. * / *

tem o regex correto para combinar com a saída que eu preciso (veja foto), mas estou tendo um problema com a impressão da saída regex'd

Qual é essa linha:

ip = substr $ 0, RSTART, RLENGTH); print ipadd ip} ' *

Ponto de bônus:

A regex IP corresponde a qualquer dígito, então 192.168.1.1 / 1.1.1.1, mas também corresponde aos números de versão nos exemplos acima (2014.120.5203.0), idealmente, eu preciso modificar este regex: * [0-9] +. [0-9] +. [0-9] +. [0-9] + *

para restringi-lo a 0.0.0.0 - > 255.255.255.255

    
por Matt 03.08.2017 / 15:21

4 respostas

1

sed solução:

sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\.+) *HAS NOT BEEN PATCHED.*/ - /' reportfile
    
por 03.08.2017 / 15:48
0
 sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/ - /p} ' filename

Concentre-se nas entradas que "NÃO FOI PATCHED" e, em seguida, retire as seções da string que exigimos (entre parênteses), substituindo o texto por seções on e dois (o endereço IP e o nome do arquivo)

Estou assumindo que o endereço IP sempre estará entre colchetes aqui. Se não for, você precisará combinar o padrão para o endereço IP.

    
por 03.08.2017 / 16:12
0
$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
                  s/^(\[[^]]*\]).*([A-Z]:)/ - /;
                  s/ HAS NOT BEEN PATCHED.*//p}' nessus.log
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\WINDOWS\SYSTEM32\BCRYPT.DLL
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE

Para cada linha que corresponda a HAS NOT BEEN PATCHED , tire tudo entre o endereço IP e a primeira letra da unidade ( [A-Z]: ). O "Endereço IP" é definido como tudo dentro dos colchetes no início da linha que não é um colchete próximo ( [^]]* ). Em seguida, tire tudo de HAS NOT BEEN PATCHED até o final da linha e imprima a linha modificada.

Minha recomendação seria usar um caractere de tabulação \t como o separador de campo entre o endereço IP e o nome do caminho, em vez de - (espaço, traço, espaço). Isso facilitaria o trabalho com mais tarde.

As regexps / HAS NOT BEEN.../ incluem um espaço no início para evitar deixar um caractere de espaço pendente na saída.

    
por 03.08.2017 / 16:13
0

Solução Awk:

awk '/HAS NOT BEEN PATCHED/ { match($0,/\[.*\]/);ipadd=substr($0,RSTART,RLENGTH);match($0,/C.* HAS/);fle=substr($0,RSTART,RLENGTH-4);print ipadd" - "fle }' filename

Correspondência de padrões contra "NÃO FOI PATCHED" e, em seguida, extrai o endereço IP e o nome do arquivo com a função de correspondência do awk. Atinge a subseção da cadeia que está relacionada ao endereço IP e ao nome do arquivo usando as variáveis RSTART e RLENGTH retornadas, juntamente com a função substr do awk. Imprima as variáveis ipadd e fle criadas.

    
por 03.08.2017 / 16:30