APP下载

基于HTTP User-Agent标记的被动操作系统识别指纹库自动生成方法

2020-05-16李良盛段海新郑晓峰

计算机应用与软件 2020年5期
关键词:网络流量字段指纹识别

李良盛 段海新, 郑晓峰

1(清华大学网络科学与网络空间研究院 北京 100084)2(北京奇安信科技有限公司 北京 100015)

0 引 言

随着互联网的发展,越来越多的设备都连接到了互联网上,网络管理员面临着更大的挑战。不同的设备运行着各式各样的操作系统,识别和修补易受攻击的那些系统至关重要。网络管理员采用多种安全技术来保护系统免受恶意活动的影响,而检测出那些可能使用旧版本或不安全版本的操作系统的设备是其中一种重要方法。此外,网络管理员为了对网络中的各种设备进行资产管理,同样需要操作系统识别技术识别出设备的操作系统。因此操作系统识别技术是重要的网络安全技术。

操作系统指纹识别是指通过网络数据包识别主机的操作系统信息。操作系统指纹则是指从某一操作系统所发送的网络数据包中提取的可以区分不同操作系统的一系列特征项。其原理是不同的操作系统厂商在实现TCP/IP协议栈出现了细微的差别,这些差别具有独特的特性,故而被称为“指纹”。例如IP协议的TTL字段以及TCP协议的窗口字段和选项字段等就是最常见的可以区分不同操作系统的特征字段。

操作系统识别技术分为主动和被动两类。主动操作系统指纹识别需要精心构造不同的数据包并发送出去,根据返回的结果来分析目标的具体操作系统。此方法最大的缺点在于发送的数据包会被防火墙或者入侵检测系统拦截,并且会暴露自身的信息。被动操作系统指纹识别比主动操作系统指纹识别来说比较受限,只能被动地接受流量,从流量中分析出操作系统信息。本文主要研究被动操作系统识别。

被动操作系统识别技术主要根据TCP会话建立时发送的SYN数据包中的IP和TCP协议的特征字段来识别不同类型和版本的操作系统,其中的代表性工具就是p0f[1]。被动操作系统识别工具依赖于自身的指纹库,但是p0f的指纹库已经长期没有更新。在识别流量的过程中,首先从流量中提取各个特征项,然后用特征项组成的指纹去指纹库中匹配。匹配成功输出识别结果,匹配不成功则输出未知。然而指纹库的生成需要搜集不同类型和版本的操作系标签数据。人工去搜集标签数据的方法效率低下,而且真实网络环境中操作系统所产生的指纹多种多样,仅仅凭人工搜集很难搜集完整。因此目前亟需一种自动化标记指纹的方法。

针对该问题,本文提出一种基于HTTP User-Agent来标记指纹的指纹库自动化生成方法。采用User-Agent提取出的操作系统类型和版本信息作为IP和TCP协议提取出的指纹的标记。然后在大量HTTP网络流量数据集上进行统计。根据统计结果发现,单个指纹统计出的出现频率最高的一个或几个标记占该指纹总数量的绝大部分。因此选择出现频率出现较高的操作系统类型和版本作为指纹的最终标记。这样避免了HTTP User-Agent容易被修改带来的不可信问题。

通过约2.2亿的真实网络产生的客户端方向的HTTP流量数据,最终得到390条操作系统指纹标记数据,涵盖了主流操作系统的各个版本,而p0f同方向的指纹只有91条。用新的指纹库和p0f在相同的数据集上进行了对比验证,实验结果表明,新的指纹库在识别正确率上优于p0f,证明了本方法的有效性。

1 相关研究

