分析
题目说是和bash相关,那我们直接先连进去
打开一看是非常短小的程序
1 |
|
至少我没办法立刻看懂这都在干啥
可能需要的linux知识
在Linux上,每个进程都有以下用户和组标识符:
- 真实用户ID和真实组ID。这些ID确定谁是进程的所有者。
- 有效的用户ID和有效的组ID。内核使用这些ID来确定进程在访问共享资源(例如消息队列,共享内存和信号灯)时将具有的权限。在大多数UNIX系统上,这些ID还会确定访问文件时的权限。但是,Linux使用文件系统ID来完成此任务。
- 已保存的设置用户ID和已保存的设置组ID。这些ID在设置用户ID和设置组ID程序中使用,以保存执行程序时设置的相应有效ID的副本。设置用户ID程序可以通过在其实际用户ID和已保存的设置用户ID的值之间来回切换其有效用户ID来获得和放弃特权。
getuid、geteuid、getgid和getegid函数
利用
其实我感觉上面还是没说人话,但是我也没能找着说人话的解释,我参考的wp上是这么说的
这段程序很简单,我们以shellshock身份启动时,程序的权限是other权限r-x,而在setresuid和setresgid中使用的是effective gid,也就是shellshock_pwn的权限r-s,当程序执行到system时,程序已经具有shellshock_pwn组权限了。
各文件权限是这样的
那么我们其实已经获得了flag的读权限,但是函数语句中并没有对flag的读取,只有一个使用bash操作,那么这下怎么办呢?
题目的提示在于题目名:shallchock,这是关于bash的一个本地提权漏洞,原理可以参考
流程
先测试一下漏洞是否存在
1 | env x='() { :;}; echo vulnerable' bash -c "echo this is a test " |
而实际上,x='() { :;}; echo vulnerable'
是new出来了一个新的环境变量:
1 | KEY=x |
而当我们后续执行bash的时候,最终会定位到initialize_shell_variables中,这个函数内部会遍历所有的环境变量,而我们设计的VALUE绕过了其中一个export函数的定义检查,使得最终执行的是后面的echo vulnerable
串。所以,调用bash的时候,自定义的这个语句就会触发。
exp
那我们将自定义语句改成bash -c "cat ./flag"
,bash -c换成./shellshock
(它内部调用了bash -c 'echo shock_me'
)。
1 | env x='() { :;}; bash -c "cat ./flag"' ./shellshock |
参考:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋!