1. Posts/

IoT基础学习

··6165 字·13 分钟
IoT学习记录 IoT
作者
ta0lve
一些记录,一点思考
IoT学习小记 - This article is part of a series.
Part 1: This Article
如果本博客部分文章图片加载失败, 可以点击此处查看解决办法

固件获取 #

固件厂商官网 #

一些国内路由器厂商的固件下载链接:

抓取更新包 #

wireshark配合热点抓设备升级的包

  • 工具:wireshark、ettercap
  • 流程:中间人->开始抓包->在线升级->分析固件地址->下载
  • 案例:

华为路由WS5200 四核版这款路由器在网上找不到现有固件,我们尝试一下是否可以通过抓包在线升级过程获取固件。首先关闭防火墙,否则无法访问路由器的服务,无法做中间人攻击。使用ettercap进行arp欺骗,sudo ettercap -Tq -i ens33 -M arp:remote /192.168.31.1// /192.168.31.134//打开wireshark进行抓包。理论上说,点击升级固件之后,wireshark就能够记录升级固件的整个过程(HTTP),但是结果却并不理想。

还好华为路由器自带了抓包的功能(方便后期的调试和维护),所以直接使用这个功能抓取报文,比做中间人要直接了当得多。

在点击升级固件之后,我们可以看到大量发往58.49.156.104这个地址的报文,猜测极有可能是华为的服务器,过滤一下会看得更清楚可以看到在通过三次TCP握手之后,华为路由器向服务器发送了get请求,uri就是获取固件的地址: http://update.hicloud.com/TDS/data/files/p14/s145/G4404/g1810/v272964/f1/WS5200_10.0.2.7_main.bin

点击即可拿到最新的固件


还可以用burpsuite来抓取APP请求设备升级的包

固件解密 #

参考链接:

固件解密 - IOT 固件安全 All in One (gitbook.io)

  • 可以先上网查询有没有相关文章
  • 也可以看一下同一品牌的其他固件是如何解密的

解密固件是分析加密固件所需迈过的第一道坎

部分固件的解密思路还可以参考以下思路:

看看是不是仍有少部分固件(或过渡版本的固件)并未加密,当这些固件升级的过程中大概也会使用到解密的程序,因此可以通过解开这些未加密固件,找到解密程序,并逆向分析出相关算法,这也是固件解密常用的一种手段。并且,一般一个厂商的固件加密算法都是相同的,这样所有的固件我们都能够解开了

解密完固件为后续的静态分析做准备

固件解包 #

初入IOT安全研究时,对于大部分固件直接binwalk -Me就可以了

binwalk -Me *.bin

对文件夹重新打包成zip,从linux下转到windows下源码审计

zip -r -q -o pack.zip test/
cp ./pack.zip /mnt/hgfs/share

以下介绍几种需要绕点弯的情况

UBI #

(Unsorted Block Image)

UBI格式的固件算比较常见的,binwalk并不能直接解包,但是github上有现成的工具 ubi_reader

UBI_reader解包,UBI文件必须是1024bytes的整数倍,需要增删内容对齐,比如通过分析某路由器,发现其rootfs是UBI格式:

# binwalk ROM/wifi_firmware_c91ea_1.0.50.bin

DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

684           0x2AC           UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000

首先安装ubi_reader:

$ sudo apt-get install liblzo2-dev
$ sudo pip install python-lzo
$ git clone <https://github.com/jrspruitt/ubi_reader>
$ cd ubi_reader
$ sudo python setup.py install

或者直接$ sudo pip install ubi_reader 然后将根据地址将UBI结构提取出来,利用ubireader_extract_files [options] path/to/file 即可解包

PFS #

运行binwalk后查看结果,发现没有发现任何可识别的东西,此时可以手动分析或者去搜索一些相关工具。 这里在github上找到 相关工具,直接根据提示使用命令就可解开固件

