python -nmap сканер портов UDP иногда не включает результаты - PullRequest
0 голосов
/ 28 марта 2020

Я пытался разработать простой сканер портов UDP, используя nmap, чтобы удовлетворить мои потребности, но я обнаружил, что иногда запуск одного и того же кода несколько раз дает разные результаты. Результаты UDP иногда не включаются в возвращаемый метод PortScannerYield.scan ().

I include the image which presents two different results of executing the same code.

Хост работает в обоих случаях, единственное отличие - отсутствие результатов UDP.

import nmap
import time
import sys


class UdpPortScanner:
    def __init__(self):
        self.nm = nmap.PortScannerYield()

    @staticmethod
    def parse_results(result):
        results = []

        for host, listed in result.items():
            state = listed["scan"][host]["status"]["state"]
            if state == "up":
                try:
                    for port in listed["scan"][host]["udp"]:
                        entry = (
                            host, port, listed["scan"][host]["udp"][port]["state"], listed["scan"][host]["udp"][port]["name"])
                        results.append(entry)
                except KeyError as e:
                    print("Didn't find a key: " + str(e))
            else:
                print(host, "is", state)
        return results

    def scan(self, target_ips='127.0.0.1', arguments='-sUV -T4 -F --version-intensity 0'):
        result = dict()
        for key, value in self.nm.scan(hosts=target_ips, arguments=arguments):
            for row in UdpPortScanner.parse_results({key: value}):
                print(*row)
            result[key] = value
        return result


if __name__ == "__main__":
    scanner = UdpPortScanner()

    if len(sys.argv) < 2:
        domain_address = input('Enter the host to be scanned: ')
    else:
        domain_address = sys.argv[1]
    if len(sys.argv) < 3:
        scan_type = input('Determine nmap args or type 0 to scan for most common 1000 ports: ')
    else:
        scan_type = ""
        for x in sys.argv[2:]:
            scan_type += x + " "

    print()

    start = time.time()

    if scan_type == "0":
        scan_result = scanner.scan(target_ips=domain_address)
    else:
        scan_result = scanner.scan(target_ips=domain_address, arguments=scan_type)

    print("\nTime taken: ", time.time() - start)

Is это что-то, что я делаю неправильно или это ошибка в python -nmap?

...