nepctf-2026-What’s the IPC
解包+固件分析
题目的描述很简单, 就说是一个有漏洞的摄像头
附件是一个.bin固件, 用binwalk就能解开
1 | binwalk -Me firmware.bin |
可以在
1 | _firmware.bin-0.extracted/_romfs-x.squash.img.extracted/squashfs-root |
中找到文件系统
因为这里指明了是摄像头, 所以可以快速去找Kylin文件
最终在./_user-x.squash.img.extracted/squashfs-root/bin/Kylin中找到了 , 这个文件大概就是需要逆向分析的elf
当然也可以从启动脚本中寻找
前往文件系统中的/etc/init.d/下的rcS中看到
1 | #! /bin/sh |
调用了S99.sh , 这个文件中
1 | #!/bin/sh |
可以看到倒数第二行, 就是启动Kylin作为服务
逆向分析
使用IDA打开Kylin可以看到这是一个超级大的文件 , 如果漏洞点是在某个地方埋了一个栈溢出, 可能性不大
所以优先从命令执行方面看
对着system和popen搜索发现 , 发现system的参数不太可能被控制
但是在popen中找到了
1 | int __fastcall sub_7D98C(int dest, int a2) |
大概可以看到这是一个命令列表进行执行, 每条命令最长为64字节
对其交叉引用的第一个结果便很有价值
1 | ...... |
大概可以看到这是一个PTRfTxCali接口, 从报文中取出了各种字段, 和固有字符串拼接成为命令, 然后填入命令列表中
最后被sub_7D98C调用popen执行, 至此大概可以确定攻击向量 : 从mp_phypara或mp_rate字段进行注入
脚本编写
可以把这个函数sub_7FCBC扔给AI, 大概率能跑出来报文的格式, 应该是如下的json
1 | { |
因为这个文件的响应报文是硬编码, 所以先通过时间注入判断命令注入的存在
1 | zer00ne@zer00ne:~/Desktop/ctf$ cat exp.py |
运行后大概3s获得响应, 由此判断命令注入存在
测信道攻击
其实通过时间就能大概注入获得flag了
具体的原理如下
1 | ;[ "${FLAG:0:1}" = "N" ]&&sleep 1; |
对flag中的字符逐个比较, 稳定但很耗时
文件重定向
我选择的是这个方法
我找到了一个接口Tenda_mfg_htmlVersionInfo
1 | v425 = sub_73840(v792, "Tenda_mfg_htmlVersionInfo"); |
这个接口会从文件/opt/sav/Config/device.conf中找到以下的键值对, 提取其中的值
1 | mac_info=xxx |
放入响应中回显
因此如果能把flag注入到mac_info=$(flag), 就能通过这个接口获得flag
可以使用如下的命令组合做到(测试了很多文件, 最终确定flag为/root/flag.txt)
1 | cmd(mp_phypara=";cat /root/flag.txt>/tmp/f") |
最终获得的利用脚本为
1 | import json, re, socket |