博舍

漏洞挖掘分析技术总结 智能化漏洞挖掘方案

漏洞挖掘分析技术总结

漏洞挖掘分析技术总结

漏洞挖掘分析技术有多种,只应用一种漏洞挖掘技术,是很难完成分析工作的,一般是将几种漏洞挖掘技术优化组合,寻求效率和质量的均衡。

2.1.人工分析

人工分析是一种灰盒分析技术。针对被分析目标程序,手工构造特殊输入条件,观察输出、目标状态变化等,获得漏洞的分析技术。输入包括有效的和无效的输入,输出包括正常输出和非正常输出。非正常输出是漏洞出现的前提,或者就是目标程序的漏洞。非正常目标状态的变化也是发现漏洞的预兆,是深入挖掘的方向。人工分析高度依赖于分析人员的经验和技巧。人工分析多用于有人机交互界面的目标程序,Web漏洞挖掘中多使用人工分析的方法。

2.2.Fuzzing技术

Fuzzing技术是一种基于缺陷注入的自动软件测试技术,它利用黑盒分析技术方法,使用大量半有效的数据作为应用程序的输入,以程序是否出现异常为标志,来发现应用程序中可能存在的安全漏洞。半有效数据是指被测目标程序的必要标识部分和大部分数据是有效的,有意构造的数据部分是无效的,应用程序在处理该数据时就有可能发生错误,可能导致应用程序的崩溃或者触发相应的安全漏洞。

根据分析目标的特点,Fuzzing可以分为三类:

1.动态Web页面Fuzzing,针对ASP、PHP、Java、Perl等编写的网页程序,也包括使用这类技术构建的B/S架构应用程序,典型应用软件为HTTPFuzz;

2.文件格式Fuzzing,针对各种文档格式,典型应用软件为PDFFuzz;

3.协议Fuzzing,针对网络协议,典型应用软件为针对微软RPC(远程过程调用)的Fuzz。

Fuzzer软件输入的构造方法与黑盒测试软件的构造相似,边界值、字符串、文件头、文件尾的附加字符串等均可以作为基本的构造条件。Fuzzer软件可以用于检测多种安全漏洞,包括缓冲区溢出漏洞、整型溢出漏洞、格式化字符串和特殊字符漏洞、竞争条件和死锁漏洞、SQL注入、跨站脚本、RPC漏洞攻击、文件系统攻击、信息泄露等。

与其它技术相比,Fuzzing技术具有思想简单,容易理解、从发现漏洞到漏洞重现容易、不存在误报的优点。同时它也存在黑盒分析的全部缺点,而且具有不通用、构造测试周期长等问题。

常用的Fuzzer软件包括SPIKEProxy、PeachFuzzerFramework、AcunetixWebVulnerabilityScanner的HTTPFuzzer、OWASPJBroFuzz、WebScarab等。

2.3.补丁比对技术

补丁比对技术主要用于黑客或竞争对手找出软件发布者已修正但未尚公开的漏洞,是黑客利用漏洞前经常使用的技术手段。

安全公告或补丁发布说明书中一般不指明漏洞的准确位置和原因,黑客很难仅根据该声明利用漏洞。黑客可以通过比较打补丁前后的二进制文件,确定漏洞的位置,再结合其他漏洞挖掘技术,即可了解漏洞的细节,最后可以得到漏洞利用的攻击代码。

简单的比较方法有二进制字节和字符串比较、对目标程序逆向工程后的比较两种。第一种方法适用于补丁前后有少量变化的比较,常用的于字符串变化、边界值变化等导致漏洞的分析。第二种方法适用于程序可被反编译,且可根据反编译找到函数参数变化导致漏洞的分析。这两种方法都不适合文件修改较多的情况。

复杂的比较方法有TobbSabin提出的基于指令相似性的图形化比较和HalvarFlake提出的结构化二进制比较,可以发现文件中一些非结构化的变化,如缓冲区大小的改变,且以图形化的方式进行显示。

常用的补丁比对工具有BeyondCompare、IDACompare、BinaryDiffingSuite(EBDS)、BinDiff、NIPCBinaryDiffer(NBD)。此外大量的高级文字编辑工具也有相似的功能,如UltraEdit、HexEdit等。这些补丁比对工具软件基于字符串比较或二进制比较技术。

2.4.静态分析技术

静态分析技术是对被分析目标的源程序进行分析检测,发现程序中存在的安全漏洞或隐患,是一种典型的白盒分析技术。它的方法主要包括静态字符串搜索、上下文搜索。静态分析过程主要是找到不正确的函数调用及返回状态,特别是可能未进行边界检查或边界检查不正确的函数调用,可能造成缓冲区溢出的函数、外部调用函数、共享内存函数以及函数指针等。

