Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IoT 设备固件分析之网络协议 fuzz

IoT 设备固件分析之网络协议 fuzz

作者头像
信安之路
发布于 2019-04-25 08:57:46
发布于 2019-04-25 08:57:46
4.8K0
举报
文章被收录于专栏:信安之路信安之路

本文作者:cq674350529(信安之路新晋作者)

通常,在对IoT设备的固件进行分析时,固件中与提供服务如HTTPTelnetRTSPUPnP等相关的二进制程序是重点分析的对象。因为一旦在这些程序中发现漏洞,其很有可能会被远程利用,进而带来严重的安全隐患。

对固件二进制程序进行分析,常见的分析方法包括模糊测试补丁比对工具静态扫描人工审计等。其中,模糊测试方法具备简单易用的特点,通常也比较有效,其在业界已被广泛使用。

下面,以某型号路由器为例,基于Boofuzz框架,介绍对常见网络协议进行fuzz的方法。

除了网络协议外,也可以采用类似的思路对其他协议如BLE、串口协议等进行fuzz。同时,该方法不仅局限于IoT设备,也可用于对常见的服务程序进行测试。

模糊测试简介

模糊测试采用黑盒测试的思想,通过构造大量的畸形数据作为应用程序的输入,来发现程序中可能存在的安全缺陷或漏洞。

模糊测试方法的分类有很多。根据测试用例生成方式的不同,可以分为基于变异的模糊测试和基于生成的模糊测试。根据对目标程序的理解程度,可分为黑盒模糊测试、灰盒模糊测试和白盒模糊测试。常见工具与方法的对应关系如下。

针对IoT设备,由于其资源受限和环境受限等特点,实际中常采用黑盒模糊测试的方式。在对网络协议进行测试时,可以将常见的网络协议分为两类:一类属于文本协议,如HTTPFTP等,这类协议的特点是其数据包内容都是可见字符;另一类为二进制协议,其特点是数据包内容大部分是不可见字符,这类协议在工控设备如PLC中比较常见,通常属于私有协议。针对文本协议,笔者常采用Sulley 框架进行测试:

https://github.com/OpenRCE/sulley

而针对二进制协议,则常采用 kitty框架进行测试:

https://github.com/cisco-sas/kitty

Sulley框架和kitty框架均能够对两类协议进行测试。

另外,在对IoT设备进行模糊测试时,需要考虑如何对设备进行监控,以判断是否出现异常。最简单的方式通过设备服务的可用性进行判断,如果设备提供的服务不可访问,表明设备可能崩溃了。但这种监控方式粒度比较粗,容易漏掉一些异常行为。另外,当设备出现异常后,还需要对环境进行恢复,以便继续进行测试。常见的方式就是重启设备。现在很多设备崩溃之后都会自动重启,如果测试目标设备没用提供这种机制,则需要采用其他方式解决。

Boofuzz框架简介

由于Sulley框架目前已经停止更新维护,而Boofuzz框架是Sulley的继承者,除了修复一些bug之外,还增加了框架的可扩展性。下面对Boofuzz框架进行简单介绍:

来源: Fuzzing Sucks! Introducing the sulley fuzzing framework. Pedram Amini & Aaron Portnoy. Black Hat US 2007

由上图可知,该框架主要包含四个部分:

1、数据生成:根据协议格式利用原语来构造请求

2、会话管理/驱动:将请求以图的形式链接起来形成会话,同时管理待测目标代理请求,还提供一个 web 界面用于监视和控制

3、代理:与目标进行交互以实现日志记录、对网络流量进行监控等

通常,代理是运行在目标设备上。但是,对于IoT设备而言,大部分情况下都无法在目标设备上运行代理程序。

4、实用工具:独立的命令行工具,完成一些其他的功能

其中,数据生成会话管理/驱动是比较重要的2个模块。对于数据生成模块,Boofuzz框架提供了很多原语来定义请求,如最基础的s_string()s_byte()s_static()等。对于会话管理/驱动模块,其思想体现在下图中。

来源: Fuzzing Sucks! Introducing the sulley fuzzing framework. Pedram Amini & Aaron Portnoy. Black Hat US 2007

在上图中,节点ehlohelomail fromrcpt todata表示 5 个请求,路径'ehlo'->'mail form'->'rcpt to'->'data''helo'->'mail from'->'rcpt to'->data'体现了请求之间的先后顺序关系。callback_one()callback_two()表示回调函数,当从节点echo移动到节点mail from时会触发该回调函数,利用这一机制,节点mail from可以获取节点ehlo中的一些信息。而pre_send()post_send()则负责测试前的一些预处理工作和测试后的一些清理工作。

理解了这几个模块的功能后,使用该框架进行测试的主要步骤如下:

1、根据网络数据包构造请求

