avatar

pwnable.kr-cmd1和cmd2-命令绕过

cmd1

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>

int filter(char* cmd){
int r=0;
r += strstr(cmd, "flag")!=0;
r += strstr(cmd, "sh")!=0;
r += strstr(cmd, "tmp")!=0;
return r;
}
int main(int argc, char* argv[], char** envp){
putenv("PATH=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}

程序很短,首先重写了PATH变量,然后对我们的参数进行检测,通过即可执行

需要注意的是重写变量后我们执行命令需要直接执行文件,例如不能直接 cat,需要/bin/cat

exp

那我们只需要绕过过滤就可以了,例如

1
./cmd1 "/bin/cat f*"

cmd2

分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>

int filter(char* cmd){
int r=0;
r += strstr(cmd, "=")!=0;
r += strstr(cmd, "PATH")!=0;
r += strstr(cmd, "export")!=0;
r += strstr(cmd, "/")!=0;
r += strstr(cmd, "`")!=0;
r += strstr(cmd, "flag")!=0;
return r;
}

extern char** environ;
void delete_env(){
char** p;
for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}

int main(int argc, char* argv[], char** envp){
delete_env();
putenv("PATH=/no_command_execution_until_you_become_a_hacker");
if(filter(argv[1])) return 0;
printf("%s\n", argv[1]);
system( argv[1] );
return 0;
}

这里把系统变量全清了,同时加了一堆过滤,思考了半天没找着办法,主要是把/给过滤了,网上一搜发现骚操作还不少

  • 进入根目录,用$(pwd)来代替/
  • 使用ascii码\\57来代替
  • 使用command -p来绕过

command -p 使用 PATH 环境变量的缺省值执行命令搜索;查找所有命令
PATH缺省值:export PATH=/usr/local/sbin/:/usr/local/bin:/sbin:/bin:/usr/bin:/root/bin

exp

文章作者: 0bs3rver
文章链接: http://yoursite.com/2021/04/25/pwnable-kr-cmd1%E5%92%8Ccmd2-%E5%91%BD%E4%BB%A4%E7%BB%95%E8%BF%87/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 0bs3rver的小屋