这里指的零基础其实是我们在实战中遇到一些基础问题,再相应的去补充学习理论知识,这样起码不会枯燥。
本系列主要是利用网上已知的IoT设备(路由器)漏洞,然后收集文章学习并且复现。
0x01 设备准备我尽量会用真机(路由器)来复现漏洞,大家如果富裕的话也可以从闲鱼淘一些二手的,再或者可以进群指不定我抽奖送二手路由器。
万用表需要准备一个万用表,主要的功能是用来测试UART(TLL)中的几个接口,比如RX
、TX
、GND
。
这个设备主要的将电脑与IoT设备用TTL线连接,方便进入IoT设备的终端(Shell)。
如果淘宝买的线坏了或者没了,可以搜杜邦线母对母
进行购买。
这里买电烙铁的主要用途是焊接UART接口的针脚,大部分IoT设备虽然有UART接口但是他出厂并不会给你焊好,当然我也见过比较人性化的。像小米的设备他会把你焊好针脚,并且还详细的标注RX、TX、GND。
电烙铁我选的是这款,小巧好用。
焊锡丝一般买电烙铁可能会送,如果不送的话可以自行去知乎或者哔哩哔哩搜下哪款焊锡丝好用,推荐无铅的比较环保。
松香我用的是鹿仙子的,有比较好用的牌子话可以推荐推荐。
针脚针脚主要用来焊接UART接口,这个倒是挺便宜的。
编程器编程器这玩意是干嘛的?能编程吗?
编程器主要是用来帮助我们dump IoT设备上例如闪存芯片
里面的数据,一般都为固件包。
也就是我们可以利用编程器来进行对IoT设备的刷机。
CH341A编程器的话一般买CH341A够用了,基本上8脚的芯片都支持。
RT809H如果富裕的话编程器可以买个爱修的RT80H编程器
或者RT809F也不错。
热风枪这个其实可有可无,相对于技术比较高的人用,因为热风枪主要是吹出芯片然后放到编程器上面用来dump估计,但是一般来说用夹子就可以把固件dump出来。
对应的买助焊膏,方便用热风枪吹出芯片。
测试夹、探针这个的主要用途是省的我们去焊接UART接口的针脚了,直接用这夹子加上去用CH340G设备连接即可,不过UART接口要规则才行,要一排的那种。
免拆芯片通用测试夹
这设备主要也是帮助用来dump芯片固件的,我们买的编程器夹子一般只能用来夹8脚,当超过8脚就不好用了,所以可以用这种通用测试夹来夹住芯片然后dump估计。
0x02 环境搭建环境的话推荐用Linux系统就行,你熟悉哪个发行版本就用哪个,推荐的话还是Debian系的Ubuntu或Kali为主。
系统安装的话无论你是虚拟机、WSL、物理机都行没啥限制,你想怎么来就怎么来,自由。
Binwalk(固件解包工具)binwalk是一个固件解包的工具,当我们用编程器dump出一个固件用,需要用binwalk来解压。
这工具一般kali上会自带,不过还是建议从源码自己编译最新的比较好,binwalk源码链接
sudo apt install binwalk
固件解包命令
binwalk -Me 你的固件.bin
Firmadyne(固件仿真)
这工具主要是用来仿真,将固件用qemu模拟启动起来,不过不是百分百模拟成功的,经常会仿失败,常见就是环境等问题。(建议还是买真机好)
安装可参考github上的文章:https://github.com/firmadyne/firmadyne#introduction
依赖安装sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
下载firmadyne
这里下载的时候记得加--recursive
,因为他里面有些其他git上的子项目,不加的话下过来是空的。
git clone --recursive https://github.com/firmadyne/firmadyne.git
从源码构建binwalk
如果你想装最新binwalk,并且你要装firmadyne的话需要自己从源码构建一个binwalk。
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo apt install python3-pip
sudo ./deps.sh
sudo apt install python-lzma
sudo python ./setup.py install
sudo -H pip3 install git+https://github.com/ahupp/python-magic
sudo -H pip3 install git+https://github.com/sviehb/jefferson
成功编译出来后的版本是V2.3.3,比sudo apt install binwalk
版本要高,apt包里的binwalk版本是2.1.1
。
sudo apt-get install postgresql
sudo -u postgres createuser -P firmadyne [默认密码是:firmadyne]
sudo -u postgres createdb -O firmadyne firmware
sudo -u postgres psql -d firmware < ./firmadyne/database/schema
设置Firmadyne
将这个替换成自己的绝对路径。
运行sudo ./download.sh
下载需要的二进制文件。
安装Firmadyne
所需的其他依赖项:
sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
仿真Netgear(网件路由器) WNAP320测试
[1]先下载固件包
wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip
[2]解压固件包
sudo python3 ./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "WNAP320.zip" images
#参数解释
-b "brand 品牌"
-sql "连接本地数据库"
-np "代表没有并行操作"
-nk "代表不提取内核"
[3]识别CPU架构
接着是执行./script/getArch.sh
脚本来获取路由器固件的CPU架构。
sudo ./scripts/getArch.sh ./images/1.tar.gz
[4]存储数据库
用脚本./scripts/tar2db.py
将固件镜像的信息保存到数据库
sudo python3 ./scripts/tar2db.py -i 1 -f ./images/1.tar.gz
#参数解释
-i 1 "这里的1代表的数据库中的id,当你有多个固件镜像时候会有多个id,我这里就一个所以就是1"
-f "这里就是解包后估计的tar包路径,一般解压后的固件都在./images下面"
[5]创建QEMU镜像
利用脚本./scripts/makeImage.sh
创建一个QEMU虚拟机的镜像。
sudo ./scripts/makeImage.sh 1
#参数解释
"id这里为1"
报错
运行时候报错了数值太大不可为算术进制的基
、MINIMUM_IMAGE_SIZE: 未绑定的变量
。
测试下来发现是因为系统是中文的缘故,导致脚本里面这命令运行有问题。
解决办法是在终端里面把local默认改成英文,或者你也可以把脚本改改让他获取到真实的tar包总数字也行,不过我怕可能会有其他中文引起问题。
#修改语言
sudo vim /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
LC_ALL="en_US.UTF-8"
#重启
sudo reboot
改了之后成功获取到数字
之后继续运行./scripts/makeImages.sh
脚本来创建镜像。
因为很多路由器固件他的后台地址ip都是固定的,比如tp-link大部分都是192.168.1.1,所以这一步主要的过程是从固件中获取到这些配置信息,然后设置网络接口。
sudo ./scripts/inferNetwork.sh 1
日志会被记录到./scratch/1/qemu.final.serial.log
下。
最后在执行完上一步后,会在./scratch/1
目录下多出一个run.sh
,其中run.sh会创建一个新的虚拟网卡,并且将ip设置为提取到的固定ip网段。
sudo ./scratch/1/run.sh
[8]测试是否仿真成功
最后在在浏览器里面输入固定的ip,看看是否仿真成功。
用自带的./analyses/webAccess.py
脚本进行目录扫描测试。
sudo python3 ./analysec/webAccess.py 1 192.168.0.100 log.txt
用runExploits.py
脚本自动进行metasploit的漏斗库进行测试。
sudo python3 ./analyses/runExploits.py -t 192.168.0.100 -o exploits/exploit -e x
用nmap进行端口扫描测试
sudo nmap -O -sV 192.168.0.100
还有仿真路由器的一个好处是,我们不需要像真机那样,焊接UART接口连接TTL才能进入终端SHELL。
直接在之前运行sudo ./scratch/1/run.sh
地方处的终端,随便输入什么然后回车,之后会让你输入用户名和密码,分别是root
、password
。
OK环境搭建差不多就先到这,感觉大家观看,欢迎来群里骂我菜鸡哈哈哈哈。
PWN菜鸡小分队参考链接:
https://zhuanlan.zhihu.com/p/110806057 Firmadyne的固件模拟环境搭建(超详细)
https://github.com/firmadyne FIRMADYNE github
https://www.freebuf.com/sectool/169425.html 物联网设备固件模拟入门
https://github.com/adi0x90/attifyos/ AttifyOS v3.0 github
https://www.cnblogs.com/CoBrAMG/p/9221199.html
https://iot-security.wiki/hardware-security/ 物联网百科安全
https://github.com/euphrat1ca/Security-List/blob/master/wiki_IoT&ICS.md 万物互联