p0f是被动操作系统指纹识别的代表性工具,最新版本为3.09b。p0f可以处理离线的pcap文件,也可以实时运行监控网络流量数据。p0f通过TCP建立连接时双方首次发送的SYN和SYN ACK数据包来识别通信双方的操作系统。p0f的指纹的特征字段由IP协议和TCP协议的特征字段组成,包括IP协议的TTL字段、TCP协议的窗口字段、TCP头部选项中的最大报文段长度(MSS)和窗口扩大因子(WSCALE)和选项的排列顺序等。但是p0f目前缺乏更新,指纹数据库最后更新时间是2016年4月,包含的操作系统也比较少,缺乏Windows 10等比较新的操作系统版本的指纹数据。

Ettercap[2]是一款可用的被动操作系统指纹识别工具,既可以检测中间人攻击,也能够执行操作系统指纹识别。和p0f一样,Ettercap使用TCP SYN数据包信息进行操作系统分类。然而,Ettercap并不是一个纯粹的被动操作系统指纹识别工具,因为它向系统发送TCP SYN包并检查响应包。Ettercap目前最近的更新是在2015年3月,指纹库更新时间是2012年。

Sator[3]是一款可用的被动操作系统指纹识别工具。Satori自身带有TCP和DHCP操作系统指纹识别引擎,还集成了p0f和Ettercap。因此对于TCP包Satori可以输出三种结果。在局域网下Satori可以进行DHCP包识别。Satori最近的更新是在2013年5月,其使用p0f和Ettercap 2012年旧版本的指纹库。

NetworkMiner是一款嗅探抓包工具,可以对网络流量进行分析,包括操作系统指纹识别。NetworkMiner进行操作系统指纹识别的原理与p0f一致,使用了p0f和Satori的指纹数据库。NetworkMiner最近的更新是在2019年1月,但其使用的是p0f和Ettercap的老旧指纹库。

这些公开可用的被动操作系统指纹识别工具大都方法类似,都有缺乏更新的问题。

在操作系统指纹识别特征项的研究上,刘英等[4]研究了TCP协议选项字段对操作系统指纹识别的作用。文献[3]在p0f所使用的指纹的特征字段的基础上进行了优化,去除掉无用的特征字段,重新提取了指纹库,并利用决策树和SVM等算法进行分类,最终训练的模型在测试数据上达到了80%左右的准确率。文献[5]研究了会话内多个数据包之间的关联关系,发现TCP FIN ACK包具有一定的区分操作系统的作用。文献[6]研究了利用IP、TCP、UDP、ICMP、SSH、DNS、TLS和FTP等多种协议在多种机器学习算法的基础上进行操作系统识别的效果,经过比较发现了TCP协议的特征字段具有最好的区分操作系统效果。文献[7]利用TCP/IP、HTTP User-Agent和TLS三种指纹特征生成模型,研究了私有网络下多会话模型的操作系统指纹识别效果,以一小时为时间窗口,识别正确率达到99%左右。但是该方法具有局限性,只适合于网络中设备的IP地址基本不变化的情况。

HTTP协议允许客户端和服务器在连接期间通过在消息中包含头部字段来传递附加信息。HTTP User-Agent是HTTP头部的一个重要字段。一个标准的User-Agent以标准化格式标明客户端和操作系统的类型和版本等信息。Adhikari等[8]研究了直接利用网络流量中HTTP User-Agent来标记设备类型。HTTP User-Agent非常容易修改,很多浏览器插件提供修改 User-Agent,爬虫程序也需要修改User-Agent来伪装成正常访问。已有研究表明,在真实网络流量中,伪造的User-Agent流量只占全部流量的很少一部分[9]。文献[10]还提出通过比较在客户端利用javascript得到navigator.userAgent与服务端流量中获得的User-Agent的不一致性来发现浏览器指纹伪造的方法。

2 指纹库自动化生成方法

本文所提出的指纹库自动化方法具有三个步骤:一是从HTTP流量数据中解析和提取特征项以及User-Agent。二是指纹对应操作系统信息的统计。三是根据统计结果选择指纹标记。如图1所示。

图1 指纹库自动化生成流程图

2.1 指纹特征和HTTP User-Agent提取