对开放源代码的程序,通过检测程序中不符合安全规则的文件结构、命名规则、函数、堆栈指针可以发现程序中存在的安全缺陷。被分析目标没有附带源程序时,就需要对程序进行逆向工程,获取类似于源代码的逆向工程代码,然后再进行搜索。使用与源代码相似的方法,也可以发现程序中的漏洞,这类静态分析方法叫做反汇编扫描。由于采用了底层的汇编语言进行漏洞分析,在理论上可以发现所有计算机可运行的漏洞,对于不公开源代码的程序来说往往是最有效的发现安全漏洞的办法。

但这种方法也存在很大的局限性,不断扩充的特征库或词典将造成检测的结果集大、误报率高;同时此方法重点是分析代码的“特征”,而不关心程序的功能,不会有针对功能及程序结构的分析检查。

2.5.动态分析技术

动态分析技术起源于软件调试技术,是用调试器作为动态分析工具,但不同于软件调试技术的是它往往处理的是没有源代码的被分析程序,或是被逆向工程过的被分析程序。

动态分析需要在调试器中运行目标程序,通过观察执行过程中程序的运行状态、内存使用状况以及寄存器的值等以发现漏洞。一般分析过程分为代码流分析和数据流分析。代码流分析主要是通过设置断点动态跟踪目标程序代码流,以检测有缺陷的函数调用及其参数。数据流分析是通过构造特殊数据触发潜在错误。

比较特殊的,在动态分析过程中可以采用动态代码替换技术,破坏程序运行流程、替换函数入口、函数参数,相当于构造半有效数据,从而找到隐藏在系统中的缺陷。

常见的动态分析工具有SoftIce、OllyDbg、WinDbg等。

3.典型技术应用

我是一名渗透工作者,常年游走在漏洞当中,大家在学习中遇到任何问题,都可以申请加入我所在的社区,前面是:603中间是:916后面是:224,需要文中资料点我获取,还有更多网络安全全套视频、工具包、书籍、应急响应笔记等着你

AcunetixWebVulnerabilityScanner软件的HTTPFuzzer工具

使用AcunetixWebVulnerabilityScanner软件进行漏洞挖掘,该软件提供了一些预定义好的Fuzz运算参数库,可以便于初学者上手,也可以方便分析者使用。过程如下:

1.定义HTTP请求(Request),即定义所需访问的网页URL;

2.定义运算参数(Addgenerator),即定义可能产生漏洞的字符串表达式,如:查找password、password、password、passwd、$token;

3.插入运算参数(Insertintorequest),即将定义好的多条运算参数绑定为一条搜索策略;

4.定义成功触发特征(FuzzerFilters),将运算参数与HTTP请求绑定;

5.扫描(Start);

6.等待软件返回匹配的项,这些项就是可能的漏洞。

经过以上步骤,一个网页中可能存在的漏洞就被发现了。

3.2.使用补丁比对技术找到漏洞的例子

2008年10月23日,微软发布的MS08-067的补丁,该问题被列为严重。该安全更新解决了服务器服务中一个秘密报告的漏洞。如果用户在受影响的系统上收到特制的RPC请求,则该漏洞可能允许远程执行代码。

漏洞挖掘过程为例说明补丁对比技术的应用。

首先保留一份原始文件,然后安装新的补丁程序,提取出相同和新加入的文件后,就可以使用软件进行对比。

经过对比后发现被修改的3个函数

对比软件列出了三个函数名称,分别为0.25、0.67和0.94并列出补丁前后的相似程度。通过对比结果,可以针对性构造参数,观察补丁前后的行为,最终发现在给出的这三个函数中,有两个是和漏洞直接相关的。

4.结束语

漏洞挖掘技术脱胎于软件测试理论和软件开发调试技术,可以大大提高软件的安全性。网络安全界的第三方机构、技术爱好者也利用该技术寻找各种软件漏洞,并及时发布给大众,为提高信息安全整体水平做出了贡献。但漏洞挖掘也是一把双刃剑,已经成为黑客破解软件的主流技术。漏洞挖掘技术的发展前景是广阔的,随着信息安全越来越被重视,软件开发技术越来越先进,新的分析手段会随之出现。

[原创]安全设备的漏洞挖掘

前言

无论是做多完美的安全解决方案,顶层设计。部署多么高大上的安全产品,例如防火墙,入侵检测,隔离网闸等最终还是需要落地的。而在落地实现过程中,往往存在非常多的安全问题,特别关于安全设备自身存在的安全漏洞。最近几年hvv也爆出了非常多安全产品的漏洞,具体就不说了,网上也有很多资料,但是大多是谈漏洞原理,但是在这篇文章我想谈谈这些安全设备的挖掘方法。(注:本文不会指明具体的厂商,如有雷同,纯属巧合)

