nebula-00~06

nebula-00~06

level00

在本关中,我们需要找到以flag00账号运行的一组用户程序。

本关需要用到的命令是find命令

find [path...] [expression]

find有一个选项交-uid,后面跟用户的uid值。每个Liunx帐号都对应一个uid,uid可以通过查看/etc/passwd获得

前面的999是uid,后面的999是gid

加下来就从根目录开始寻找这个这个用户程序

由于当前用户是level00,在进一些没有权限进入的目录进行搜索的时候,是会出错的,所以用2>/dev/null将错误输出到/dev/null这个空白设备里。Linux标准输入、标准错误输出分别对应0、1和2。

接着执行/bin/…/flag00获得权限并且getflag

level01

本关题目是让我们分析该代码,找出代码中存在的一处可执行任意文件漏
洞。提供了源码:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
  gid_t gid;
  uid_t uid;
  gid = getegid();
  uid = geteuid();

  setresgid(gid, gid, gid);
  setresuid(uid, uid, uid);

  system("/usr/bin/env echo and now what?");
}

可以看出应该是system()函数除了问题,执行程序之后会显示and now what? system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。代码中,system执行的/usr/bin/env命令,但是system的参数并非来自变量,也就是我们无法控制system的参数。但是,这里它执行了env,通过env找到echo程序,“and now what”是传递给echo的参数。

那么我们就将echo对应的程序修改为我们想要运行的。我们可以从/tmp目录入手,因为它对任何用户都是有完整权限的。

ln -s /bin/getflag /tmp/echo #让/tmp/echo链接到/bin/getflag上
PATH=/tmp:$PATH #改变环境变量,把/tmp放在最前面

level02

本关的程序存在一个可以执行任意程序的漏洞,源码:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
  char *buffer;

  gid_t gid;
  uid_t uid;

  gid = getegid();
  uid = geteuid();

  setresgid(gid, gid, gid);
  setresuid(uid, uid, uid);

  buffer = NULL;

  asprintf(&buffer, "/bin/echo %s is cool", getenv("USER"));
  printf("about to call system(\"%s\")\n", buffer);

  system(buffer);
}

本关和上一关差不多,只是这次的环境变量USER是可以控制的,system执行的内容是/bin/echo level02 is cool,我们将USER修改为”;/bin/getflag”就可以了。需要注意的加;的原因是为使system执行多条命令。

level03

提示说这一关有crontab(定时器),首先我们先查看一下这个定时器。以nubula账户登录,查看sudo /var/spool/cron/crontabs目录下的内容,发现有flag03,打开查看

根据crontab的可知,系统会每隔三分钟执行一次/home/flag03/writable.sh。继续查看writable.sh的内容,如下:

代码含义是:每执行一次writable.sh,writable.sh就自动执行writable.d里的所有文件,之后再删除这个脚本。ulimit -t 5限制了cpu使用时间,这个不太要紧,最重要的是我们要利用writable.d这个目录做点事儿,这个crontab是以flag03的身份创建的,因此每次执行都是以flag03这个身份的,而writable.d这个目录任何人可读可写,所以只需放一个可执行脚本在writable.d里,等着它自动运行:

level04

本关要求绕过flag04的限制来读出token的内容。

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv, char **envp)
{
  char buf[1024];
  int fd, rc;

  if(argc == 1) {
      printf("%s [file to read]\n", argv[0]);
      exit(EXIT_FAILURE);
  }

  if(strstr(argv[1], "token") != NULL) {
      printf("You may not access '%s'\n", argv[1]);
      exit(EXIT_FAILURE);
  }

  fd = open(argv[1], O_RDONLY);
  if(fd == -1) {
      err(EXIT_FAILURE, "Unable to open %s", argv[1]);
  }

  rc = read(fd, buf, sizeof(buf));

  if(rc == -1) {
      err(EXIT_FAILURE, "Unable to read fd %d", fd);
  }

  write(1, buf, rc);
}

通过源码可以知道程序过滤了“token”字符串,我们可以建立一个链接类型的文件,指向/home/flag04/token,再执行flag04

读出的token是flag04这个帐号的密码,登录并执行getflag

level05

根据题目所述,在/home/flag05里,藏着一个重要的文件。如果能窃得,就出大事了。转到目录/home/flag05下,用ls -al命令,列出所有文件:

.buckup和.ssh文件比较重要,但那个.ssh目录我们没有权限,backup字面上是备份的意思,那我们就进去看看吧,发现有一个压缩包,把它解压到tmp目录下,如下:

发现里面有公钥文件,将它拷贝到用户的家目录下,然后ssh到flag05

cp -r /tmp/.ssh/ ~
ssh flag05@localhost

成功登录后执行getflag:

level06

根据题目所述,flag06这个帐号的认证凭据是按照传统UNIX的方法储存的——意味着密文是存储在/etc/passwd里的,而不是/etc/shadow中的——因为把密码存到passwd里不安全,所以后的Linux发行版都将加密后的密码单独存放到/etc/shadow中的。

直接读取/etc/passwd里flag06加密后的密码:

需要去破解,可以用John,首先vim编辑一个文件password,然后把上面那一行

flag06:ueqwOCnSGdsuM:993:993::/home/flag06:/bin/sh

输进去,然后直接破解

破解结果是hello

文章目录
  1. 1. nebula-00~06
    1. 1.1. level00
    2. 1.2. level01
    3. 1.3. level02
    4. 1.4. level03
    5. 1.5. level04
    6. 1.6. level05
    7. 1.7. level06
|