根据p0f所使用的特征进行最终简化,使用了IP和TCP协议的6个特征。表1列出5种典型的操作系统指纹及所使用的特征对应的值。

表1 典型的操作系统指纹

下面分别对每个特征的构造和处理方式进行说明:

TTL表示IP协议TTL字段的值。TTL字段是生存时间,每被转发一次该字段的值减1,为0时被丢弃,一般的初始值为64、128和255等。Windows操作系统TTL初始值通常为128,Liunx和Mac OS X操作系统TTL初始值通常为64。在原始发送主机上捕获的数据包TTL值直接从字段中提取,而其他位置捕获的数据包需要通过就近原则计算出原始TTL值。

NZ_IPID表示DF(分片标志位)设置为1时ID(IP协议字段)值是否不为0。Mac OS X 10.13和10.14以及iOS 12等较新的操作系统在不分片时一直将ID设置为0。该特征需要对DF标志位和ID值进行判断后得到结果。

ECN表示在IP和TCP协议的ECN(显示拥塞通知)标志位的值。RFC3168[11]规定使用IP和TCP头部中保留字段的后两位作为ECN标志位。较新的操作系统,例如Windows 2012和2016等会使用该标志位。该特征直接来源于ECN标志位提取的值。

WSCALE表示TCP选项中窗口扩大因子的值。不同的操作系统具有不同的常用值。该特征直接从TCP选项中提取窗口扩大因子字段的值。

OPTLAYOUT表示TCP选项的每一项按出现的先后顺序排序组成的字符串。常见的TCP选项有结束(EOL)、无操作(NOP)、最大报文段长度(MSS)、窗口扩大因子(Window Scale)、选择性确认(SACK Permitted)和时间戳(Timestamps)等。该特征需要对所有的TCP选项进行按先后顺序排序后得到值。

WIN_MSS表示TCP协议窗口值与TCP选项最大报文段长度的比值,如不能整除则该特征的值直接为窗口值。

上述特征均具有区分不同版本和类型操作系统的能力。

通过读取网络流量,并解析数据包中IP和TCP协议字段,直接提取字段的值或者通过间隔计算得到结果,最后得到特征对应的值。处理流程如图2所示。

图2 从网络流量中提取特征处理流量图

首先读取网络流量文件,然后设置过滤规则,只留下TCP的流量。对TCP数据包按字段进行解析,包括IPv4或者IPv6、TCP固定头部和TCP选项等。根据解析出的标志位SYN是否值为1和ACK是否为值0判断是否为初始SYN数据包。不满足条件则继续判断网络流量文件是否读取完毕,未完毕则继续解析单个数据包,完毕则结束。

HTTP User-Agent提取使用python-user-agents[12]工具。该工具基于Python语言编写,可以提取User-Agent中的操作系统类型和版本以及HTTP客户端的类型和版本。此外,还采用了关键词提取的方法作为补充。少部分不能提取出操作系统信息的User-Agent数据将被丢弃。在选择指纹的最终标记结果时,选择方法上会避免掉HTTP User-Agent不可靠带来的影响。

2.2 指纹对应的操作系统信息统计

采用字典嵌套的方法进行统计。指纹信息作为字典的关键字(key),操作系统类型和版本及数量信息作为值(Value)。操作系统类型和版本及数量信息也是一个字典,操作系统类型和版本作为关键字,而出现数量作为值。

对于每一条指纹-操作系统数据对,首先将指纹作为关键字检查字典是否已存在该指纹,不存在则加入该指纹。存在则检查该指纹对应值的字典,操作系统类型和版本作为关键字,存在该关键字的值加1,不存在则加入该操作系统类型和版本。

2.3 根据统计结果选择指纹标记

单个指纹统计出的操作系统信息具有很多类型和版本,需要考虑选择哪些操作系统类型和版本作为该指纹的最终标记结果。

