IoT设备获取本地shell权限并进行软件调试

一颗小胡椒2022-05-02 16:56:26

1、简介

笔者近期研究了一些智能家居设备,这些设备开放端口较少,网络侧基本无法获取调试权限。本地获取设备的调试权限,在当前的攻防形态下,就变成了一个重要步骤。本文主要记录通过串口、固件篡改获取本地权限的过程。

如下图所示的设备,位置1为flash芯片,位置2为串口调试接口。使用串口线进行串口探测,将主板上的接口一一引出,再使用万用表测试电平,最后判定其串口线序,这一步许多道友都分享了,这里不再赘述。接下来主要介绍记录获取本地shell权限和调试环境的过程。

图 1 设备主板flash和串口位置

2、本地权限获取

本节主要介绍3个步骤,分别是串口探测、读取固件、更改固件。这三个步骤的实验可使设备运行更改后的固件,并成功执行本地shell和telnetd服务。

2.1 串口探测

使用串口线连接到设备后,显示(none)login,需要进行登录。因为不知道密码,暂时无法获取本地root权限。

图 2 本地提示登录

尝试更改uboot启动参数时,uboot设置了密码。

图 3 进图uboot命令行之前提示输入密码

尝试把uboot提取出来后,发现一个密码,但是输入到uboot中,无法登录,暂时没办法短时间内通过uboot启动我们指定的固件。

图 4 uboot逆向后硬编码的某字符串

综上,在串口上直接获取本地权限比较困难,逆向完uboot需要的时间成本较大,决定改flash上的固件获取权限。

2.2 读取固件

硬件上使用Norflash,硬件上处理固件相对容易。本次使用工具如下:

Ø  Xgpro T56编程器

Ø  Putty

Ø  USB转TTL线

Ø  拆焊台

使用编程器将固件读取后,可直接使用binwalk解压到文件系统,进而进行固件的静态分析。

图 5 binwalk输出的固件结构

Binwalk的结构看起来有些识别误差,我们查看F40000附近后,可确定0x440000-0xF40000处为JFFS2文件系统分区(而非0xF400D4)。

图 6 固件0xF40000位置

使用dd命令分割固件,将该区域的文件系统文件使用binwalk解压后,可得到以下文件系统内容。

图 7 JFFS文件系统内容

使用binwalk解压整个固件,可得到根文件系统目录,如下所示:

图 8 根文件系统结构

在根文件系统下搜索”boot.sh”,确定boot.sh会在开机启动。

图 9 开机启动boot.sh

也就是说,JFFS2文件系统作为一个MTD分区被加载到内存后,进行了挂载,并在启动脚本”S90init”中启动。我们只需要更改该脚本,并启动telnetd和串口shell即可。

2.3 更改固件

由以上实验可知,更改boot.sh即可执行本地命令。在boot.sh中增加如下所示内容。

图 10 固件更改内容

 

下面重新打包固件。主要步骤如下:

Ø  将被更改的固件目录重新打包为相同格式的文件系统rootfs.jffs2。

Ø  制作全“ff”的文件系统out1024.bin。

Ø  将rootfs.jffs2填充到out1024.img中。

Ø  将out1024.img填充到原固件中。

分别对应下列命令:

图 11 更改固件对应的命令

使用编程器进行固件烧录,这里不再赘述编程器的使用过程。再次启动设备后,发现设备启动了更改后的脚本:

图 12 更改后的固件生效

telnet也连接shell成功:

图 13 连接telnet shell成功

 

3、调试环境

本节介绍两个方面的内容,分别是NFS服务的搭建流程和交叉编译环境的搭建流程,通过这两个流程,我们实现了拓展本地运行存储空间,并建立了软件进程的调试环境。

3.1 NFS服务

本地拿了权限,但是设备没有太多的空间供我们使用,具体如下所示。、

图 14 设备自身空间使用情况

查看/proc/filesystems确认设备具备NFS服务挂载的模块,使用NFS服务外部硬盘到本地执行gdbserver或者tcpdump是一个比较好的选择。

图 15 filesystems文件内容

本地搭建好NFS服务后,让服务主机与设备在一个子网中,可远程挂载NFS服务到本地,解决了本地空间不足的问题。具体如下。

图 16 挂载远程硬盘成功

图 17 挂载远程硬盘拓展容量

3.2 交叉编译环境

3.2.1 确定交叉编译器

全盘搜索“arm-”可得到以下信息,确定交叉编译工具为arm-none-linux-gnueabi-4.4.0_ARMv5TE,具体如下图所示。在网上可找到其下载地址。

图 18 确定交叉编译器

图 19 网上搜索到交叉编译器链接

构建交叉编译环境的过程就是解压、添加PATH到系统中的过程,这里不再赘述,接下来尝试编译gdbserver。

 