简单看一下固件解包关键代码,关键在于找到类似’\xA5\xA5\xA5\x5A\xA5\x5A’的header,之后根据具体格式解包解压即可,所以固件解包说到底还是数据格式分析

def decompress_firmware(data):

	flen = len(data)
	sigstart = data.find('\\xA5\\xA5\\xA5\\x5A\\xA5\\x5A')
	if sigstart <= 0:
		sigstart = data.find('\\x5A\\x5A\\xA5\\x5A\\xA5\\x5A')
	if sigstart > 0:
		if draytools.verbose:
			print 'Signature found at [0x%08X]' % sigstart
		lzosizestart = sigstart + 6
		lzostart = lzosizestart + 4
		lzosize = unpack('>L', data[lzosizestart:lzostart])[0]
		return data[0x100:sigstart+2] \\
			+ pydelzo.decompress('\\xF0' + pack(">L",0x1000000) \\
				+ data[lzostart:lzostart+lzosize])

之后可参考:

https://wokough.gitbook.io/iot-firmware-aio/wiki/gu-jian-jie-pou#:~:text=%E5%8D%B3%E5%8F%AF%E8%A7%A3%E5%8C%85%E3%80%82-,PFS,-%E6%9C%89%E4%BA%9B%E5%9B%BA%E4%BB%B6

Openwrt Lua #

可参考:

https://wokough.gitbook.io/iot-firmware-aio/wiki/gu-jian-jie-pou#:~:text=...-,Openwrt%20Lua,-lua%E7%BB%93%E6%9E%84%E8%A7%A3%E6%9E%90

U-boot #

RTOS(实时操作系统)

boot类的固件也是我们常会遇见的一类无文件系统固件,比如很多IOT设备会采用 U-boot作引导,因为U-boot开源,我们可以参照源代码分析,对于有些架构的U-boot也可以采用固定套路,比如mips可以根据$gp寄存器等

固件打包 #

替换启动脚本 #

一般将交叉编译好的telnetd,dropbear(sshd),gdb放入固件文件,再替换启动脚本打包。 linux的启动脚本套路众多,尤其在IOT设备中,所以可以采用比较巧妙的方法,比如确定/sbin/xxxd服务会开机运行,可以将其替换

# mv rootfs/sbin/xxxd sbin/xxxdd
# touch rootfs/sbin/xxxd
# chmod +x rootfs/sbin/xxxd

之后在sbin/xxxd添加

 #!/bin/sh

/usr/sbin/telnetd -F -l /bin/sh -p 1234 &
/sbin/xxxdd &

交叉编译 #

如果能从正向开发角度来打包当然最方便,也就是交叉编译的事。笔者研究过的一些设备中,主要是路由器固件会部分遵循 GPL,就是开源一部分代码软件(一般本来就是基于开源工具),并提供剩下软件的二进制文件和整个固件的打包工具(方法)

下载该zip包,根据自己的需求编译rootfs,最后利用zip包中自带的工具打包

firmware-mod-kit #

firmware-mod-kit( fmk)可能是最常用的基于binwalk的解打包工具,但是由于很久没用更新,使用场景有限。

fmk的安装使用如下所示:

# For ubuntu

$ sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic bsdmainutils autoconf

# For redhat/centos

$ yum groupinstall "Development Tools"
$ yum install git zlib1g-dev xz-devel python-magic zlib-devel util-linux

# 使用

$ ./extract-firmware.sh firmware.bin //解包
$ cp new-telnetd fmk/rootfs/usr/sbin/telnetd //按需修改
$ ./build-firmware.sh //打包

手动分析 #

打包的难度在于固件要与原固件一致,并通过各种校验,否则轻则刷机失败,重则设备变砖。

固件一般会分成许多section,为了方便解析,每个section会有指示头,头中可能会存放标志、大小和crc校验等信息,这些信息都为解打包提供依据。

