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