esp32ctf_thu练题记录

esp32ctf_thu/attachment at main · xuanxuanblingbling/esp32ctf_thu · GitHub

一个以ESP32为底座的新手向CTF IoT赛题,包括基本的硬件操作,串口调试,网络通信,WIFI,蓝牙,MQTT,固件提取等,总共13个flag。

烧录

驱动安装

windows11安装cp210x驱动-CSDN博客

esp-idf安装

https://dl.espressif.com/dl/esp-idf

按照提示傻瓜式安装即可,注意下载4.2.2版本,不要下载5以后的版本,会出现版本兼容问题!

下载链接:https://github.com/espressif/idf-installer/releases/download/offline-4.2.2/esp-idf-tools-setup-offline-4.2.2.exe

安装好之后打开esp-cmd命令行,进入赛题目录

git clone https://github.com/xuanxuanblingbling/esp32ctf_thu.git
cd esp32ctf_thu/thuctf/
idf.py menuconfig 
idf.py build 
idf.py flash 

执行idf.py menuconfig 会等待一会,然后进入下面的界面

设置如下

Serial flasher config  --->  Flash size (4 MB) 
Partition Table        --->  Partition Table (Custom partition table CSV)

摁上下左右切换,空格确定

然后摁S保存,Q退出

可以看到串口是COM9,波特率是460800

连接的时候把23号引脚和GND短接,可以连接UART

可以看到现在已经进入了硬件第一关

做题

硬件

task1: 将GPIO18抬高,持续3s即可获得flag

那我们只需要将GPIO18和VCC链接即可

task2: 在GPIO18处构造出1w个上升沿

很简单,把18引脚插拔10000次就可以了(bushi)

肯定不能这么考验手速,但是我们想到tx会不断的发送数据,必然会不断地产生上升沿,所以把tx和GPIO18连在一起就可以了

task3: 在另一个串口处寻找第三个flag

这里就需要阅读源码了

所以这里我们知道了tx对应GPIO4,rx对应GPIO5,用ch340连接UART,波特率设置115200

由此我们可以得到第三个flag

硬件题目结束

网络

task1: 连接板子目标端口,尝试获得flag

在这里可以看到,板子需要连接一个wifi,名称是gdhqrq,密码是erzaqwny

然后他在一直不停重试,所以我们用电脑开一个热点

可以看到已经连接成功了,并且开放了3333端口,这里要注意电脑开热点的时候要连接2.4G的网,不能是5G的

连接上以后输入getflag即可

task2: 你知道他发给百度的flag么

这题推测是要查流量,看看他给百度发了什么

所以我们在已经链接电脑热点的基础上打开wireshark抓包查看

ipconfig看到本地连接4是板子对应的网关,所以抓这里的流量

实际抓流量过程中怎么抓也没抓到HTTP流量,很纳闷,后来发现是因为电脑热点无法连接外网,抓到了很多TCP重传包,捣鼓了半天也没解决,被迫换了个电脑,一抓就抓到了

然后还有一个点就是用wsl里面的nc也连不上,推测是防火墙策略导致的

task3:flag在空中

由于这里我没有无线网卡,所以暂时跳过了

蓝牙

task1: 修改蓝牙名称并设置可被发现即可获得flag

根据题目要求,我们要把我们的蓝牙名称改成ngcovmah

修改之后就可以看到flag了

task2: flag在空中

显而易见,第二题需要我们空中抓包,这里我们用snffier进行抓包

提示说flag藏在yxfae这个设备的广播包里

这里我们直接搜索yxfae,就可以看到flag了

task3: 分析GATT业务并获得flag

gatt的相关信息在第一关通过后就输出到终端上了,这里我们看到了服务句柄是40,但没有更多有用信息了,所以只能看一下源码

这里如果open_task3为真,则会把真正的flag发出来,否则只会发送deadbeef

而open_task3会被设置成1仅当输入的东西等于flag2时

所以我们要往句柄中写入flag2

用手机上的蓝牙调试助手就很方便

一开始接收到的是deadbeef

当我们发送THUCTF{AdVD47a}后再次读取,就可以读到真的flag了

但这里有点问题,我一直没读出来,不知道为什么,希望有大佬能解答一下~

MQTT

原版的域名到期了,你需要在自己的服务器上拉起来一个 Docker,先把docker desktop打开

docker build -t esp32ctf .

然后别忘了把服务器的防火墙打开 1883 端口,运行命令把 Docker 启动起来

docker run -d -p 1883:1883 esp32ctf

在windows中把防火墙权限打开

打开 控制面板 → 系统和安全 → Windows Defender 防火墙

点击左侧 高级设置 → 入站规则 → 新建规则

把80和1883端口暂时放开

修改main.c中如下代码

网络名称密码设置成你自己的,mqtt服务器设置成主机ip,然后重新烧录一遍

烧好之后不需要连接GPIO23和GND了

task1: 你知道MQTT的上帝是谁么

这里只需要连接上mqtt服务器即可

注意mqtt版本设置成3.1,5.0连接不上

订阅“#”表示全部主题,就可以获取flag了

task2: 你能欺骗订阅者么&task3: 这是个内存破坏的前戏

这里有一个负数溢出,发送格式为ip?length,如果length为-1就可以触发负数溢出,从而将flag2和flag3全都带出来

nc监听一下80端口,可以在终端看到目标topic是/topic/flag2/mtdyen

46可以只把flag2带出来

-1可以把两个flag都带出来

记得关防火墙

彩蛋:esp32固件提取

直接在idf的终端里输入

esptool.py --baud 115200  read_flash 0x10000 0x310000 dump.bin

dump出来之后用strings命令一搜就可以了

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