3.2.2 交叉编译gdbserver

由图 网上搜索到交叉编译器链接 可知,交叉编译器的版本可追溯到2012年8月份。这里选定2013年左右的gdb-7.6.1进行编译,出错的概率会小些。

Gdb依赖的termcap库不在交叉编译环境中,下载termcap-1.3.1.tar.gz并交叉编译后,将编译生成的libtermcap.a复制到交叉编译环境的lib目录下即可编译gdbserver成功。编译gdbserver的命令如下:

./configure --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc

这一条命令分别在gdb根目录下和gdb/gdbserver目录下运行,即可生成交叉编译后的gdb和gdbserver。将编译后的文件复制到nfs共享目录下:

图 20 复制gdb和gdbserver到共享目录下

图 21 在设备上执行gdbserver和gdb成功

图 22 gdbserver attach进程成功

图 23 建立调试连接

最后建立连接的时候暂时出现了一些问题。看门狗给把进程关掉了,后面的调试还要绕过看门狗,这里不再赘述。

图 24 看门狗kill了调试进程

4、总结

本文通过记录智能家居设备的部分研究过程,向读者分享了嵌入式产品简单的固件分析、固件篡改、调试环境的建立流程。希望对各位读者的安全研究有帮助。

由于现有设备的特殊性,这些方法只是达到阶段目标的可行方式之一。比如烧录固件,也可以通过uboot的tftp功能烧录,还可以通过uboot加载DIY的固件等等,这些功能比较简单,但归根结底还是向flash中写入数据,并将flash区域中的数据读取到内存空间后进行启动的过程,单独成文的必要性不大,有兴趣的同学可以单独沟通。

ubootuboot启动流程分析
本作品采用《CC 协议》,转载必须注明作者和本文链接
本地提示登录尝试更改uboot启动参数时,uboot设置了密码。固件0xF40000位置使用dd命令分割固件,将该区域的文件系统文件使用binwalk解压后,可得到以下文件系统内容。根文件系统结构在根文件系统下搜索”boot.sh”,确定boot.sh会在开机启动
Mysql攻击总结
2021-11-17 04:43:35
Mysql数据库在无论是在渗透测试还是正常使用都是比较常见的数据库,周末没事做,顺便总结梳理了mysql近些年的常见攻击利用方法。 0x01 简单介绍 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 0x02 基础指令 在mysql
细说从0开始挖掘cms-
2022-08-17 16:26:57
确立目标挖洞的第一步首先是确立一个目标,也就是找个cms来挖,这里可以通过github,gitee或者谷歌百度直接去搜cms。或者cnvd查看相应的信息,通过查看相应的信息可以提高我们挖洞的效率,我们从中可以知道该项目已经存在漏洞,我们到时候挖就可以看看相应的地方会不会还存在漏洞或者避免挖到别人挖过的漏洞。本次挖掘的漏洞是ofcms,首先先下载一下源码,然后解压丢一边,回到网页来看一下项目文档。
FastCGI与PHP-FPM FastCGI 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使[服务器可以同时处理更多的网页请求。
利用SSRF渗透内网主机
2021-12-26 07:39:35
接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程
并且在 MySQL 执行完毕之后,还能拿到执行结果,如果执行出错,也要能拿到 MySQL 抛出的错误。而负责上述逻辑的,我们称之为驱动,Python 里面的 MySQL 驱动最常用的就是 pymysql,这是一个同步驱动,异步驱动的话则是 asyncmy。
同时又在默认的系统环境下,通过pip安装部署,大多数情况下,是不会出现问题。相关的依赖库,在Python安装之后,都是通过pip来安装。但实际我们装个python2.7版本的环境就基本满足目前的需求。我们创建了一个叫做py27的虚拟环境。workonpy272.4 安装Opencananrypip在安装opencanary时,会自动安装他所需求要的各种依赖,一般不出问题的话,一切都会顺利安装完成。
1Docker 迁移存储目录默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下[问题起因]?今天通过监控系统,发现公司其中一台服务器的磁盘快慢,随即上去看了下,发现?由上述原因,我们都知道,在?中存储的都是相关于容器的存储,所以也不能随便的将其删除掉。设备进行扩容来达到相同的目的。的详细参数,请点击查看?但是需要注意的一点就是,尽量不要用软链, 因为一些?容器编排系统不支持这样做,比如我们所熟知的?发现容器启动不了了
在公司搭建系统级别的监控,由于ELK对流量监控存在局限——现有的工具只记录了累计的流量,而无法计算每时每刻的流量。所以决定最后用zabbix来对网络做监控和报警,下面会从零开始记录zabbix搭建过程中的所有步骤,希望可以给你带来帮助。 安装前准备工作 安装必要的软件,禁用SELINUX,安装必备软件
一颗小胡椒
暂无描述