nmap.PortScanner()。scan给出键错误

时间:2018-07-26 00:00:11

标签: ip nmap tcp python

我已经构建了一个数据包嗅探器,现在我想通过python-nmap使用IP / TCP指纹将远程操作系统检测添加到其中。我正在通过套接字绑定接收数据包:

HOST = gethostbyname(gethostname())
# create a raw socket and bind it to the public interface
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
s.bind((HOST, 0))
data = s.recvfrom(65565)

对于我正在使用的源IP地址:

unpackedData = struct.unpack('!BBHHHBBH4s4s', data[:20])
sourceAddress = inet_ntoa(unpackedData[8])

对于我正在使用的源端口号:

unpackedtcpData = struct.unpack('!HHLLHH', data[offset+1:offset+17])
source_port=str(unpackedtcpData[0])

我正在使用以下代码从接收到的数据包中进行远程检测:

nm = nmap.PortScanner()
nm.scan(sourceAddress.format(),str(source_port))
if 'osclass' in nm[sourceAddress]:
    for osclass in nm[sourceAddress]['osclass']:
        print('OsClass.type : {0}'.format(osclass['type']))
        print('OsClass.vendor : {0}'.format(osclass['vendor']))
        print('OsClass.osfamily : {0}'.format(osclass['osfamily']))
        print('OsClass.osgen : {0}'.format(osclass['osgen']))
        print('OsClass.accuracy : {0}'.format(osclass['accuracy']))
        print('')

但这给了我以下错误:

KeyError: '192.168.23.

查看随附的屏幕截图: enter image description here

当我从刚收到的数据包的IP标头中提取sourceAddress时,sourceAddress是一个完全有效且可访问的IP。同样,source_port也是我从同一数据包的TCP标头中提取的实际端口号。我之所以提到此问题,是因为无论我在哪里搜索错误,他们都说这是因为主机不可访问或主机地址无效或现在不是“ UP”,就像这样的问题:

https://stackoverflow.com/questions/29133574/what-does-keyerror-insert-ip-mean

但是,由于我已经从接收到的数据包中提取了IP地址和TCP端口号,因此主机必须处于打开状态并且可以访问。那为什么它不起作用?我也尝试使用可访问的IP地址,例如“ 127.0.0.1”,但仍然给我同样的错误。就像只是不接受IP地址一样。任何帮助/建议吗?

1 个答案:

答案 0 :(得分:0)

这里发生了一些事情:

  1. 我认为这不属于与 信息安全。

  2. 简单地说,您收到KeyError是因为您请求的键('osclass')在您的扫描对象中不存在,或者至少无法访问您尝试的键检索它。这是因为正在执行的默认扫描不会执行OS扫描。

    • 如果仅打印出扫描对象,则可以找到默认扫描:nmap -oX - -p <target_port> -sV <target_ip>

    • 如果您正在寻找“ osclass”,则需要进行操作系统扫描,因此 传递-O参数( note :这也需要sudo)。

    • This链接应为 能够为您找到想要的东西。生成的扫描对象应类似于: scan_obj=nm.scan(tgt_addr.format(),str(tgt_port),arguments='-O')

  3. 您的数据结构不正确(请参见下文)。

    • 由于数据结构不正确,无法在扫描对象中找到“ osclass”,从而导致循环无法执行。

在下面查看正确的数据结构-您将看到'osclass'是'osmatch'的子代。


python-nmap documentation提供的Nmap扫描数据结构:

The proper data structure looks like :

      {'addresses': {'ipv4': '127.0.0.1'},
       'hostnames': [],
       'osmatch': [{'accuracy': '98',
                    'line': '36241',
                    'name': 'Juniper SA4000 SSL VPN gateway (IVE OS 7.0)',
                    'osclass': [{'accuracy': '98',
                                 'cpe': ['cpe:/h:juniper:sa4000',
                                         'cpe:/o:juniper:ive_os:7'],
                                 'osfamily': 'IVE OS',
                                 'osgen': '7.X',
                                 'type': 'firewall',
                                 'vendor': 'Juniper'}]},
                   {'accuracy': '91',
                    'line': '17374',
                    'name': 'Citrix Access Gateway VPN gateway',
                    'osclass': [{'accuracy': '91',
                                 'cpe': [],
                                 'osfamily': 'embedded',
                                 'osgen': None,
                                 'type': 'proxy server',
                                 'vendor': 'Citrix'}]}],
       'portused': [{'portid': '443', 'proto': 'tcp', 'state': 'open'},
                    {'portid': '113', 'proto': 'tcp', 'state': 'closed'}],
       'status': {'reason': 'syn-ack', 'state': 'up'},
       'tcp': {113: {'conf': '3',
                     'cpe': '',
                     'extrainfo': '',
                     'name': 'ident',
                     'product': '',
                     'reason': 'conn-refused',
                     'state': 'closed',
                     'version': ''},
               443: {'conf': '10',
                     'cpe': '',
                     'extrainfo': '',
                     'name': 'http',
                     'product': 'Juniper SA2000 or SA4000 VPN gateway http config',
                     'reason': 'syn-ack',
                     'state': 'open',
                     'version': ''}},
       'vendor': {}}