首先计算出每个操作系统类型和版本所出现数量占该指纹总数量的百分比。考虑单个指纹出现数量最多的操作系统类型和版本,如果该操作系统类型和版本数量占比达到80%以上则只取该结果作为标记。如果出现数量最多操作系统类型和版本占比小于10%,则说明该指纹的统计结果非常分散,不合适选择任一数据作为标记,从而丢弃该指纹,避免得到错误结果。

如果出现数量最多操作系统类型和版本占比在10%~80%之间,则考虑排名靠前的数据均作为该指纹的标记。由于指纹与操作系统是多对多关系,这样做也是合理的。但是操作系统类型必须与第一标记结果相符,除Linux和Android以及Mac OS X和iOS外,因为这两类操作系统具有同源性,对应的指纹可能会交叉。此外,单个指纹对应的数量太少的数据将直接丢弃。

3 实 验

3.1 数据来源

通过部署在清华大学校园网边界的探针得到整个大学的网络流量数据。对2019年2月7日至16日共计10天的HTTP网络流量数据进行处理,得到218 432 717条HTTP网络流量数据。首先提取其中的IP和TCP协议的指纹特征项,其次提取HTTP User-Agent的操作系统类型和版本,然后将两个结果组成一对。由于部分HTTP User-Agent无法提取出操作系统类型,因此丢弃掉此部分数据,最终得到173 696 297条数据。

3.2 不重复指纹数量统计

首先对每一天的指纹和User-Agent提取对进行统计,再从2月7日到16日的顺序合并统计结果。最终统计出506条不重复指纹数据。每天统计出的不重复指纹数量和最终统计结果的不重复指纹数量增长情况如图3所示。

图3 每天不重复指纹数量和最终统计结果的不重复指纹数量增长情况

可以看出,最终统计的不重复指纹数量增长越来越缓慢,说明每天的数据中重复的指纹较多,10天的数据基本涵盖了校园网数据中的绝大部分出现的指纹。

根据506条不重复指纹每条统计出的数据,分别统计了每条指纹出现的数量占总数量的百分比。可以发现少数的指纹出现频率较高,占了总数量的大部分。数量最多的指纹占总数量的43.95%,前10数量的指纹的和占总数量的90.75%,前40数量的指纹的和占总数量已经高达99.03%。TOP X指纹数量占总数量百分比情况如图4所示。

图4 TOP X指纹出现数量和占总数量百分比

3.3 指纹库生成结果

单个指纹的统计结果示例如图5所示。

图5 单个指纹统计结果示例

第一行是指纹信息,后面行是该指纹对应HTTP User-Agent出现过的操作系统。可以看出,Windows 10占比最多,可以作为改指纹的标记。其他操作系统占比很少,不宜作为该指纹的标记。

首先统计了单个指纹所对应的出现次数最多的操作系统占该指纹出现总数量的百分比。为避免统计结果失真,该统计没有使用只有一条操作系统信息的指纹数据。分为五类,每20%为一类。统计结果如图6所示。

图6 单条指纹的出现最多次数操作系统数量占该指纹总数量比例的分类

可以看出,单条指纹对应的出现次数最多的操作系统的指纹数量能够占总数量达到80%以上的这类指纹有59.06%。达到40%以上的数量有93.70%,说明了绝大部分指纹的统计结果呈现了相同规律,也证明了选择出现数量最多的操作系统作为标记的方法的正确性。

单个指纹出现TOP X的操作系统数据和的变化情况如图7所示。

图7 单个指纹出现TOP X的操作系统数据和的变化情况

可以看出,单个指纹TOP 4数量的操作系统之和占比达到了96.85%。因此对单个指纹的最多操作系统标记数量占比不足80%时,考虑后续三个数量次多的标记作为补充。但是必须要求操作系统类型与第一个标记数据一致,考虑到Linux和Android以及Max OS X和iOS的同源性,这两类不做此要求。考虑到单个指纹出现次数过少比较容易得到错误标记,丢弃出现次数小于100次的指纹数据。

