平台:https://www.ichunqiu.com/

level00

靶机地址,用户名和密码xshell登录

首先找特权程序,特权程序即set-uid(SUID),它是控制文件访问的权限标志,允许用户以可执行文件的 owner 或 owner group 的权限运行可执行文件,当 s 出现在文件拥有者的 x 权限上时,就被称为 SETUID BITS 或 SETUID(Linux 特殊权限 SUID,SGID,SBIT

使用命令:find / -perm -4000 2> /dev/null | xrags ls -lh,忽略错误信息输出所有拥有SUID权限的文件

进入第一个文件路径下执行flag00提权,拿到flag

level01

执行flag文件并追踪命令执行过程

可以看到调用了system命令,但这里的echo是通过env定位找到的,如果我们让env优先定位到我们伪造的echo,再将echo执行的是我们想要的东西,就能getflag

首先添加环境变量

执行ln -s /bin/getflag /home/level01/echo,创建一个链接到了getflag的echo

这样,在执行./flag之后,env寻找echo时会先找到/home/level01处的echo,而此处的echo执行的是/bin/getflag

确认行的通之后创建一个新的echo内容为cat /home/flag01/flag,回到./flag01目录执行即可

ps:这里的echo要给权限

level02

执行flag02

查看调用过程可以看到是获取了环境变量的user

直接修改环境变量中的USER使得读取flag文件即可

level03

flag文件夹里有个脚本

会执行writable.d中的脚本并删除,那么我们在writeable.d中创建一个文件,写上我们的命令即可,别忘了赋权限

level04

flag目录下有个token文件

flag04可以直接读文件,但token读不了

看下执行过程

有一个strstr函数,禁止我们读的文件名中有token字符串,那我们可以创建一个软链接指向token,间接的读取token

然后用token作为密码登录flag04用户即可getflag

level05

进入flag文件只有一个flag但有挺多隐藏文件

backup目录里有个tgz包,权限不足解压到tmp目录下,直接给了私钥

那么直接私钥登录flag05就行

level06

提示我们破解登陆密码,看下passwd文件

直接用john爆破,得到密码

登录获取flag

level07

在7007端口开了http服务

命令注入

读取flag

level08

有个流量包

用wireshark打开,看到登录信息,但密码后面还有点东西

hex查看,是7f和0d

对照不可见字符表得知7f是删除键,0d是CR键,也就是回车

那么密码就是backdoor退格退格退格00Rm8退格ate回车,也就是backd00Rmate

level09

有个php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

function spam($email)
{
$email = preg_replace("/\./", " dot ", $email);
$email = preg_replace("/@/", " AT ", $email);

return $email;
}

function markup($filename, $use_me)
{
$contents = file_get_contents($filename);

$contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents);
$contents = preg_replace("/\[/", "<", $contents);
$contents = preg_replace("/\]/", ">", $contents);

return $contents;
}

$output = markup($argv[1], $argv[2]);

print $output;

php代码用正则进行了一系列替换,并且flag09直接输出php处理后的结果

但这里$contents = preg_replace("/(\[email (.*)\])/e", "spam(\"\\2\")", $contents);用到了/e模式,如果启用该模式,那么preg_replace可以造成代码执行。

如果我们构造[email {${phpinfo()}}],由于在PHP中双引号包裹的字符串中可以解析变量, ${phpinfo()}中的 phpinfo() 会被当做变量先执行,执行后,即变成 ${1} (phpinfo())成功执行返回true。

那么[email {${`cat flag`}}]读取flag即可

level10

了解一下TOCTOU。【参考:Windows 0day任意文件读取漏洞POC分析

TOCTOU是Time of Check Versus Time of Use的缩写,即文件访问竞态条件漏洞,该漏洞主要原理为应用运行的过程中,在某个操作之前,比如读文件,都会检查一下文件是否存在与是否具有权限,在检查与真正的读取之间的间隔就是一个可以被利用的竞争条件(Race Condition),在这个间隔中我们可以将需要越权读取的文件替换成自己的文件,使其检查过程通过,这样就可以越权读取其他用户的文件。

flag文件夹下有token,可执行的flag10和flag,flag和token没权限访问,但flag10可以发送文件到主机,看下它的调用过程

用到了一个access函数,access函数判断当前用户是否有操作文件的权限(uid判断),如果当前用户没有针对该文件的权限,则打印ERROR,有则open。但这里存在一个问题,引用wp中作者原话

在早期的单处理操作系统中,这样的代码可能是严谨的,出发点也是好的——因为单处理的话,进程执行完毕后才发生切换。但是在多任务的操作系统中有这样一个问题:在用access检查文件后,这个程序可能受到其他程序的干扰或者发生进程切换,在进程发生切换之后,进程失去了执行流程,并且在它还未再次获得执行时,它欲操作的文件发生改变——邪恶源头是因为access和open都是通过文件路径字符串作为参数的,这个路径可能是一个链接文件。在Linux中,假设要access一个/tmp/lx文件,在access后、open之前,/tmp/lx被替换成了一个链接文件,指向了其他文件(如/etc/passwd),如果这个进程有对/etc/passwd操作的权限,它最终所操作的并不是真正的/tmp/lx,而是/etc/passwd。

简单地说就是access之后,在open文件之前把原来要open的文件链接到一个我们期望的文件。来操作一下

这里就用这一台靶机,用xshell开三个窗口即可,这里简称x1,x2,x3

x1在有权限创建文件的目录下新建一个文件,这里以/tmp/token为例,然后再新建一个执行脚本的文件,不停的改掉token10的指向,内容如下

赋予权限并执行

x2使用nc命令监听自己的18211(./flag10发送文件的端口,测试得知)准备接受文件,这里用-k来保持持续的链接状态

x3同样在tmp目录下新建一个文件yy,内容如下(红框部分为接受文件的地址)

这里的nice命令是更改优先序来执行程序,它的数值是-20到19,数字越大级别越低,把flag10的优先级变为最低,就有机会在access之后,open之前介入进程改掉/tmp/token10的指向

同样赋予权限并执行

这时执行后可以看到随着不停的将token10指向flag,token被读取

token就是flag10用户的密码,登录即得flag