0x00 思路

攻击面

设备对输入进行处理的流程

输入意味着有接口

处理意味着有逻辑

安全风险

  • 物理感知层(固件提取、硬件攻击)
  • 通信层(流量监听、中间人攻击)
  • 管理控制层/应用层(web、rtsp、ssh)

IOT设备信息收集

  • 端口扫描(外部嗅探:nmap/内部调试:netstat -anltu)
  • 流量抓取、分析(外部嗅探:开热点直接抓包/内部调试:看电路板分析)
  • 功能点评估

web逻辑漏洞

未授权访问

  • 敏感路径,例如直接访问view.html、system.html可以直接绕过
  • cookie伪造
  1. D-link 850l认证绕过

  1. D-Link DCS-2530L摄像头可访问未认证的敏感路径

image-20220808061059747

  1. tenda未授权绕过

image-20220808062816467

image-20220808063046339

  1. RTSP(视频实时流传输协议)服务未授权访问:该协议是用来控制声音和影像的多媒体串流协议,常开放在554端口

image-20220808063412307

  1. 通过爆破url的order_id和id可以获得所有用户的密码

image-20220811090542889

命令注入

  1. burpsuite fuzz
  2. cookie常见溢出,注入,命令执行

拒绝服务

固件代码逻辑验证不足造成指针异常,让程序非正常崩溃

后门漏洞

  • 服务访问后门(web服务/rtsp服务)
  • 调试后门(软/硬件)

任意文件读取

  • 存在路径穿越,没有对../../进行过滤
  • 符号链接漏洞

常见挖掘方法

  • 固件逆向分析-分析输入点
    • 寻找二进制中统一的cgi输入接口函数
      • 例如getenv(“HTTP_HOST”)、get_cgi(“device”)、websGetvar(wp,”device_id”,””)
  • 固件逆向分析-敏感函数/代码段回溯
    • 寻找类似于system等函数的参数是否可控
    • 可以借助ida脚本(有些可能不是system函数,而是把system函数进行了封装,所以需要去回溯其他的函数)
1
2
3
4
5
6
7
8
9
#列出所有引用system的函数地址
import ida
import idc
system_list=set()
for loc,name in Names():
if "system" == name:
for addr in XrefsTo(loc):
system_list.add(addr.frm)
print(system_list)
  • fuzz(通信协议/固件)
    • 端口fuzz
      • cat /dev/urandom | nc 192.168.0.1 9898
      • cat /dev/random | nc 192.168.0.1 9898
    • burpsuite
    • 协议fuzz(boofuzz/peach)

0x01 常用漏洞组件中的漏洞频发点

常见web管理服务:

lighttpd

历史漏洞:

  • CVE-2018-18878
  • CVE-2015-1548

漏洞频发点:

  • CGI in C/C++ /bash/…
  • Php
  • Asp

thttpd/mini_httpd

漏洞频发点:

  • thttpd对header内容没有检查
  • CGI in C/C++ /bash/…
  • Php

GoAhead

历史漏洞:

  • CVE-2019-5096
  • CVE-2017-17562

二次开发过程中漏洞频发点

  • goform Handler
  • asp Handler
  • security handler
  • CGI in C/C++ /bash/…

uhttpd(openwrt社区默认的服务器)

历史漏洞:

  • CVE-2019-19945
  • CVE-2018-19630

主流组件漏洞:

  • LuCI
    • CVE-2019-17367
    • CVE-2019-12272
  • UCI
    • CVE-2020-28951

漏洞频发点:

  • CGI in C/C++ /bash/…
  • Lua
  • PHP

Boa

各厂商自研

MoxaHttp

ZTE Mini Web

0x02 常用组件的漏洞频发点

UPNP服务

  • Miniupnp/MiniDLNA
    • CVE-2020-28926
    • CVE-2019-12106
    • CallStranger
  • Libupnp(Broadcom upnp)
    • CVE-2020-13848
    • CVE-2016-8863
  • 各厂自研

RTSP服务

  • Live555
  • HiChipSDK(闭源)
  • 各厂自研(D-Link大部分使用的都是自己的产品)

其他服务

  • TDDP
  • CDP
  • mywifi

0x03 小技巧

  1. 可以通过搜索FFFF来查找固件有多少个文件
  2. squashfs的文件头部是hsqs,如果是sqsh可能是文件被倒过来了
1
2
3
4
5
6
7
8
9
10
def reverseBS(src):
dst=''
for i in range(0,len(src),4):
dst += src[i: i+4][::-1]
return dst
raw=open("camera.bin","r").read()
fs0=raw[0x1f0000: 0x2f3000]
fs1=raw[0x310000: 0x536000]
open("0.fs","w").write(reverseBS(fs0))
open("1.fs","w").write(reverseBS(fs1))

0x04 挖掘思路

  1. 首先分析攻击面:
  • 设备固件:启动脚本/etc/init.d/,常见的服务二进制(boa,lighthttpd)
  • 在线设备(无shell):端口扫描
  • 在线设备(有shell):进程(ps),网络(netstat -pantu)
  1. 定位程序
  • 寻找开源组件1day
  • 字符串搜索:grep -Rn “xxx” 2>/dev/null

0x05 流量调试

MQTT

  1. MQTT(消息队列遥测传输协议)是基于发布/订阅(Publish/Subscribe)模式的轻量级物联网通信协议,它可以用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
  2. 默认端口是1883,websocket端口8083,默认消息不加密,8883端口是通过TLS加密的MQTT协议。
  3. 基于TCP/IP网络连接,提供有序,无损,双向连接。