Как я могу разделить проанализированный текст на «блоки» текста? - PullRequest
2 голосов
/ 29 апреля 2020

Я пишу bash скрипт, который запускает сканирование Nmap сети. После этого необходимо проверить сканирование и извлечь соответствующие биты.

Мне нужно извлечь IP, MA C и ОС из завершенного сканирования. Проблема в том, что Nmap не всегда получает ОС из сканирования и поэтому не помещает ее в результаты. Мне нужно связать IP, MA C и ОС в конечном результате.

Вот пример тестового сканирования:

Nmap scan report for 192.168.0.1
Host is up (0.0029s latency).
Not shown: 990 closed ports
PORT      STATE SERVICE
PORT#    STATE    XXXXXXX
MAC Address: MA:CA:DR:ES:S0:03 (Unknown)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
OS details: Linux 2.6.32 - 3.13
Network Distance: 1 hop

Nmap scan report for 192.168.0.102
Host is up (0.0044s latency).
Not shown: 999 closed ports
PORT     STATE    SERVICE
PORT#    STATE    XXXXXXX
MAC Address: MA:CA:DR:ES:S0:02 (Sony Mobile Communications AB)
Too many fingerprints match this host to give specific OS details
Network Distance: 1 hop

Nmap scan report for 192.168.0.104
Host is up (0.00024s latency).
Not shown: 995 filtered ports
PORT     STATE SERVICE
PORT#    STATE XXXXXX
MAC Address: MA:CA:DR:ES:S0:01 (Micro-star Intl)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running (JUST GUESSING): Microsoft Windows 2008 (91%)
OS CPE: cpe:/o:microsoft:windows_server_2008::sp1 cpe:/o:microsoft:windows_server_2008:r2
Aggressive OS guesses: Microsoft Windows Server 2008 SP1 or Windows Server 2008 R2 (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

Также обратите внимание, что последний в приведенном выше примере не смог найти ОС, в этом случае требуется догадка агрессии

Конечным результатом должен быть текстовый файл, который имеет что-то вроде следующего:

192.168.0.1 - MA:CA:DR:ES:S0:03 - Linux 2.6.32 - 3.13
192.168.0.102 - MA:CA:DR:ES:S0:02 - Not found
192.168.0.104 - MA:CA:DR:ES:S0:01 - Microsoft Windows Server 2008 SP1 or Windows Server 2008 R2

Я провел некоторое исследование, но не смог найти ничего, что объясняет, как я могу связать IP с ма c адреса и ОС в текстовых блоках.

У меня есть следующие команды, которые работают с простым сканированием, где адреса IP и Ma c находятся рядом друг с другом

  while read line; do
    Mac="$(grep -oE '[A-Z0-9]{2}:[A-Z0-9]{2}:[A-Z0-9]{2}:[A-Z0-9]{2}:[A-Z0-9]{2}:[A-Z0-9]{2}' <<< "$line")"
    ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
    echo -e $ip'\t-\t '$Mac >>/path/to/results.txt
  done </path/to/testscan.txt

Я довольно новичок в сценариях bash, поэтому извиняюсь, если я упускаю что-то очевидное.

Команда nmap для всех заинтересованных лиц:

nmap -O --osscan-guess 192.168.0.0/24 -oN /path/to/testscan.txt

Извините за стену текста, я подумал, что чем больше информации, тем лучше!

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

Это было бы довольно легко разобрать с awk:

BEGIN {os_details="Not found"}

/^Nmap scan report/      {target=$5}
/^MAC Address/           {mac_address=$3}
/^OS details/            {os_details=substr($0, length("OS details: "))}
/^Aggressive OS guesses/ {
    os_details=substr($0, length("Aggressive OS guesses: "))
}

# This matches the blank lines between hosts
/^$/ {
    printf "%s - %s - %s\n", target, mac_address, os_details
    target=""
    mac_address=""
    os_details="Not found"
}

END {
    printf "%s - %s - %s\n", target, mac_address, os_details
}

Выполнение этого на ваших примерах данных дает вам:

192.168.0.1 - MA:CA:DR:ES:S0:03 -  Linux 2.6.32 - 3.13
192.168.0.102 - MA:CA:DR:ES:S0:02 - Not found
192.168.0.104 - MA:CA:DR:ES:S0:01 -  Microsoft Windows Server 2008 SP1 or Windows Server 2008 R2 (91%)

Я должен был сделать одну поправку к тому, что Я полагаю, что в ваших примерах данных произошла ошибка ... Я удалил пустую строку перед строкой MAC Address здесь:

Nmap scan report for 192.168.0.104
Host is up (0.00024s latency).
Not shown: 995 filtered ports
PORT     STATE SERVICE
PORT#    STATE XXXXXX

MAC Address: MA:CA:DR:ES:S0:01 (Micro-star Intl)
1 голос
/ 29 апреля 2020

Используя опцию -oX nmap (вывод в формат XML), анализ может быть более точным:

nmap -oX /path/to/testscan.xml ...
# or
nmap -oX - ... > /path/to/testscan.xml

Тогда вы можете использовать, например, xmllint проанализировать XML с XPath:

file="/path/to/testscan.xml"

get_details() {
    local file addr mac os
    file="$1"
    addr=$2
    mac=$(xmllint --xpath "string(//address[../address[@addr='$addr']][@addrtype='mac']/@addr)" "$file")
    os=$(xmllint --xpath "string(//os[../address[@addr='$addr']]/osmatch/@name)" "$file")
    : ${mac:="No data"}
    : ${os:="No data"}
    printf "%s - %s - %s\n" "$addr" "$mac" "$os"
}   

for a in $(xmllint --xpath "//address[@addrtype='ipv4']/@addr" "$file" | grep -Po '\d+\.\d+\.\d+\.\d+'); do
    get_details "$file" $a
done
...