设备获取

1.对安全设备的挖掘,当然最好有实际的设备,获取安全设备是非常关键也是非常困难的的一步,首选购买安全设备价格昂贵,少则几万,多则几十万,对于经济拮据的研究员来说无疑是难以迈过的门槛。特别购买时不止有钱就行,还面临着各种流程,各种合同,走各种项目,特别是安全公司一听你要挖他的漏洞,绝对不会出售他们产品。这些不是问题,某鱼可以帮你解决这个问题,出售的设备都相对便宜,不止安全类设备,一些IoT设备,工控设备都可以在这上面购买,甚至几千块就可以买到隔离网闸。值得注意的是,这些设备大多都是淘汰下来的产品,要确定该产品是否还有研究价值,否则买来发现市面上都没人用了,那么挖出的漏洞价值也不大。2.还有一些安全设备会提供虚拟化部署的能力,他们会提供kvm,VMware之类的虚拟机镜像,有些官网会提供下载,一旦提供虚拟化部署的文件,无论是否有加密机制对研究员已经相当于设备已经获取到了,固件就在虚拟硬盘中:https://bbs.pediy.com/thread-268475.htm

固件获取

大多数安全产品官方网站可能提供固件下载,必须询问经销商,或者需要填入合同号,最大的问题是固件下载很多都是加密的,当然,有了设备这些都不是问题。可以直接拆焊PCB版上的flash,使用编程器读取上来,特别是有些是X86架构的设备,用的存储单元一般很有可能是硬盘,可以把硬盘拆下来,接一根硬盘线读取其中的内容。然后利用binwalk之类的解包工具,直接解开文件系统。值得注意的是,有些安全厂商可能相对注重安全,即使在获取到硬盘里面的Linux文件系统或者内核,但很可能是加密的(当然,这是一小部分),这里我给大家介绍分析的方向:

Linux文件系统加密,就去分析Linux内核,一般不大有厂商自己实现一个文件系统,无非是简单的读文件,然后用某种算法解密。Linux内核加密,就去分析uboot/grub等,里面肯定存在有解密算法,对其进行分析即可。用安全芯片做安全加密启动,个人没遇到过,不做展开。漏洞挖掘漏洞类型

谁都知道未授权的RCE是漏洞挖掘的“圣杯”,但是一开始不建议研究员挖掘未授权的RCE漏洞,大多数安全设备在认证环节都做得不错,基本移除了后门密码,找到未授权的漏洞相对困难,可以在授权情况下进行挖掘,这样登陆后可以找到更多攻击面,熟悉后可以尝试多个漏洞结合达到未授权的RCE效果。那是不是预授权的RCE就毫无用处了呢?其实不然,如果是一个低权限的用户可以触发RCE那就可以达到提权的效果,而RCE的漏洞也会造成设备的源码泄露(即使在用户不接触设备情况下),甚至非法分子会利用漏洞破解设备授权,对安全厂商的收益造成威胁。

OEM

在安全界大厂OEM小厂的安全设备再正常不过,也就说某些设备的漏洞会影响到多个厂商,最重要的是由于是安全小厂,开发人员相比大厂来说安全意识较为薄弱,在漏洞挖掘初期可以选择OEM的设备进行分析,这类设备漏洞产出最高。

web端漏洞

Web端的攻击面最多,不同厂家使用的主流web编程语言不同(PHP,JAVA,pythonetc),但是挖掘方法基本类似,特别有些开发者在实现过程中,认为用户无法接触到源代码,硬编码各种密钥,例如JWTkey,OSSkey等各种secretkey,带来各种安全问题,这种想法当然是错误的,好的安全设备,即使在用户完全能够获取web端源码,也无法GetShell。在安全产品不推荐任何硬编码的密钥,用户是有能力完全接触到这些数据的,好的设计的通过密钥管理机制,动态生成各种密钥,达到一机一码的目的。挖掘web漏洞在有源码能审计的情况下更加如鱼得水,这里也值得注意的是,有些安全设备会魔改解释引擎,例如LUA,python等,这就需要对解释引擎进行分析,还原原始的字节码,还有一些使用商业的混淆工具,混淆web端代码,具体问题,具体分析,就不一一列举了。

私有协议

包括一些VPN协议,这些协议一般是用C/C++实现的,其中可能会存在一些内存破坏漏洞,对于这类协议的服务端,一般最常见的方法就是分析加密和认证及各种数据交互协议,利用fuzz框架例如boofuzz里面对该服务端进行fuzz。

安全机制

