Разбор вывода nmap -oG с использованием sed - PullRequest
1 голос
/ 11 октября 2019

У меня есть файл журнала

...
Host: 111.222.121.123 (111.222.121.123.deploy.static.akamaitechnologies.com) Ports: 80/open/tcp//http//AkamaiGHost (Akamai's HTTP Acceleration|Mirror service)/, 443/open/tcp//ssl|http//AkamaiGHost (Akamai's HTTP Acceleration|Mirror service)/
Host: 1.2.3.4 ()  Ports: 80/open/tcp//http//cloudflare/, 443/open/tcp//ssl|https//cloudflare/, 2052/open/tcp//clearvisn?///, 2053/open/tcp//ssl|http//nginx/, 2082/open/tcp//infowave?///, 2083/open/tcp//ssl|http//nginx/, 2086/open/tcp//gnunet?///, 2087/open/tcp//ssl|http//nginx/, 2095/open/tcp//nbx-ser?///, 2096/open/tcp//ssl|http//nginx/, 8080/open/tcp//http-proxy//cloudflare/, 8443/open/tcp//ssl|https-alt//cloudflare/, 8880/open/tcp//cddbp-alt?///
Host: 2.3.4.5 (a104-96-1-61.deploy.static.akamaitechnologies.com)   Ports: 53/open/tcp//domain//(unknown banner: 29571.61)/
...

Мне нужно извлечь и преобразовать IP-адреса и порты http в следующий формат

1.2.3.4:80,443,2083

Существует только два типа порта полей в лог-файле

80/open/tcp//http
2083/open/tcp//ssl|http

Пытался использовать sed, но безуспешно. Я закончил с этой дисфункциональной командой

cat ../host_ports.txt | sed -rn 's/Host: ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*?([0-9]{1,5}\/open\/tcp\/\/http|[0-9]{1,5}\/open\/tcp\/\/ssl\|http).*/\1 \2/p'

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Сначала обработайте повторяющиеся порты, а затем замените хост / порт на нужный формат.

sed -r 's/(Ports:|,) ([0-9]*)[^,]*/\1\2/g;s/Host: ([^ ]*).*Ports:/\1:/' ../host_ports.txt

РЕДАКТИРОВАТЬ: Сначала я дал все порты строки с http где-то, теперь ограничить результат для портов сhttp в своем описании.

sed -nr 's/Ports: /, /;
         s/, ([0-9]*)[^,]*http[^,]*/,\1/g;
         s/,[^,]*\/[^,]*//g;
         s/Host: ([^ ]*)[^,]*,/\1:/p'       ../host_ports.txt
1 голос
/ 11 октября 2019

Этот скрипт сделает это за вас, и вам не нужно sed:

#!/bin/bash

while read -r line; do
    if echo $line | grep -q "http"; then
        host=$(echo "$line" | grep -Po '(?<=^Host: )[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
        ports=$(echo "$line" | grep -Po '[0-9]*((?=\/open\/tcp\/\/http)|(?=\/open\/tcp\/\/ssl\|http))' | tr '\n' ',')
        echo "$host:${ports:0:-1}"
    fi
done < ../log

Первый grep перехватит IP-адрес с помощью Взгляд назад . -P должен использовать perl-подобный регулярному выражению, а -o - выводить только совпадающую строку

. Второе регулярное выражение очень похоже на первое, но вместо оглядки используется заглядывание. Он будет захватывать только порты, за которыми следуют /open/tcp//http или /open/tcp//ssl|http. tr сразу после этого заменит символы новой строки запятыми.

${ports:0:-1} просто для удаления запятой.

Надеюсь, это поможет!

...