Как бороться с IP, которые отфильтровали все свои порты? - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь создать скрипт, который читает IP-адреса из pcap и сканирует их с помощью nmap usin Python.

  • Предполагается, что скрипт должен показывать:

    • IP-адрес назначения
    • Открытые порты системы
    • Идентифицированные протоколы
    • Сортировка результатов по IP-адресу с наибольшим количеством обнаруженных портов
  • Проблемы, с которыми я сталкиваюсь:

    • У некоторых IP-адресов отфильтрованы все порты, время сканирования будет слишком большим, и скрипт не будет ничего показывать

    • Если есть повторные IP-адреса, они сканируются снова

    • Невозможно распечатать таблицу в правильном формате. Мне пришлось печатать заголовок вручную, так как я печатаю 3 ячейки [IP-адрес назначения, количество открытых портов и ОС], в то время как мне нужно показать столбцы и этот заголовок [Порт, Сервис, Продукт, Версия]

Вот мой код:

from prettytable import *
from collections import *
from scapy.all import *
from nmap import *

pcap = rdpcap('/root/Downloads/nakerah.pcap')
scanner = nmap.PortScanner()
sort_list = []
ip_list = []
x = PrettyTable()

for packets in pcap:
    if 'IP' in packets:
        ip_list.append(packets['IP'].dst)
        ip_list = list(OrderedDict.fromkeys(ip_list))

for ip in list(ip_list):
    port_scan = scanner.scan(hosts=ip, arguments='-sV -T4 -sT -p- -A')
    sort_list.append((ip, scanner[ip]['tcp'].keys().__len__()))

    for sorted_ip in sorted(sort_list, key=lambda x: x[1], reverse=True):
        print(f'Scanning IP: {ip}')
        for value in port_scan.get('scan').items():
            header = f"| Destination IP: {sorted_ip[0]} | Number of Opened Ports: {sorted_ip[1]} | OS: {value[1].get('osmatch')[0]['name']} |"
            print('-' * header.__len__())
            print(f"| Destination IP: {sorted_ip[0]} | Number of Opened Ports: {sorted_ip[1]} | OS: {value[1].get('osmatch')[0]['name']} |")
            print('-' * header.__len__())
            x.field_names = ["Port", "Service", "Product", "Version"]
            for port, port_results in value[1].get('tcp').items():
                x.add_row([port, port_results['name'], port_results['product'], port_results['version']])
print(x)

Вот файл, который показывает, что я ожидал, против того, что я получил:

https://privatebin.net/?b04d38132facdacf#3LqKFPMNWCt3G9o576aZX7RazjKC6cVDW1fB57HFQ7Q3

...