我已经构建了一个数据包嗅探器,现在我想通过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时,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地址一样。任何帮助/建议吗?
答案 0 :(得分:0)
这里发生了一些事情:
我认为这不属于与 信息安全。
简单地说,您收到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')
您的数据结构不正确(请参见下文)。
在下面查看正确的数据结构-您将看到'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': {}}