安全设备肯定具有各种安全功能,例如恶意流量的阻断和检测,而这些功能实现过程中有可能会存在安全机制绕过的漏洞,尤其对一些工控防火墙,支持解析各种工控协议,这些解析插件都是厂商自己实现的,这些防火墙可能对一些非正常的数据流量解析过程中会导致一些经典的溢出造成的DoS,发现这类漏洞可以使用fuzz,fuzz对象是实现协议解析检测的安全设备,当然经验丰富的研究人员可以分析其实现,来绕过检测规则。

漏洞上报

无论是出于道德黑客还是获取赏金的动机,挖出的漏洞最好还是直接上报给安全厂商的SRC。当然有些安全厂商SRC确实难找,官网上没入口,还得通过朋友的关系来找。大部分的安全厂商都非常重视自身的漏洞,你的付出终将会得到相对合理的回报!

总结

本文主要是想让一些喜欢挑战安全设备的研究人员了解如何开始挖掘安全设备的一篇入门级文章,安全厂商也可以根据该文章中的分析方法来进一步加固自身的安全产品,以攻促防。PS:有人就会问了:这篇文章看下来都在吹牛,没啥干货,一张图都没有,没啥意思。其实我呢也想贴些图,分享一些自己挖到的安全问题,非不能,实不为也,安全设备非常敏感,本文只是把我研究的一些经历抽象成一些方法论,具体的设备图片和漏洞详情今后也不会涉及。

eBPF安全开发与攻防对抗

最后于2022-11-1713:12被wmsuper编辑,原因:#安全研究#技术分享#漏洞挖掘#工控设备

使用深度神经网络进行漏洞挖掘的方法调研

使用深度神经网络进行漏洞挖掘的方法调研传统的漏洞挖掘方法静态方法基于规则/模板的代码相似性检测符号执行

对源代码分析,高假阳性

动态方法模糊测试污点分析

代码覆盖率低

混合方法

结合静态、动态方法,会继承上述的问题,并且实践上难以应用

介绍

机器学习方法的优点

人类智慧(经验)起到重要指导作用(基于规则、基于提取的特征的)

困难:

难以将安全专家对漏洞的理解转换为可被检测系统学习的特征向量系统从特征集中学到的东西也可能受到各种因素的影响例如,模型的表现力、数据过度拟合、数据中的噪声等

一些概念:

缺口(GAP):机器学习要像人类一样学习和理解漏洞代码的语义(如何将漏洞代码表示为机器可学习的信息)

semanticgap:语义缺口、语义空白

传统机器学习方法依赖手工制作的特征

深度学习、RNN可以自动通过学习揭示代码语义的复杂模式和软件代码的高级表示

安全从业者人工审查漏洞考虑的因素

漏洞语义差距对软件漏洞一种不同的表达

定义:缺陷的实例,由软件的设计、开发或配置中的错误引起,从而可以利用它来违反某些显式或隐式的安全策略

安全相关的bug==》被攻击者利用==》导致安全失败或者违反安全策略

人类检查和检测系统的语义鸿沟

对代码语义的高级理解需要:

足够的经验编程知识对编程语言本身的理解理解代码的语义和语法对代码库有深入认识(一个例子是心脏滴血漏洞中,需要对n2s函数有了解安全编码的实践自动检测系统

依赖特征集,来自于:

人工提取的(传统机器学习算法自动提取的(深度学习

检测系统无法像从业者那样充分理解易受攻击代码模式的潜在语义。因此,知识渊博、经验丰富的从业者与基于ML的检测系统之间存在语义差距,我们将其定义如下。

语义差距的定义:

语义差距是从业者能够理解的漏洞的抽象语义与ML算法可以学习的语义之间缺乏一致性。

特征的准确性很重要:

人类根据经验总结和提取的特征,可能导致信息丢失或者个人偏见机器学习算法提取的特征,可能拟合不足、过拟合、数据噪声传统机器学习方法

分类

基于软件度量的Metrics基于脆弱代码模式pattern基于异常的anomaly软件度量McCabe:软件复杂性指标

使用这些度量的漏洞检测模型建立在一个假设的基础上,即一个复杂的代码对一个从业者来说是很难理解的,因此很难维护和测试

CodeChurn:软件修改频率

CodeChurn度量意味着经常修改的代码往往是错误的,因此考虑到漏洞是软件缺陷的子集,更有可能是有缺陷的,也可能是脆弱的

软件度量可以作为参考,但是不能作为决定性因素

基于源代码提取模式词袋=》N-gram

容易忽略上下文,忽略了代码丰富的语义(完全相同的令牌和每个令牌的相同频率,可以具有不同的代码语义

基于结构化信息

利用代码分析工具,生成的结构化数据

AST抽象语法树CFG控制流图DFG数据流图PDG程序依赖图CPG代码属性图===将AST、CFG和PDG组合

代码分析工具和解析器的结果的特征集揭示了更多关于代码的信息,因为程序表示的每一种形式都从不同的方面提供了关于源代码的视图

有助于分析变量如何从源流到汇,并可用于构建变量

基于动态执行的跟踪数据基于执行异常的

考虑什么导致了漏洞,而不是如何产生的漏洞

从异常API使用模式中提取的特征、导入和函数调用,以及API符号缺失检查进行漏洞检测

缺点:这些特征集通常与一小组漏洞或特定类型的漏洞相连

从导入和函数调用中提取的特征只能训练一个分类器来检测一些脆弱的头文件或库引入的漏洞,而与缺失检查相关的API符号只能用于发现由于缺乏验证或边界检查而导致的漏洞

只适用于特定任务的应哟个假阳性深度学习技术优点

相比较传统机器学习,深度学习:

能够学习具有更复杂和抽象的高级特征或表示能够自动学习更可概括的潜在特征或表示,从而使从业者免于劳动密集型、主观和易错的特征工程任务提供灵活性,允许针对不同的应用场景定制网络结构。例如,将长短期记忆(LSTM)网络与密集层结合起来,用于学习函数级表示作为高级特征、实现用于学习特征重要性的注意层,以及添加外部内存“插槽”以捕获远程代码依赖

上述深度学习技术的特点使研究人员能够构建能够捕获代码语义、理解代码上下文依赖关系和自动学习更可推广的高级特征集的检测系统。有了这些功能,构建的系统可以更好地“理解”代码的语义和上下文,因此,将进一步缩小语义差距

用于弥补语义差距的特征表示方法

NLP自然语言模型对处理源代码也是有效的

神经模型促进表征学习

不同类型的网络结构用于从各种类型的输入中提取抽象特征,我们称之为特征表示,用于识别易受攻击的代码片段的语义特征

FCN全连接网络

MLP多层感知器

将网络视为学习隐藏的和可能复杂的脆弱模式的高度非线性分类器。

传统的ML算法:

随机森林支持向量机(SVM)C4.5

FCN可以拟合高度非线性和抽象的模式

FCN优点:

FCN具有学习比传统ML算法更丰富的模型的潜力,在大数据集下。这种潜力促使研究人员利用它来建模潜在和复杂的脆弱代码模式输入结构无关的”,这意味着网络可以采取多种形式的输入数据(例如图像或序列)也为研究人员提供了手工制作各种类型功能的灵活性,供网络学习。CNN卷积神经网络

用来学习结构化的空间数据

CNN可以捕捉单词的上下文含义,这促使研究人员应用CNN学习上下文感知的脆弱代码语义

RNN循环神经网络

用于处理顺序数据

RNN的双向形式能够捕获序列的长期依赖关系。因此,许多研究使用双向LSTM(Bi-LSTM)和门控递归单元(GRU)结构来学习代码上下文依赖关系,这对于理解许多类型的漏洞(例如缓冲区溢出漏洞)的语义至关重要)。

各种各样的deepbeliefnetwork(DBN)variationalautoencoders(VAEs)

深度学习技术的另一个有前途的特点是可以定制网络结构,以满足不同的应用场景

已有的工作分类基于图的特征表示:包括AST、CFG、PDG和它们的组合基于序列的特征表示:使用DNN从顺序代码实体中提取特征表示,例如执行跟踪、函数调用序列和变量流/序列基于文本的特征表示:从源代码学习混合特征表示

理由:

这些研究的贡献在于如何处理软件代码以生成特征表示,从而促进DNN对代码语义的理解,并将模式捕获为潜在易受攻击的代码片段的指标。DNN模型作为具有内置表示学习能力的分类器工作。现有的基于不同类型特征输入的研究允许DNN获得揭示不同语义信息的高级表示。基于图的特征表示一种检测SQL注入和XSS漏洞的方法:CFGDFG基于AST的方法,介绍了6个项目,其中有一半是不开放数据集和源代码的(包含手工标注的数据集,使得难以复现)没有研究比较AST与其他形式的基于图形的程序表示,如CFG、PDG或DDGAST

在从源代码中提取AST时,保留了三种类型的节点:

函数调用节点和类实例创建节点声明节点控制流节点

此外,ASTS、CFGS、PDG和DDG是基于图形的程序表示。然而,上述研究没有使用它们原来的树/图形式进行处理,而是在将它们馈送到深层网络之前“扁平”它们。图嵌入技术和基于图的神经网络可以作为处理上述基于图的程序表示的漏洞检测的替代方案,也可能是更有效的解决方案。

基于序列的特征表示

系统执行跟踪、函数调用序列、形成数据流的语句序列等

静态特征:作者从与标准C库函数相关联的一组调用序列中提取静态特征,这需要作者对二进制文件进行拆卸动态特征:获取动态特性需要在有限的时间内执行程序。在执行过程中,作者监视程序的事件并收集调用序列。

得到的动态调用序列包含大量的函数调用参数,这些参数是低级的计算值

codegadget:不仅包含描述数据依赖关系的代码序列,而且还包含揭示控制依赖关系的代码序列准确地捕捉缓冲区错误(CWE-119)和资源管理错误(CWE-399)漏洞的语义模式和特征因此,代码序列形成上下文,捕获与可能的漏洞相关的“全局”语义。

codeattention:为了检测特定的漏洞类型,他们还提出了所谓的“代码注意”,以关注语句中的“本地化”信息

基于文本的特征表示

代码文本是指源代码的表面文本、汇编指令和代码lexer处理的源代码。

DBN和FCN的分层结构能够学习高层表示。

CNN和RNN的变体(例如LSTM网络)能够从文本语料库(如源代码或AST序列)中捕获上下文模式或结构

混合的特征表示

从smali文件中提取了两种类型的特征:

由显示令牌属性的dalvik指令的频率表示的令牌特征通过遍历smali文件的AST生成的语义特征。为了提取令牌特性,作者将smali文件的dalvik指令分为八个类别,并构建了一个映射表

应用深度优先搜索(DFS)遍历将AST转换为序列

挑战和未来的方向大量的ground-truth数据集

数据集是阻碍这一领域发展的主要障碍。在目前阶段,所提出的基于神经网络的漏洞检测技术都是在自构数据集上进行评估的

迫切需要一个标准基准数据集,作为评价和比较拟议方法有效性的统一指标。

代码分析和神经学习

应用于漏洞检测的网络模型变得越来越复杂,为了更好地学习代码语义,指示易受攻击的代码片段,网络模型变得越来越具有表现力。

保留语义的神经模型

在应用神经网络进行脆弱性检测的领域中,一个关键点是通过使神经模型能够更好地用编程语言的语义推理来填补语义空白

在NLP领域,序列建模和自然语言理解的最新进展令人鼓舞。例如,基于自我关注机制的变压器神

代码表示学习

在漏洞检测领域,由于易受攻击的代码模式多种多样,语句形成了一个脆弱的代码上下文,要么在函数边界内(过程内),要么跨越多个函数(过程间),因此定义通用描述所有类型漏洞的特征集几乎是不可行和不可能的。因此,定义特征集反映某些类型的漏洞的特征可以是一种折衷的选择,但开发针对特定类型漏洞的检测系统取得了有希望的结果

模型的人类可理解性

ML模型,特别是神经网络模型,是黑匣子,这意味着模型如何进行预测/分类的原因对于实践者来说是未知的。大量的综述研究没有努力解释模型的行为。在漏洞检测领域,无法理解模型如何预测一段代码是脆弱的/不可破坏的,这可能会导致模型的效用值得怀疑。人们可能会提出以下问题:模型是否值得信赖?或者这个(个人)预测/分类可靠吗?无法理解模型的行为可能是阻碍基于神经网络的模型在实践中应用于漏洞检测的障碍之一。

摄像头漏洞挖掘入门教程(固件篇)

作者:fenix@知道创宇404实验室时间:2017年11月27日英文版本:https://paper.seebug.org/993/

0x00引言

据IT研究与顾问咨询公司Gartner预测,2017年全球物联网设备数量将达到84亿,比2016年的64亿增长31%,而全球人口数量为75亿。2020年物联网设备数量将达到204亿。

而与如此快的发展速度相对应的,物联网的安全问题也日趋凸显,尤其是网络摄像头、路由器等常见设备。我们可以从以下两个案例大致感受一下物联网设备严峻的安全形势。

抓住“新代码”的影子——基于GoAhead系列网络摄像头多个漏洞分析全球2.5万网络摄像机被黑,用于构建DDOS攻击僵尸网络

物联网设备数量的快速增长和其安全性的严重滞后形成了鲜明对比。同时也给恶意攻击者和安全研究人员提供了新的土壤,这场正邪的博弈在新的战场上正激烈上演。

这是一篇详细的入门级别的教程,献给众多想入门智能设备安全的爱好者们。(本文完成于2017年,时隔一年对外发布。)

0x01概述1.0固件及其常见获取方式

固件(Firmware)就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。特殊的,对于市面上大部分的路由器和摄像头来说,固件就是电路板上的25系列Flash芯片中的程序,其中存放着嵌入式操作系统,通常是Linux系统。

获取固件是分析挖掘固件漏洞的前提,本文将以摄像头为例,介绍如何DumpFlash芯片中的固件以及获取固件之后的一些玩法思路。

通常情况下,有以下几种获取固件的途径。

本文涉及后两种方式提取固件的方式。

0x02概念拓展

在开始正式的固件提取之前,先来熟悉几个基础概念。

2.0串口和串口通信

串口(Serialport)又称“序列端口”,主要用于串行式逐位数据传输。

UART(UniversalAsynchronousReceiver/Transmitter)是一种异步串口通信协议。串口遵循UART协议按位(bit)异步发送和接收字节,通常情况下需要连接三对针脚,连线方式如下所示(图片来自网络):

上图中,TX为接收端,RX为传输端,GND为接地端。按照图示方式连接板子的调试串口和USB转TTL串口线,设置好波特率、数据位、停止位和奇偶校验等重要参数后,双方就可以正常发送ASCII码字符,从而进行异步串口通信。

2.1u-boot引导

u-boot是一种普遍用于嵌入式系统中的引导程序,它在操作系统运行之前执行,用来初始化软硬件环境,并最终启动系统内核。

0x03通过调试串口进入系统3.0研究对象

本节我们将从一款无线监控摄像头入手,讲解如何通过调试串口获取系统的Shell。

使用nmap探测该摄像头的开放端口及服务,结果如下

Hostisup(0.0031slatency).Notshown:996closedportsPORTSTATESERVICEVERSION100/tcpopenhttpMongoosehttpd554/tcpopenrtsp1935/tcpopentcpwrapped100100/tcpopensoapgSOAP2.8

监听在100端口的Mongoose是一个嵌入式的Web服务器,gSOAP是一个跨平台的,用于开发WebService服务端和客户端的工具。RTSP(RealTimeStreamingProtocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。

之后可以通过Fidder、wireshark等工具对服务进行抓包分析,然而这不是我们今天的重点。下面我们将从硬件的角度去分析。

3.1需要的工具USB转TTL串口线电烙铁螺丝刀...3.2UART藏哪了

制造路由器、摄像头等设备的厂商通常会在设备上留下调试串口方便开发或售后过程中的调试,为了和设备进行通信,我们首先需要找到这些"后门"。用工具将摄像头拆开,根据主板上芯片上的型号可以识别出芯片的用途。如图,我们找到了处理器和存储器芯片的位置,处理器是国科IPC芯片GK7102,存储器芯片是25系列flash芯片IC25LP128。主板上空闲的接口有三个(右图),左下、右下、右下偏上,经过测试,左下那个是4针debug串口(波特率115200),串口的第一个针脚为Tx,第三个针脚为Rx,分别与USB-转-TTL的Rx,Tx连接(USB转TTL串口线和主板由同一个Hub供电,VCC相差不大,没有连接GND)。

至于如何找到设备上的调试串口,可参考reverse-engineering-serial-ports,此处不再赘述。

minicom是一款Linux平台上的串口工具,在控制台键入以下命令和串口进行通信。

#UsethefollowingBashcode:minicom-D/dev/ttyUSB0

在这步操作的时候很容易遇到权限的问题,介绍一个很粗暴的方法。

sudochmod777/dev/ttyUSB03.3嵌入式系统启动流程

笔记本正确连接主板串口,供电后,在终端可以看到以下系统启动过程中的调试信息。

Flash芯片的分区信息如下

开机后系统启动了以下服务,可能是摄像头服务的主进程。

系统启动完成后,提供了Shell的登陆界面。

通过观察启动流程,我们已经获得了很多有用的信息,对u-boot如何引导系统的启动也有了一个大致的认识。

最后,我们尝试使用弱密码获取系统的Shell,遗憾的是,经过多次尝试,均已失败告终。

3.4登陆绕过

如果你使用过Linux系统,或多或少的经历过忘记系统密码导致无法进入系统的尴尬境地。我们的解决方案也堪称简单粗暴,直接进入grub引导修改密码。所以,如果设备触手可及,几乎不存在进不入系统的问题。

在摄像头这种运行着嵌入式Linux操作系统的设备上,也有一个类似grub的存在,它就是u-boot。

重启设备,根据提示键入组合键进入到u-boot命令行界面。

u-boot命令行内置了很多常用命令供我们使用,键入h查看帮助。

通过printenv打印出u-boot传递给内核的参数信息。

从部分参数的内容可以看到u-boot引导程序是如何移交控制权给内核的。

首先为内核设置启动参数

console=${consoledev},${baudrate}noinitrdmem=${mem}rw${rootfstype}init=linuxrc

将内核从Flash加载到内存中

跳转到内存中内核的起始地址并执行

我们来重点看下启动参数的init字段。

init字段设置内核执行的初始化进程名,比如上面的linuxrc,它是位于文件系统根目录下的一段程序代码,负责后续的系统初始化工作。

是否可以直接修改init=/bin/sh从而实现在系统未初始化完成的时候访问根文件系统呢?我们不妨试一下,在u-boot命令行中修改参数sfboot中init字段的值为/bin/sh并保存,修改后效果如下。(修改前做好参数的备份)

console=${consoledev},${baudrate}noinitrdmem=${mem}rw${rootfstype}init=/bin/sh

重启设备,正如我们所猜想的,修改内核执行的初始进程,我们成功获得了一个Shell。

由于没有经过linuxrc的初始化过程,这样获得的Shell功能是很受限的。在该shell下编辑/etc/shadow文件,擦除或者破解root用户的密码,重启到u-boot命令行界面中修改回原来的启动参数并保存,再次重启到Shell登陆界面,即可获得一个具有完整功能的Shell。

3.5打包上传固件

经过上面的步骤,我们已经可以登录到一个功能完整的Shell,使用tar和tftp命令打包上传根文件系统到tftp服务器即可。

3.6其他技巧

在u-boot中提供了相关命令操作Flash芯片,所以也可以按照如下方式提取固件。(这种cat内存的方式只是一种思路,速度是内伤)

0x04暴力读写固件存储芯片解锁新功能

本小节我们以另一款基于gSOAP协议的摄像头为例(固件存储芯片型号MX25LP128),介绍如何用编程器读写Flash芯片,从而打开该摄像头的telnet服务。

4.0需要准备的工具25系列芯片编程器电洛铁...4.1读取固件

MX25L128这款25系列Flash芯片可以直接在线读取,用夹子夹住Flash芯片,连接编程器即可读取其中的固件。

点击智能识别SmartID,芯片型号识别成功后点击读取Read,最后保存成文件即可。如下图,读取过程非常顺利。

4.2固件解压

binwalk是devttys0大神开发的一款固件分析工具,强烈推荐使用Github上的教程安装,直接apt-get安装会缺少很多依赖。

使用binwalk查看固件结构

内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件。

那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的头部,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没有区别。

固件使用的是squashfs文件系统,它是一套供Linux核心使用的GPL开源只读压缩文件系统。所以设备正常运行的时候是不能对固件进行修改的,在前面那部分,我们从串口进去通过修改内核的初始进程的方式进入系统,是由于系统尚未初始化完成,从而获得了对文件系统的读写权限。

在固件的后一部分,包含一个可以写入的区域。一个JFFS2文件系统,它是在闪存上使用非常广泛的读/写文件系统,设备运行过程中修改过的配置信息和其他数据将被写入这个文件系统中。

squashfs文件系统开始于0x3800000,大小为6963644字节,用dd命令提取该文件系统,用unsquashfs命令解压。

4.3解锁功能

熟悉文件系统结构和已有的命令

很明显,该固件的Shell是基于busybox提供的。从file指令的结果可以判断该摄像头是32位ARM指令架构。

这个busybox是静态链接的,不依赖其他的库文件。可以直接利用qemu-arm模拟运行。

当然,我们也可以搭建一个qemu虚拟机。

在这个网站下载qemu虚拟机镜像文件,然后按照如下方式启动虚拟机。

现在我们已经可以确定目标文件系统是存在telnetd命令的。在根目录下的boot.sh文件末尾添加以下内容,使设备在开启时自动启动telnet服务。

4.4重新封印

现在,对文件系统的简单修改已经完成了,我们该如何重新打包固件,以便重新刷回到设备呢?

还是从固件结构入手,如下

我们自定义的只是中间的文件系统部分。即0x3100000-0xB00000这一段。同时,这一段的长度并不等于squashfs文件系统的大小6963644字节,squashfs文件系统末至下一段开始之前有一段0xff的填充部分。

从uImage头信息可以看到,imagesize为2217456,而squashfs文件系统的起始位置为3670016,没有对squashfs文件系统做CRC检验。

根据以上结论判断,我们只需要在不改变原始固件结构的前提下,将修改后的文件系统重新打包成固件。

利用cat将各段连接起来

4.5刷回

Cheers,重新打包完成。利用编程器将修改后的固件离线刷入固件存储芯片即可。(在线刷各种坑,建议离线写入)

4.6成果

可以看到,我们成功开启了该摄像头的telnet服务。

0x05总结

对智能设备的软硬件有足够的了解是深入挖掘设备漏洞的基础。本文是在对摄像头等物联网设备研究过程中的一些经验总结,希望对大家有所帮助。

本文由SeebugPaper发布,如需转载请注明来源。本文地址:https://paper.seebug.org/649/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