漏洞扫描器 - OS识别 - TTL与Nmap方式

1. Nmap识别OS

对于操作系统的扫描最普遍的方式便是TCP/IP协议栈指纹技术,该技术利用TCP/IP协议栈实现上的特点来辨识一个操作系统。

该方法通过寻找不同操作系统之间在处理网络数据包上的差异并把这些差异组合起来形成指纹,以精确地识别目标设备的操作系统版本信息,其中包括TTL、DF标志位、Window、Size、ACK、序列号、ICMP地址屏蔽请求、对FIN包的响应、虚假标记的SYN包、ISN(初始化序列号)等。

下图为Nmap指纹识别库的部分截图:
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)

运行结果如下图所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43619058/article/details/125123146
今日推荐