[英]nmap.PortScanner().scan gives key error
我已经建立了一个数据包嗅探器,现在我想通过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.
当我从刚收到的数据包的IP标头中提取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地址一样。 任何帮助/建议吗?
这里发生了一些事情:
我不认为这是与信息安全有关的问题。
简单地说,你正在接受KeyError
,因为你正在请求密钥(“osclass”)不会在扫描物体存在,或者至少是不能访问你如何试图找回它。 这是因为正在执行的默认扫描不会执行OS扫描。
如果仅打印出扫描对象,则可以找到默认扫描: nmap -oX - -p <target_port> -sV <target_ip>
。
如果您正在寻找'osclass',那么您需要进行OS扫描,因此传递-O
参数( 注意 :这也需要sudo
)。
该链接应该能够为您提供所需的信息。 生成的扫描对象应类似于: scan_obj=nm.scan(tgt_addr.format(),str(tgt_port),arguments='-O')
您的数据结构不正确(请参见下文)。
在下面查看正确的数据结构-您将看到'osclass'是'osmatch'的子代。
python-nmap文档提供的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': {}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.