西湖论剑IOT-inkon
西湖论剑IOT-inkon
题目给出了完整的镜像内核以及启动脚本
这里加了一个映射端口用来调试,因为启动的虚拟机是和宿主机共用ip的,这里映射了80端口和2222端口
可以通过scp来传输文件,比如
1 |
|
题目考点在cpio-root/etc_ro/lighttpd/www/cgi-bin
目录下的login.cgi
文件里面
对文件进行逆向分析
首先有一个跨站请求的检查
1 |
|
需要保证HTTP_REFERER字段不为空,使得函数返回值为0
继续检查对发送的POST请求长度做了检查,长度不能大于0x1f3
这里获取发送的报文的属性值page
之后对其匹配,而漏洞正是发生在Goto_chidx
函数里面
可以看见再次进行了匹配,获取wlanUrl
的值,并通过sprintf
函数放到栈中,但是空间只有0x80大小,而v6的值用户可以控制,那么这里就存在未授权,且栈溢出的可能
EXP
本人通过本地调试发现不好绕过前面那个跨站请求的检查,设置环境变量不管用,那么还又一种思路是直接启动环境,然后发送报文
1 |
|
原本想通过libc里面gadget来ROP的但是发现官方写的wp并不是利用libc地址,而是通过libwebutil里面的system函数来获取shell的,因为
调试发现当利用system里面的system函数的时候
这里gp寄存器会变成一个不可写的地址导致后面会报错(这里不知道为什么正常索引索引不到)
尝试变成可写地址之后发现会出现gp变成0的情况
而通过libwebutil也需要伪造gp
合理构造偏移跳转到do_system
最终效果
调试方法
对于这种一闪而过的调用还是利用无限跳转法来实现卡住进程
然后利用如下命令来实现远程连接
1 |
|
总结
当libc里面的gadget不好构造的时候也可以考虑别的so文件里面的关键函数和gadget
西湖论剑IOT-inkon
https://ch13hh.github.io/2025/03/28/西湖论剑IOT-inkon/