比如可以先获取固件大小(十六进制),根据固件大小端拆分字节,一般是4字节,然后在固件头上寻找类似字节(固件头上的指示长度会减去头长度),接着从指示大小的字节往后分析就可以澄清格式,和分析网络协议的过程很像。

固件仿真与FUZZ #

参考链接:

路由器固件模拟环境搭建(超详细) - 知乎 (zhihu.com)

揭秘家用路由器0day漏洞挖掘技术——读书笔记 | Ainnia Blog

仿真分析 - IOT 固件安全 All in One (gitbook.io)

QEMU #

https://wokough.gitbook.io/iot-firmware-aio/wiki/fang-zhen-fen-xi#id-1.1-qemu

具体问题具体分析

具体固件使用对应的命令进行仿真

  • 先上网搜索相关信息,看看有没有文章已经仿真过了
  • 参考之前仿真设备的案例来试着仿真
  • 如果都没有就需要我们参考着官方文档以及对固件的静态分析来自己调整命令
    • 如果遇到一些参数实在没有办法满足时可以先跑起来
    • 在动态调试的过程看是哪个汇编执行报错
      • 再在IDA中进行合适的patch来使得固件可以成功仿真

例如当我们需要向main函数传递参数argv和设置环境变量时,可以先看看官方usage:

image-20240224180845930

发现我们可以用-0选项传递第一个参数,用-E选项设置环境变量,用-L选项做到类似于更改根目录的效果,用-strace选项追踪程序执行时进程系统调用和所接收的信号,方便调试

Unicorn #

QEMU 提供了一个完整的仿真环境,既可以模拟硬件外设、整个系统,也可以模拟单个二进制程序。而 Unicorn 专注于 CPU 指令的仿真

Unicorn – The Ultimate CPU emulator (unicorn-engine.org)

  • 暂时未使用(咕)

Qiling #

基于Unicorn的模拟器,可以作为IDA pro插件,也可以利用Qiling Unicornalf进行fuzz,还可以模拟IOT设备固件

可以直接用pip3 install qiling安装

以下是模拟ARMj架构路由器固件的部分代码:

import os, socket, sys, threading
sys.path.append("..")
from qiling import *

def patcher(ql):
    ...

def nvram_listener():
    ...

def my_sandbox(path, rootfs):
    ql = Qiling(path, rootfs, output = "debug")
    ql.add_fs_mapper("/dev/urandom","/dev/urandom")
    ql.hook_address(patcher ,ql.loader.elf_entry)
    ql.run()

if __name__ == "__main__":

    nvram_listener_therad =  threading.Thread(target=nvram_listener, daemon=True)

    nvram_listener_therad.start()
    my_sandbox(["rootfs/bin/httpd"], "rootfs")
  • 暂时未使用(咕)

Firmadyne #

  • 基于Linux的固件的仿真

firmadyne/firmadyne: Platform for emulation and dynamic analysis of Linux-based firmware (github.com)

  • 成功概率较低,不常用

FirmAE #

  • 成功概率较高(优于Firmadyne)
    • FirmAE significantly increases the emulation success rate (From Firmadyne’s 16.28% to 79.36%)

安装:

git clone --recursive https://github.com/pr0v3rbs/FirmAE
./download.sh
./install.sh

使用:

执行脚本

./init.sh

准备固件

# 举例:
wget https://github.com/pr0v3rbs/FirmAE/releases/download/v1.0/DIR-868L_fw_revB_2-05b02_eu_multi_20161117.zip

检查仿真

sudo ./run.sh -c <brand> <firmware>

分析目标固件

  • 分析模式使用 FirmAE 分析器
sudo ./run.sh -a <brand> <firmware>
  • 运行模式有助于测试 Web 服务或执行自定义分析器
sudo ./run.sh -r <brand> <firmware>

image-20240225104426390

Firmware Analysis Toolkit #

attify/firmware-analysis-toolkit: Toolkit to emulate firmware and analyse it for security vulnerabilities (github.com)

安装:

