前言
不知道为啥看不到,重新发一遍。之前测了买的二手路由器的CVE,现在该继续发挥利用价值,本文将采用CH341A编程器对路由器FLASH闪存进行提取,并对提取的闪存进行分析以讨论家用路由器闪存内容是否可以作为电子证据的一部分。提取
其中闪存为图中左上角八针芯片,具体如下图。这是一颗台湾亿芯产的25系列芯片,最上面的cFeon代表生产厂商,QH16-104HIP为芯片参数,其中Q的意思为系列标识,H为电压标识对应3.3V,16代表内存大小,单位为Mbit即固件大小最多2MB,104为时序等级编码,HIP为封装等级后缀。本文采用的CH341A如下图,基座上面8个针孔为25系列,下面为24系列。芯片夹夹住闪存芯片如下所示,可以看到路由器的灯也通电,需要注意的是,芯片夹的红线必须对应芯片上凹陷圆点的位置,切忌夹反。使用NeoProgrammer.exe检测读取后,保存固件。解析
加载器是flash最先执行的一段代码,其大致结构如下AI可以直接反编译初始化代码,这里展示部分解析结果0x0D80 lui $t0, 0xb804 ; ── 第一段:GPIO 输出功能0x0D84 lw $t1, 0($t0) ; $t0 = 0xB80400000x0D88 lui $t2, 0xffc30x0D8C ori $t2, $t2, 0x0fff ; mask 0xFFC30FFF → 清 bit12..210x0D90 and $t1, $t1, $t20x0D94 lui $t2, 0x00020x0D98 or $t1, $t1, $t2 ; 置 bit170x0D9C sw $t1, 0($t0)…0x0E80 lui $t0, 0xb8040x0E84 ori $t0, $t0, 0x0030 ; $t0 = 0xB8040030 (GPIO_OUT_FUNC1)0x0E88 lw $t1, 0($t0)0x0E8C addiu $t2, $zero, 0xff000x0E90 and $t1, $t1, $t2 ; 保 GPIO5 字段,清 GPIO4/6/70x0E94 sw $t1, 0($t0)0x0E98 lui $t0, 0xb8040x0E9C ori $t0, $t0, 0x006c ; ★ $t0 = 0xB804006C = AR934X_GPIO_REG_FUNC0x0EA0 lw $t1, 0($t0) ; 读-改-写0x0EA4 addiu $t2, $zero, 0x0002 ; ★ 0x0002 = BIT(1) = JTAG_DISABLE0x0EA8 or $t1, $t1, $t20x0EAC sw $t1, 0($t0) ; ★ 写入:GPIO_FUNC |= JTAG_DISABLE0x0EB0 lui $t0, 0xb8040x0EB4 lw $t1, 0($t0)0x0EB8 addiu $t2, $zero, 0xfff00x0EBC and $t1, $t1, $t2 ; 清 GPIO0..3 输出位(把 JTAG 四根脚拉低)0x0EC0 sw $t1, 0($t0)0x0EC4 jr $ra
引导器和主镜象主要为路由器启动后UART串口的初始化和CLI命令的启动,这里不走过多分析。最关键的为文件系统和配置,该路由器的文件系统为自定义索引结构,其超级块结构如下。0x140960 6F 77 6F 77 6F 77 6F 77 … "owowowowowowowowowowowowowowowow" ; 32 B 魔数/签名0x140980 00 00 00 01 ; u32BE = 1 (版本?)0x140984 00 00 ; u16BE = 00x140986 00 AC ; u16BE = 172 ★ 目录项数0x140988 00 00 77 7C ; u32BE = 0x777C (数据区/校验相关字段)0x14098C ── 目录表开始 ──
+0x00 char name[42] 文件名(ASCII,NUL 填充;无路径、无子目录 —— 扁平单层)+0x2A u16BE size 该文件在 flash 上占的压缩字节数+0x2C u32BE offset 相对 FS 基址(0x140960)的偏移共 0x30 = 48 字节,172 项,目录区 = 0x14098C .. 0x1429CC(8,256 B)
按照索引结构提取文件,提取出固件中htm、js和jpg文件共172项,部分文件展示如下。Index.htm —— 首页框架(<TITLE>TL-WR841N</TITLE>,charset=gb2312)menu.js / str_menu.js / str_err.js —— 菜单结构与中文字符串表(GB2312 编码)Thumbs.db —— Windows 资源管理器缩略图缓存被误打包(OLE 复合文档,23,552 B)。这是产线/开发打包流程"整目录塞进工具"的直接痕迹,属制造者指纹类证据。WlanStationRpm.htm / SystemLogRpm.htm / StatusRpm.htm —— 这三个是"无线客户端列表 / 系统日志 / 状态",但页面本体只有空模板(数据由固件在响应时注入 JS 数组),所以从固件里读不出连接历史。WlanSecurityRpm.htm(解压 27,486 B)/ WlanNetworkRpm.htm(23,880 B)—— 最大的两个页面
配置块是取证的关键,他记录了管理后台的账户密码和wifi的密码等等配置信息,存储了设备异常日志(没用网络日志)和序列号。从固件来看,可以提取到的案件支撑性线索几乎为0,既没有明确的路由表记载,也没有连接设备历史记录统计。不过对于利用路由器XSS的记录还是留存下来的,如下表。如果看过之前那篇CVE测试的文章,这正是我测试时留下的痕迹,他们被保存在配置块的末尾,从这方面来说,固件的提取还是有一定意义的。 | | | |
|---|
| <img src=x onerror=alert(1)> | | desc 0x1C2447 / mac 0x1C2468 |
| | | desc 0x1C2470 / mac 0x1C2491 |
| | | |
| | | desc 0x1C253D / mac 0x1C255E |
结语
总的来看,至少对于这个路由器来看,固件数据的内容很难对案件还原或者起到支撑作用,其小内存也决定了开发者不可能往里面读写大量的数据,关键还是来到内存提取的方面,所幸的是AI解析到该路由器开启了UART,虽然在板子上没找到串口但是通过主控芯片引脚应该也可以尝试获取内存shell进而获取内存镜像。下一期的固件分析预定到路由器的内存提取与解析,如果感兴趣的请点个关注吧,这会为我提供更大的动力。另外,之前的文章我提到要出一套题目,目前主体框架已经完备,基本都是物联网检材(也包含这个路由器),也是废了一番心思,我会尽量在美亚杯之前出完整套题目给各位师傅做做练手。