2、设置会话信息(包括测试目标的ip地址和端口等),然后按照请求的先后顺序将其链接起来;

3、添加对目标设备的监控和设备重启机制等;

4、开始fuzz

协议fuzz实战

以某型号路由器为例,由于路由器上HTTP服务是最为常见的,故以http协议为例进行介绍。

模糊测试属于动态分析技术,因此需要有真实设备,或者采用对固件进行仿真的方式。

根据网络数据包构造请求

首先,需要尽可能多地与设备进行交互,然后捕获相应的http请求数据包,如下。

以登录请求为例,对应的http请求报文示例如下。

利用该框架中提供的原语对http请求进行定义,部分示例如下。

是否对某个字段进行 fuzz 需根据具体情况确定。对所有字段都 fuzz,生成的畸形数据包会非常多,测试所耗费的时间比较长,但发现问题的可能性比较大;只对少部分字段进行 fuzz,生成的畸形数据包会比较少,测试所耗费的时间更短,同时发现问题的可能性也比较小。

字段的粒度大小可能也会对测试结果有所影响。比如,如果对<?xml version="1.0" encoding="utf-8"?>进行变异,是将其当作一个整体,还是拆分为更小的单元?

至于具体怎么对某个字段进行变异,如针对字符串的变异,该框架内已包含一些规则。当然,也可以自己增加规则。

类似的,对网络数据包中的其他http接口请求进行同样的定义。

测试的接口越多,触发问题的可能性越大。

设置会话信息

根据捕获的数据包定义完请求后,设置与会话相关的信息,包括目标设备的 ip 地址、端口等。

然后将之前定义的请求按照一定的先后顺序链接起来,部分示例如下。

其中,由于setsysemailsettingssetsyslogsettingssetschedulesettings等请求需要在登录之后才可以正常使用,所以需要在login请求之后发生。而setsysemailsettingssetsyslogsettingssetschedulesettings这几个请求之间则没有明确的先后关系。add_auth_callback为自定义的回调函数,主要用于从login请求中获取用于登录认证的信息如cookie,然后将其设置于setsysemailsettingssetsyslogsettingssetschedulesettings等请求中。

添加对目标设备的监控

这里通过设备HTTP服务的可用性来判断目标设备是否发生异常。如果HTTP服务无法访问,说明设备可能崩溃了。前面设置的Remote_NetworkMonitor()就是用于对服务的可用性进行监测,其核心代码如下。

Remote_NetworkMonitor()为自行添加的代码,不属于Boofuzz框架。

前面也提到过,该监测方式的粒度比较粗,可能会存在漏报,可以采用或结合一些其他的方式进行改进。

1、如果可能,在测试时对设备内部的输出日志进行记录,比如设备打印的一些输出信息;

2、如果可能,在 gdb 调试状态下进行测试。

至于对环境进行恢复,由于该设备崩溃后会自行重启,所以无须额外的操作,只需调用sleep()等待设备重启后即可。

开始 fuzz

最后调用session.fuzz()驱动整个过程,然后运行脚本即可。默认情况下,会在 26000 端口开启一个 web 服务,用于控制或查看测试的进度及相关信息等。在测试完成后,可以通过查看测试记录,看是否有测试用例造成目标设备出现异常,以进行进一步分析。

笔者目前尚未对使用的Boofuzz框架进行更新。在最新的 commit 中,对 web 界面进行了改进,显示的信息更丰富。

小结

本文以IoT设备为例,对模糊测试框架Boofuzz,以及利用该框架对网络协议进行 fuzz 的基本流程进行了简要介绍。如果想要获得更好的效果,还需要对其中的细节进行进一步的优化与完善。

相关链接

boofuzz: Network Protocol Fuzzing for Humans:

https://github.com/jtpereyda/boofuzz

Fuzzing Sucks! Introducing Sulley Fuzzing Framework:

http://docplayer.net/42947526-Fuzzing-sucks-introducing-sulley-fuzzing-framework-pedram-amini-1-aaron-portnoy-2-black-hat-us-2007.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用Peach进行模糊测试从入门到放弃
本文对模糊测试技术进行了综述分析,介绍了开源模糊测试框架Peach的结构、原理及pit文件编写方法,旨在帮助对模糊测试感兴趣的小伙伴能快速入门peach,最后以常见的http协议和工控Modbus协议为例进行了实验。文末搜集了本文所用到的工具和相关资料供大家下载。
FB客服
2019/12/03
5.2K0
【实战】工控网络协议模糊测试:用peach对modbus协议进行模糊测试
本文来自 熊猫(s_panda) 的投稿 0×00 背景 本人第一次在FB发帖,进入工控安全行业时间不算很长,可能对模糊测试见解出现偏差,请见谅。 在接触工控安全这一段时间内,对于挖掘工控设备的漏洞,必须对工控各种协议有一定的了解,然后对工控协议,首先具备的对网络知识以及工控行业流程有所熟悉,其次就是对工控协议进行模糊测试。 0×01 模糊测试介绍 下面介绍一下模糊测试概念以及针对网络协议模糊测试的一些框架。 模糊测试就是通过非预期的输入并监视异常结果来发现软件故障的方法。(相对来说比较抽象,个人理
用户1631416
2018/04/12
3.4K0
【实战】工控网络协议模糊测试:用peach对modbus协议进行模糊测试
Peach原理简介与实战:以Fuzz Web API为例
Fuzz即模糊测试,是一种使用大量的随机数据测试系统安全的方法,Peach就是一种这样的工具。网上零零星星有些介绍Peach的文章,也有少部分使用Peach测试某种文件的教程(其实就是直接翻译官方文档),并没有针对实际协议的真正测试。初学者,往往无从下手,本文从实战出发,穿插讲解Peach套件的一些语法和原理,让你真正从0开始一段奇妙的模糊测试之旅!
FB客服
2019/11/27
2.9K0
关于Fuzz工具的那些事儿
前段时间一直在研究fuzz工具,这里就写篇文章总结一下下。 在安全测试中,模糊测试(fuzz testing)是一种介于完全的手工渗透测试与完全的自动化测试之间的安全性测试类型。能够在一项产品投入市场使用之前对潜在的应当被堵塞的攻击渠道进行提示。 模糊测试(fuzz testing)和渗透测试(penetration test)都是属于安全测试的方法,它们有同也有异,渗透测试一般是模拟黑客恶意入侵的方式对产品进行测试,对测试者的执行力要求很高,成本高,难以被大规模应用。 而模糊测试,它能够充分利用机器
FB客服
2018/02/07
6.4K0
关于Fuzz工具的那些事儿
在渗透测试中使用fuzz技术(附windows安装指南)
前言:本文翻译自‍‍‍‍sans.org,有删节。在学习sulley的过程中发现中文参考资料很少,所以抛砖引玉翻译一下,希望对学习协议fuzz测试的同学有帮助。本文适合作为学习sulley协议测试过程中参考资料,如果需要学习sulley的使用可以参考其文档。 背景 不久前,我们接到了一个渗透测试的项目。分配任务的时候,团队里有的同学负责无线渗透,有的负责web应用渗透,我分到的任务是对外网开放的网络端口进行测试。我的主要测试范围包括:从外部可以访问的系统接口,不包括客户测的漏洞利用,不包括web应用,不包括
FB客服
2018/02/02
2K0
在渗透测试中使用fuzz技术(附windows安装指南)
模糊测试(fuzzing)是什么
大学时两个涉及“模糊”的概念自己感觉很模糊。一个是学数据库出现的“模糊查询”,后来逐渐明白是指sql的like语句;另一个是学专业课时出现的“模糊测试”。
顾翔
2019/12/12
1.5K0
模糊测试(fuzzing)是什么
一系列用于Fuzzing学习的资源汇总
本文主要是向大家推荐一系列,用于fuzzing和Exploit开发初始阶段学习的资源合集,其中将包括相关的书籍,课程 - 免费或收费的,视频,工具,教程,以及一些供大家练习使用的靶机应用。(PS:文内所有链接点击“阅读原文”均可查看)
FB客服
2018/07/30
2.3K0
关于Fuzzing模糊测试入门原理及实践的讨论
"The best alternative to defense mechanisms is to find and fix the bugs."
王驭停
2021/09/19
3.6K0
关于Fuzzing模糊测试入门原理及实践的讨论
Google内部Fuzz测试字典
项目地址: GitHub https://github.com/google/fuzzing
YanXia
2023/04/07
6340
Google内部Fuzz测试字典
面试官:了解Fuzzing Test吗?
测试同行或多或少听说过模糊测试,但不知道它是什么?本文将详细介绍Fuzzing Test帮助你快速了解它。
互联网金融打杂
2022/08/01
7920
从研究者的视角看Fuzzing技术发展30年
1988年,在威斯康星大学Barton Miller教授的计算机实验课上(http://pages.cs.wisc.edu/~bart/fuzz/CS736-Projects-f1988.pdf),首次提出Fuzz生成器(Fuzz Generator)的概念,用于测试Unix程序的健壮性,即用随机数据来测试程序直至崩溃。因此,Barton Miller教授也被多数人尊称为"模糊测试之父"。但是,当时更多是为了验证代码质量和程序的稳定性,而非专门用于挖掘安全漏洞,真正用于软件安全漏洞挖掘的开端要从下面两件事说起。
泉哥
2020/02/14
2.5K0
MikroTik-SMB 测试之 Mutiny-Fuzzer
Mutiny是由思科研究人员开发的一款基于变异的网络fuzz框架,其主要原理是通过从数据包(如pcap文件)中解析协议请求并生成一个.fuzzer文件,然后基于该文件对请求进行变异,再发送给待测试的目标。通过这种方式,可以在很短的时间内开始对目标进行fuzz,而不用关心相关网络协议的具体细节。
信安之路
2020/07/06
2.1K0
Sinec H1通信协议分析及模糊测试
Sinec H1是第一个基于以太网的工业协议,可提供传输层功能。该协议由西门子推出,目的是使用现有标准并丰富工业通信协议的相关细节,主要用于控制系统之间的数据传输。它具有大带宽特点,非常适合传输大量数据。基于ISO / IEC 8073标准,定义了不同的传输方法。
绿盟科技研究通讯
2019/12/11
2K0
Sinec H1通信协议分析及模糊测试
Scalpel:解构API复杂参数Fuzz的「手术刀」
Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点,让漏洞Fuzz向量能够应对复杂的编码与数据结构,实现深度漏洞挖掘。
小阑本阑
2022/11/08
1.1K0
Scalpel:解构API复杂参数Fuzz的「手术刀」
123个Python黑客工具,再也不用问女朋友要手机密码了
今天的文章来源于dloss/python-pentest-tools,本文中列举了123个Python渗透测试工具,当然不仅于渗透~ 下面我们就开始吧~ ———————————————————————— 如果你想参与漏洞研究、逆向工程和渗透,我建议你时候用Python语言。Python已经有很多完善可用的库,我将在这里把他们列出来。 这个清单里的工具大部分都是Python写成的,一部分是现有C库的Python绑定,这些库在Python中都可以简单使用。 一些强力工具(pentest frameworks
小小科
2018/05/03
1.7K0
123个Python黑客工具,再也不用问女朋友要手机密码了
IOT漏洞研究:Web服务
路由器、防火墙、NAS和摄像头等由于功能复杂,为方便交互一般都会提供web管理服务,和服务器web相比,IOT的web功能较为简单,也就避免了一些复杂功能存在的漏洞,但是由于嵌入式设备的硬件瓶颈,设备自身的安全检测与防护能力有限,也就增加了其安全风险。 IoT Web服务 IOT web常采用开源框架+自研模块的方式,漏洞特点也较为明显: (一) 自研CGI模块中存在漏洞的概率较高,漏洞差异性大 (二) 开源框架(可能的)漏洞广泛存在各种设备,漏洞同源性强 虽然具体漏洞存在差异,但常见的大致分为几类。 2.
FB客服
2023/04/26
1.1K0
IOT漏洞研究:Web服务
网络协议基础:解读TCP/IP协议栈、HTTP、HTTPS、DNS等协议原理
这里推荐一篇实用的文章:《数据库加密数据模糊匹配查询技术方案》,作者:【Lorin 洛林】。
Echo_Wish
2024/11/27
3180
网络协议基础:解读TCP/IP协议栈、HTTP、HTTPS、DNS等协议原理
网络基础之网络协议篇
一、初识网络协议 网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。一个很形象地比喻就是我们的语言,我们大天朝地广人多,地方性语言也非常丰富,而且方言之间差距巨大。A地区的方言可能B地区的人根本无法接受,所以我们要为全国人名进行沟通建立一个语言标准,这就是我们的普通话的作用。同样,放眼全球,我们与外国友人沟通的标准语言是英语,所以我们才要苦逼的学习英语。 英语成为世界上所有人通信的统一标准,如
用户1214487
2018/01/23
1.4K0
网络基础之网络协议篇
专为渗透测试人员设计的 Python 工具大合集
如果你对漏洞挖掘、逆向工程分析或渗透测试感兴趣的话,我第一个要推荐给你的就是Python编程语言。Python不仅语法简单上手容易,而且它还有大量功能强大的库和程序可供我们使用。在这篇文章中,我们会给大家介绍其中的部分工具。 注:本文罗列出来的工具绝大部分都是采用Python编写的,其中有一小部分还使用了C语言库。 Network(网络) lScapy:一款强大的交互式数据报分析工具,可用作发送、嗅探、解析和伪造网络数据包。 lpypcap、Pcapy和pylibpcap:配合libpcap一起使用的数据包
企鹅号小编
2018/02/08
1.4K0
专为渗透测试人员设计的 Python 工具大合集
网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
进程间通信有多种方式,包括管道、消息队列、共享内存和信号等。然而,如果不同设备上的进程需要进行通信,就只能通过网络来实现。由于设备的多样性,为了兼容各种设备,就需要一个统一通用的网络协议。
努力的小雨
2023/11/27
7110
推荐阅读
相关推荐
使用Peach进行模糊测试从入门到放弃
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档