git clone https://github.com/attify/firmware-analysis-toolkit
cd firmware-analysis-toolkit
./setup.sh
# fat.config
[DEFAULT]
sudo_password=attify123
firmadyne_path=/home/attify/firmadyne

使用:

./fat.py <firmware file>
$ ./fat.py DIR-601_REVB_FIRMWARE_2.01.BIN 

                               __           _   
                              / _|         | |  
                             | |_    __ _  | |_ 
                             |  _|  / _` | | __|
                             | |   | (_| | | |_ 
                             |_|    \__,_|  \__|                    
                    
                Welcome to the Firmware Analysis Toolkit - v0.3
    Offensive IoT Exploitation Training http://bit.do/offensiveiotexploitation
                  By Attify - https://attify.com  | @attifyme
    
[+] Firmware: DIR-601_REVB_FIRMWARE_2.01.BIN
[+] Extracting the firmware...
[+] Image ID: 1
[+] Identifying architecture...
[+] Architecture: mipseb
[+] Building QEMU disk image...
[+] Setting up the network connection, please standby...
[+] Network interfaces: [('br0', '192.168.0.1')]
[+] All set! Press ENTER to run the firmware...
[+] When running, press Ctrl + A X to terminate qemu

image-20240223021726180

FirmAFL #

zyw-200/FirmAFL: FIRM-AFL is the first high-throughput greybox fuzzer for IoT firmware. (github.com)

论文FirmAFL固件模糊测试工具——复现之路-CSDN博客

使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing

# 编译用户模式
cd ./FirmAFL/user_mode/
sed -i '40s/static //' util/memfd.c
./configure --target-list=mipsel-linux-user,mips-linux-user,arm-linux-user --static --disable-werror
make

# 编译系统模式
cd ../qemu_mode/DECAF_qemu_2.10/
sed -i '40s/static //' util/memfd.c
./configure --target-list=mipsel-softmmu,mips-softmmu,arm-softmmu --disable-werror
make

# 安装Firmadyne并设置数据库
cd ../../
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
git clone --recursive <https://github.com/firmadyne/firmadyne.git>
cd ../FirmAFL/firmadyne
sudo apt-get install postgresql
sudo apt-get install libpq-dev
dropdb -U firmadyne -h 127.0.0.1 firmware
sudo -u postgres createuser -P firmadyne
sudo -u postgres createdb -O firmadyne firmware
cd database
cp /home/churchkm/Downloads/data.xz ./
xz -d data.xz
mv data schema
chmod +x schema
sudo -u postgres psql -d firmware < ./schema

# 使用Firmadyne仿真固件
cd ../
sudo ./download.sh
sed -i '4s/#//' firmadyne.config
cp ../firmadyne_modify/makeImage.sh ./scripts/
sudo ./sources/extractor/extractor.py -b dlink -sql 127.0.0.1 -np -nk "../firmware/DIR-815_FIRMWARE_1.01.ZIP" images
sudo ./scripts/getArch.sh ./images/9050.tar.gz
sudo ./scripts/makeImage.sh 9050
sudo ./scripts/inferNetwork.sh 9050

# 使用FirmAFL进行Fuzzing
cd ../
python3 FirmAFL_setup.py 9050 mipsel
cp ./FirmAFL_config/9050/run.sh ./image_9050/  #即用FirmAFL_config中的run.sh替换image_9050中的run.sh
cd image_9050
sudo ./run.sh
# 固件启动后,新终端下执行
python3 test.py
sudo user.sh

FirmFuzz #

FirmFuzz的使用侧重Fuzzing,固件解包可单独使用firmadyne extractor或者binwalk

https://github.com/HexHive/FirmFuzz.git

Fuzzware #

fuzzware-fuzzer/fuzzware: Fuzzware’s main repository. Start here to install. (github.com)

git clone https://github.com/fuzzware-fuzzer/fuzzware.git

sudo ./build_docker.sh

sudo ./run_docker.sh examples fuzzware pipeline --skip-afl-cpufreq pw-recovery/ARCH_PRO
sudo ./run_docker.sh test fuzzware pipeline --skip-afl-cpufreq .

成功将固件跑起来:

image-20240202005856817

由图可以看到刚开始运行时发现新的MMIO寄存器模型,由于MMIO Access Model中并不存在,因此会将其定义为新的模型,然后继续向下运行

image-20240202010428350

建模完毕后,开始进行正常的fuzzing阶段:

image-20240202011901838

每一轮fuzzing结束后,根据反馈调整输入,开始下一阶段fuzzing:

image-20240202010524792

afl #

安装

alf++ #

AFL源码阅读(一):启程 (ruanx.net)

安装: #
sudo apt-get update

sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools

sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang

sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev

cd $HOME

git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus

export LLVM_CONFIG="llvm-config-11"

make distrib

sudo make install

# export CC=/home/closure/AFLplusplus/afl-clang-fast
# export CXX=/home/closure/AFLplusplus/afl-clang-fast++
# export LLVM_CONFIG="llvm-config-11"
使用: #

使用 afl-gcc 进行插桩编译:

afl-gcc test.c -o test_file
gcc test.c -o test_gcc
  • afl-gcc 插桩编译后,fuzz 的速度会快一些

接下来就可以进行 fuzz 了:

afl-fuzz -i ./fuzz_in -o ./fuzz_out ./test_file -f
  • fuzz_in 为语料库,可以直接使用 AFL 自带的 testcases
  • fuzz_out 就是输出的内容

现在我们开始 fuzz。首先利用 afl-clang-lto 编译一个有漏洞的代码hello.c。AFL++ 文档中有“如何选择编译器”的 指引。我们手上的 llvm 版本大于 11,所以选择 LTO mode。

afl-gcc ./hello.c -o hello

/home/iot/test/tools/AFLplusplus/afl-gcc ./hello.c -o hello

构造一些初始输入,放进 inputs 文件夹里面。笔者使用了两条初始输入: helloworld 以及 anna 。它们自身不会让程序崩溃,我们希望 AFL++ 寻找到能让程序崩溃的输入。

运行 AFL++:

afl-fuzz -i inputs/ -o out/  -- ./hello

/home/iot/test/tools/AFLplusplus/afl-fuzz -i ./fuzz_in -o ./fuzz_out -- ./hello @@

image-20240202020635460

image-20240202021445446

无源码fuzz: #

配置:

sudo apt-get install libtool-bin libgtk2.0-dev -y
cd /home/iot/test/tools/AFLplusplus/qemu_mode
./build_qemu_support.sh
cd ..
sudo make install
afl-fuzz -Q -m none -i in -o out ./pwn_file @@

/home/iot/test/tools/AFLplusplus/afl-fuzz -i fuzz_in -o ./fuzz_out -Q ./pwn

image-20240202034131386

SaTC #

NSSL-SJTU/SaTC: A prototype of Shared-keywords aware Taint Checking, a novel static analysis approach that tracks the data flow of the user input between front-end and back-end to precisely detect security vulnerabilities. (github.com)

安装

建议通过使用Dockerfile来构建系统环境:

# 进入SaTC代码目录
cd SaTC 

# 构建Docker镜像
docker build . -t satc

# 进入Dokcer环境, 自行添加目录映射
docker run -it satc

如果因为网络等原因无法构建,可使用我们提供等docker image

# 从docker hun拉去image
docker pull smile0304/satc:V1.0

# 进入Dokcer环境, 自行添加目录映射
docker run -it smile0304/satc:V1.0

使用方法

usage: satc.py [-h] -d /root/path/_ac18.extracted -o /root/output
               [--ghidra_script {ref2sink_cmdi,ref2sink_bof,share2sink,ref2share,all}]
               [--save_ghidra_project] --taint_check
               [-b /var/ac18/bin/httpd | -l 3]

SATC tool

optional arguments:
  -h, --help            查看帮助
  -d /root/path/_ac18.extracted, --directory /root/path/_ac18.extracted
                        指定从固件中提取出的文件系统
  -o /root/output, --output /root/output
                        指定结果输出位置
  --ghidra_script {ref2sink_cmdi,ref2sink_bof,share2sink,ref2share,all}
                        (可选) 指定要使用的 Ghidra 脚本。 如果使用`all`命令,`ref2sink_cmdi``ref2sink_bof``ref2share`三个脚本将同时运行
  --ref2share_result /root/path/ref2share_result  (可选) 运行`share2sink` Ghidra脚本时,需要使用该参数指定`ref2share`脚本的输出结果
  --save_ghidra_project (可选) 是否保存程序运行时产生的ghidra工程路径
  --taint_check         (可选) 指定是否启用污点分析
  -b /var/ac18/bin/httpd, --bin /var/ac18/bin/httpd
                        (可选) 用于指定需要分析的程序,如果不指定,SaTC将使用内置算法确认需要分析的程序
  -l 3, --len 3         (可选) 根据分析结果分析可能为边界的前N个程序,默认为3

image-20240129012048252

image-20240129012209549

image-20240129012222971

sudo docker run -v /home/user/data:/data ...

sudo docker run -v /home/iot/test/vul:/vul ...
#启动Docker容器并进入其中的交互式终端
sudo docker run -it smile0304/satc:V1.0
sudo docker run -v /home/iot/test/vul:/vul smile0304/satc:V1.0

image-20240129013039500

image-20240129014924286

使用案例

cd ~/SaTC/
cd ~/res/
  • 分析D-Link 878中命令注入、缓冲区溢出类型的漏洞
python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=ref2sink_cmdi --ghidra_script=ref2sink_bof --taint_check

python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=ref2sink_cmdi --ghidra_script=ref2sink_bof --taint_check
  • 分析D-Link 878中prog.cgi命令注入类型的漏洞
python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=ref2sink_cmdi -b prog.cgi --taint_check
  • 分析D-Link 878中rc的命令注入类型漏洞;在这个案例中prog.cgi中使用nvram_set设置变量,rc中使用nvram_get提取
python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=ref2share -b prog.cgi

python satc.py -d /home/satc/dlink_878 -o /home/satc/res --ghidra_script=share2sink --ref2share_result=/home/satc/res/ghidra_extract_result/prog.cgi/prog.cgi_ref2share.result -b rc --taint_check

输出结果的目录结构为:

|-- ghidra_extract_result # ghidra寻找函数调用路径的分析结果, 启用`--ghidra_script`选项会输出该目录
|   |-- httpd # 每个被分析的bin都会生成一个同名文件夹
|       |-- httpd # 被分析的bin
|       |-- httpd_ref2sink_bof.result # 定位bof类型的sink函数路径
|       |-- httpd_ref2sink_cmdi.result # 定位cmdi类型的sink函数路径
|-- keyword_extract_result  # 关键字提取结果
|   |-- detail  # 前端关键字提取结果(详细分析结果)
|   |   |-- API_detail.result # 提取的API详细结果
|   |   |-- API_remove_detail.result # 被过滤掉的API信息
|   |   |-- api_split.result  # 模糊匹配的API结果
|   |   |-- Clustering_result_v2.result # 详细分析结果(不关心其他过程关心此文件即可)
|   |   |-- File_detail.result  # 记录了从单独文件中提取的关键字
|   |   |-- from_bin_add_para.result # 在二进制匹配过程中新增的关键字
|   |   |-- from_bin_add_para.result_v2 # 同上,V2版本
|   |   |-- Not_Analysise_JS_File.result # 未被分析的JS文件
|   |   |-- Prar_detail.result # 提取的Prar详细结果
|   |   |-- Prar_remove_detail.result # 被过滤掉的Prar结果
|   |-- info.txt  # 记录前端关键字提取时间等信息
|   |-- simple  # 前端关键字提取结果, 比较简单
|       |-- API_simple.result # 在全部二进制中出现的全部API名称
|       |-- Prar_simple.result  # 在全部二进制中出现等的全部Prar
|-- result-httpd-ref2sink_cmdi-ctW8.txt # 污点分析结果,启用`--taint-check` 和 `--ghidra_script`选项才会生成该文件

/home/satc/res下生成的txt文件可以查看结果

image-20240225155906180

iotseccfuzz #

securestep9/iotsecfuzz: fork of https://gitlab.com/invuls/iot-projects/iotsecfuzz (github.com)

安装:

pip3 install --upgrade setuptools

git clone https://gitlab.com/invuls/iot-projects/iotsecfuzz.git

cd iotsecfuzz

python3 setup.py install

img

img

# API
from isf import core

core.init_home_directory()

# You can edit directories to load modules from
core.modules_dirs.append('.')
core.load_modules()

# Way 1: import the module directly
from isf.hardware.ttltalker import TTLTalker

talker = TTLTalker('/dev/ttyACM0', 9600, 0.1)
talker.connect()
talker.send_char('ff', False, 0)

# Way 2: get module/submodule using ISF core
send_char = core.modules['hardware/ttltalker/send_char']
send_char.run({'com_port': '/dev/ttyACM0', 'baudrate': 9600, 'timeout': 0.1,
               'char_hex': 'ff', 'output': False, 'output_length': 0})

其他相关工具 #

  • Binwalk
    • misc常用
  • Firmwalker
    • attify自带
  • Angr
    • 逆向会用
  • gdb
    • pwn常用
  • Radare2
    • pwn会用
  • Binary Analysis Tool(BAT)
    • attify自带
  • IDA Pro
    • pwn常用
  • afl afl++等 fuzz 工具
    • pwn常用
  • 其他二进制静态辅助工具
    • BinAbsInspector
    • Rhabdomancer
    • Haruspex + semgrep
  • 注:刚开始入门 IoT 时可以使用 AttifyOS v3.0或者 Attify0S v4.0

    • 且 attifyOS 我们可以使用各类提权漏洞来切换至root用户

    • # example1
      $ sudo env /bin/bash # 即可提权为root用户
      $ passwd root # 修改root用户的密码
      
      # example2 找一些cve来打
      $ git clone https://github.com/blasty/CVE-2021-3156.git
      $ cd CVE-2021-3156
      $ make
      $ chmod a+x sudo-hax-me-a-sandwich
      $ chmod +x sudo-hax-me-a-sandwich
      $ ./sudo-hax-me-a-sandwich 0
      $ passwd root
      
      # ...
      

参考链接 #

仿真分析 - IOT 固件安全 All in One (gitbook.io)

前言 · 物联网安全百科 (iot-security.wiki)

如何快速挖掘设备逻辑洞 - IOTsec-Zone

浅析IOT二进制静态辅助方法 - FreeBuf网络安全行业门户

Qiling Fuzz实例分析 - IOTsec-Zone

AFL 源码分析系列(五)- afl-fuzz(2) - IOTsec-Zone

Fuzzing101全实践 – (三) - IOTsec-Zone

0xricksanchez (434b) (github.com)

Ruan Xingzhi - Pion1eer

AFL源码阅读(一):启程 (ruanx.net)

和菜鸟一起学linux之upnp协议的学习记录 - 吴一达 - 博客园 (cnblogs.com)

蓝牙最详细的基础知识整理 - 知乎 (zhihu.com)

BLE 协议系列之(一) 蓝牙介绍_蓝牙是什么通信协议-CSDN博客

物联网无线短距离ZigBee技术详解-腾讯云开发者社区-腾讯云 (tencent.com)

IoT学习小记 - This article is part of a series.
Part 1: This Article