1. Nmap识别OS
对于操作系统的扫描最普遍的方式便是TCP/IP协议栈指纹技术,该技术利用TCP/IP协议栈实现上的特点来辨识一个操作系统。
该方法通过寻找不同操作系统之间在处理网络数据包上的差异并把这些差异组合起来形成指纹,以精确地识别目标设备的操作系统版本信息,其中包括TTL、DF标志位、Window、Size、ACK、序列号、ICMP地址屏蔽请求、对FIN包的响应、虚假标记的SYN包、ISN(初始化序列号)等。
下图为Nmap指纹识别库的部分截图:
基于TCP/IP协议栈指纹的实现方式较为复杂,通过连续向被侧主机构造并发送八个不同的数据包并对返回报文中的特定字段进行计算,根据计算结果与指纹库中进行匹配,该方法的检测结果较为准确,且可以检测出较为详细的操作系统信息。
该部分通过调用Nmap 实现,实现代码如下所示:
# _*_ coding:utf-8 _*_
import nmap
import time
def os_scan_nmap(ip):
# python-nmap模块类的实例化
nm = nmap.PortScanner()
try:
# 调用nmap执行-O扫描操作系统
result = nm.scan(hosts=ip,arguments='-O')
# 从返回值里通过切片提取出操作系统版本
# print(result)
# print(ip)
# print(result['scan'][ip])
os = result['scan'][ip]['osmatch'][0]['name'] + " (accuracy: " + result['scan'][ip]['osmatch'][0]['accuracy'] + "%)"
time.sleep(0.1)
# print(ip)
# print(os)
return os
except:
print(ip)
# print("Warning: test conditions non-ideal. we could not find at least 1 open and 1 closed port")
return "Warning: test conditions non-ideal. we could not find at least 1 open and 1 closed port"
pass
def os_scan_nmap_list(iplist):
for ip in iplist:
os_scan_nmap(ip)
if __name__ == '__main__':
ip = "36.152.147.7"
print(os_scan_nmap(ip))
# iplist = ["192.168.1.108", "www.baidu.com"]
# os_scan_nmap_list(iplist)
运行结果如图所示:
2. TTL字段识别OS
相比于Nmap检测方式,TTL检测方式更加简单、快捷。
TTL(Time To Live)即数据包的“存活时间”,表示一个数据包在被丢弃之前可以通过多少跃点(Hop)。
不同操作系统的缺省TTL值往往是不同的。常见操作系统的TTL值如下表所示:
操作系统 | TTL |
---|---|
Windows 2000 | 108 |
Windows NT | 107 |
Windows 9x | 127/128 |
Windows 7 | 64 |
Windows 95/98 | 32 |
Linux | 64 |
Solaris | 252 |
IRIX | 240 |
Cisco 12.0 2514 | 255 |
AIX | 247 |
该部分实现代码如下:
# _*_ coding:utf-8 _*_
import sys
import importlib
importlib.reload(sys)
from scapy.all import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
'''
操作系统的探测利用ttl进行判断
win2000---->108
winNT------>107
win9x------>128 or 127
WIN7------->64
WINDOWS 95/98 --> 32
solaris---->252
IRIX------->240
AIX------->247
Linux----->64
'''
def os_scan_ttl(ip):
ans = sr1(IP(dst=ip)/ICMP(id=RandShort()), timeout=1, retry=2, verbose=0)
print(ip)
if not ans:
ip_for_os = "操作系统类型:" + "None"
elif ans[IP].ttl <= 64:
ip_for_os = "操作系统类型:" + "Linux or Unix"
# print("Linux or Unix!")
elif ans[IP].ttl == 108:
ip_for_os = "操作系统类型:" + "Window2000"
# print("Window2000!")
elif ans[IP].ttl == 107:
ip_for_os = "操作系统类型:" + "win NT"
# print("win NT!")
elif ans[IP].ttl == 127:
ip_for_os = "操作系统类型:" + "win9x"
# print("win9x")
elif ans[IP].ttl == 252:
ip_for_os = "操作系统类型:" + "solaris"
# print("solaris")
elif ans[IP].ttl == 128:
ip_for_os = "操作系统类型:" + "Windows XP"
# print("Windows XP")
else:
ip_for_os = "操作系统类型:" + "Unix"
# print("Unix!")
return ip_for_os
def os_scan_ttl_list(iplist):
for ip in iplist:
print(os_scan_ttl(ip))
if __name__ == '__main__':
print(os_scan_ttl("www.baidu.com"))
# iplist = ["192.168.1.108", "www.aliyun.com"]
# os_scan_ttl_list(iplist)
运行结果如下图所示: