漏洞扫描器 - 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 2000108
Windows NT107
Windows 9x127/128
Windows 764
Windows 95/9832
Linux64
Solaris252
IRIX240
Cisco 12.0 2514255
AIX247

该部分实现代码如下:

# _*_  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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值