0%

pwnable.kr——shellshock

pwnable.kr —— shellshock

题目有这样一串代码(shellshock.c)

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;
}

因为有些知识记的不太清了这里就再复习一下euid,ruid,suid什么的

  • ruid(real):用于在系统中标识用户,当用户成功登录一个UNIX系统后就唯一确定
  • euid(effective):用于系统决定用户对系统资源的访问权限,通常情况下等于ruid。当碰上程序属主设置了setuid位的时候,执行该程序会将euid改为文件属主

gid同理,所以这里执行到system的时候已经有对应的组权限了(flag在对应组可读)

image-20210407125845099

然后就是构造触发shellshock漏洞的语句

wiki上面有链接,原理跟linux环境变量相关,bash中可以通过环境变量来导入function,此时的function也会当做普通环境变量来处理,具体就是函数名='(){ ...; };',这样子的键值对,而在处理这个function变量的时候,有漏洞的bash版本只检查了前几个字符

STREQN ("() {", string, 4)

然后将整条字符串全部当做脚本代码处理了,本意应该是起子实例的时候,将这个函数的代码字符串直接跑到子实例bash中,供后续调用。但是这里并没有做语法检查或者结尾检查之类的,所以如果函数后面跟了命令也会被跑出来

所以利用流程就是export一个函数类型的环境变量,然后再起一个bash就会触发后续命令

image-20210407232747355

原理大致如下,再结合我们的程序代码,可以看到程序刚好用system起了一个bash,所以export我们的构造语句之后再跑程序就可以直接cat flag了

如图:

image-20210407233151874

好像后续有些版本export就会加前后缀什么的了,修复的方式这里不深究,以后需要再看