由统计结果发现少部分标记只有操作系统信息没有版本信息。如果该标记不是该指纹的唯一标记则删除此类数据。

最终得到390条指纹数据,其中不重复指纹273条,而p0f TCP SYN方向指纹库数量只有91条。其分布如表2所示。

表2 新的指纹库操作系统类型和版本数量

Linux所在栏无版本信息是由于Linux指纹对应的HTTPUser-Agent基本提取不出操作系统版本信息。

3.4 指纹库验证和对比

利用清华大学校园网2月17至19日三天的网络流量数据进行测试,共计122 187 670条TCP会话数据,9 002 139条HTTP数据。其中91.89%的TCP会话数据提取的指纹能够在新的指纹库上命中。然后,用HTTP User-Agent提取结果进行对比验证。通过修改p0f的数据读入接口使其能处理校园网的网络流量,同样地,得到与User-Agent提取结果的对比,其中91.12%的TCP会话数据能够在p0f的指纹库上命中,结果如图8所示。

图8 校园网三天HTTP数据新指纹库和p0f识别结果分别与User-Agent提取结果对比

类型是指操作系统类型,例如Windows与Max OS X。版本是指操作系统版本,例如Windows操作系统的版本 7或8等。版本一致包括了指纹库识别结果有多种版本的情况。可以看出,新的指纹在校园网三天的数据识别结果,类型和版本均一致的达到了94.66%。p0f的识别结果则出现了71.31%的类型一致但是版本不一致的情况。这也从侧面说明了p0f的指纹库并不完备。新的指纹库识别结果与User-Agent提取的结果只有1.48%操作系统类型不一致。同样也验证了User-Agent不可靠的情况非常少。

此外,还在人工搜集的标签数据集上进行了测试。通过搭建虚拟机的方法,搭建了Windows、Linux和Mac OS X三大主流操作系统17个版本的虚拟机。通过脚本控制浏览器访问国内Alex TOP 10网站产生目的端口为80、443的流量,访问指定服务器的22、139、445和3389等端口产生流量。此外使用真实移动设备采集了iOS 12和Android 7的三分钟网络流量。所有标签流量共计TCP SYN数据17 073条。

分别用新的指纹库和p0f在该数据集上进行指纹识别。95.04%的数据能够在新的指纹库上命中,而89.99%的数据能够在p0f指纹库上命中。命中的数据其识别结果分类如图9所示。

图9 新的指纹库和p0f在相同标签数据集上识别结果对比

新的指纹库在类型版本一致的识别结果占比76.45%,而p0f只有49.73%。只考虑操作系统类型识别准确率的话,新的指纹库准确率高达99.79%,而p0f只有74.30%。在相同的标签数据上,无论是命中率还是准确率,新的指纹库都表现得比p0f要好。

4 结 语

目前公开可用的被动操作系统识别工具的指纹库缺乏更新,而人工去搜集不同类型和版本的操作系统标签数据来完善这些工具的指纹库不仅效率低下而且很难搜集完整。本文提出了一种基于HTTP User-Agent来标记指纹的指纹库自动化生成方法。利用约2.2亿的HTTP网络流量数据生成了涵盖主流的操作系统类型和版本的新指纹库。在相同的数据集上对新指纹库与p0f在相同数据集上进行了测试,新的指纹库得到了比p0f更优的操作系统识别结果,证明了本方法的有效性。目前的IP和TCP协议特征项难以区分相同类型的操作系统的不同版本,是下一步研究重点。

猜你喜欢

网络流量字段指纹识别
大数据驱动和分析的舰船通信网络流量智能估计
基于双向长短期记忆循环神经网络的网络流量预测
带钩或不带钩选择方框批量自动换
一种用于敏感图像快速加密的图像注入技术仿真
苹果屏幕指纹识别专利图流出
iPhone8新专利曝光
指纹挂锁
形形色色的指纹解锁
无正题名文献著录方法评述
无正题名文献著录方法评述