cpp下strstr路径检测绕过
ssh远程登录test用户,flag就在眼前!嗯?怎么是root权限其他人读不了?哦有个setuid读取程序及其源码。嗯?为什么会检测’flag’啊,不用flag怎么打开对应文件啊?为什么这明明是我test用户的home目录,但权限全是root的啊?我为什么在自己家都不能自由读写啊可恶?!!!!!!!!!
题目
靶机配置了ssh,可以账号test、密码123通过ssh登录到靶机进行攻击。(靶机IP地址见题目中网络拓扑图)。
靶机用户文件夹中存在flag.txt,非root用户无权打开。
同时用户文件夹中配置有一个具有root权限的可执行文件,它可以打开任意文件,但是在打开文件之前会根据文件名判断是否允许打开。(具体代码见用户文件夹下token.c)。
请分析并利用token获取flag。
登录查看文件及其源码
分析
strstr检查我们输入的路径是否含有flag字段,因此要避免出现之。
- 尝试使用
./fl*
使用shell的自动补全,发现补全行为是在程序执行前的,所以传入参数还是flag。 - 尝试在传入路径前加上
\0
,这样strstr的检测会停止在flag前。但是首先在shell中不能传入\0,其次传入\0后cpp的open函数也将无法打开对应路径
大神指点
使用链接
找到唯一一个可以自由创建文件的地方,我们伟大的垃圾桶——/tmp
,并在其中创建我们的链接文件。还不能是硬链接,得是软链接。原因可能是因为flag文件及其目录都是root权限,而硬链接实质上相当于拷贝一份文件的地址并给到一个新的指针上。软链接只是相当于Windows中的快捷方式,而token并不是不能打开flag文件,只是不要叫flag即可,因此我们给token传入flag的外号(软链接文件)即可获得flag
收获
(懒得写了,随便吧,垃圾题可恶,浪费我2个小时)