快乐学习之入门IOT(一)
前言
随着技术的进步,智能硬件有了长足的发展,未来将会是一个万物互联的物联网时代,作为信息技术时代的新兴产物,IoT 以迅猛的发展速度正悄然地走进千门万户,据 Gartner 统计,到2022年IoT的设备数量规模将增至约 208 亿,而 IoT 在互联网传输的数据将超过 20ZB。
IOT在CTF中一定程度上可以说是pwn+web的合体,因为它经常会涉及到两个方向的手法和思路,所以有一定的二进制基础和渗透基础,对于IOT的快速上手是非常有利的,并且在学习IOT的时候,需要一定的电子技术知识,在提取固件时需要用到。
几乎所有刚接触IOT安全的选手大都会选择路由器来作为入门学习的设备,所以本文我们会用路由器来作为例子讲解
我们在路由器的挖掘中常见为flash文件系统,操作系统多为VxWorks、小型linux以及OpenWRT。下面介绍一下常见的嵌入式文件系统和操作系统
嵌入式文件系统
基于存储设备的文件系统:内存文件系统(tmpfs、ramdisk)、flash文件系统(cramfs、squashfs、jffs/jffs2、yaffs/yaffs2、ubifs)、拓展SD卡文件系统(FAT32、ext2/ext3)、网络文件系统(Samba)
基于逻辑的文件系统储存:进程文件系统(procfs)、设备文件系统(sysfs)
操作系统
根据信号处理的实时性:实时性操作系统(RTOS、VxWorks等)、分时操作系统(Linux等)
根据用途划分:通用操作系统(PC等)、嵌入式操作系统(物联网设备等)、专用操作系统(军事、医疗等)
根据内核结构划分:微内核(windows)、宏内核(Linux)
固件提取
前置介绍
固件一般存储在 ROM 中,ROM 是只读存储器(Read-Only Memory)的简称,常见的存储芯片按照存储读取方式和制作工艺不同,可以分为:ROM、PROM、EPROM、EEPROM、FLASH-ROM。在大部分IOT产品中多采用 flash 芯片作为存储器,提取固件主要也是通过读取 flash 芯片。
对于固件的提取我们需要掌握一定的数电和模电基础,以及需要一些仪器工具来提取固件
- 万用表
- 编程器
- 等其他线材耗材
读取方法
1、直接将导线连接到芯片的引脚,在通过飞线连接编程器,进行在线读取固件;
2、把芯片拆焊下来,通过烧录座编程器,离线读取固件。
3、官网下载固件包或者升级包
这个方法最为方便,但是这个方法下载的固件可能不全或者存在加密,需要手动解密,这时候“方便”反而是不方便了hhh。
固件分析
工具介绍
子曰:“工欲善其事,必先利其器 ”,所以我们要准备好降龙大棍子,整把金太刀,整个红甲这把我必吃~
binwalk :用来提取常见的固件
dd:手动提取某处地址/偏移的文件
lzma,unzip等:压缩/解压缩工具
unsquashfs:文件系统提取工具
fcrackzip:压缩包密码破解工具
strings:提取null结尾字符串工具
hexdump,winhex:十六进制查看工具
fdisk:磁盘操作工具
这里我们详细的说说常用的binwalk,其他各自可以自己试试看。
Binwalk 用来提取常见的固件
在我看来Binwalk简直是解固件的好东西,就像CSGO中警的400块大洋的钳子,有了它拆包可就快乐不少,下面简单的介绍工具使用。
binwalk常用参数
• 熵分析(-E,--encrypto) • 递归处理(-M, --matryoshka)
• 文件提取(-e,--extract) • 签名分析(-B,--signature)
• 搜索字符串(-R, --raw=) • 搜索各种CPU架构常见的可执行操作码(-A, -- opcodes)
• 识别反汇编代码的CPU体系结构(-Y,-- disasm) • --verbose将另外打印反汇编的指令
Q&A
问题一:我们在默认用apt-get安装时并没有安装所有的依赖包,所以我们会发现我们无法提取出对应的文件包。
解决办法:可以通过去观察文件的格式,去下载对应的依赖文件。
问题二:发现使用binwalk直接去解包,不可以直接提取。
解决办法:通过-E去查看熵值,查看有没有加密用-B去查看签名信息
问题三:Binwalk常用参数
解决办法:-R 搜索字符串 -A 查看架构
开始分析
当我们解包完一个固件之后我们便拿到了它的文件系统文件:
进入后我们可以看到有个linux一样的目录结构,就像黑客进入了你的心一般,如下图:
我们一般选择寻找httpd服务或者协议服务来进行一个漏洞审计和攻击,快速寻找该文件,我们可以使用grep工具,如下图:
然后我们将文件拖入IDA即可开始分析,漏洞点,这里我们通过CVE-2022-34597这个简单的命令注入漏洞来讲解分析过程,虽然对于该漏洞我已写过一篇文章。
对于固件我们选择官网下载:
固件的提取很简单, 通过Binwalk提出来是一个ubifs的系统,固件模拟上可以使用firmAE但是对于该漏洞可能不太适合,因为实际操作发现firmAE模拟可能会以为cfm的问题无法复现,建议采用真实设备或者qemu-system模式进行模拟,因为篇幅原因,固件模拟可能会在后续文章中单独出一文。
通过在主服务中寻找,发现存在save_encrypted_data()函数调用:
随后寻找该函数所在详细内容,发现该函数存在一个明显的命令注入点,可以通过借助popen实现的命令注入漏洞点:
吃完饭以后,先运功打他一套降龙十八掌,随后通过分析阅读,该函数的引用位置,我们就可以去设备的相关功能界面进行抓包或者直接构造攻击流量,在这里我是没有逆向其他参数的,所以为了方便我选择了抓包:
通过这里我们可以判断为非0为真,当我们抓包改adslPwd参数后,构建写入 “ ls > ./aaaaaaaaaaaa ”文件证明我们成功执行了命令:
通过上面的返回,我们可以看到我们成功的在目录下创建了一个aaaaaaaaaaaaaa的文件,证明了漏洞可利用,我们也就可以完结撒花啦~
结束语
IOT的入门远远没有想象的难,IOT的世界也远比想象的有趣,只要你有兴趣,愿意探索,一定会很快取得成就,并且登上金字塔的顶端。本文只希望读者可以大概了解常见的IOT设备(如路由器)的挖掘过程和思路,了解一个流程,当你了解以后,其实对于其他的IOT设备都是差不多的一个流程,只是审计的服务和架构不同。谢谢宝贝们的阅读!