文曲签学
首先随便输入一个指令尝试,发现提示输入help查看帮助
输入help,发现有list命令查看笔记和read命令读取笔记
list查看笔记列表,发现HINT,read查看
关注公众号后提示
写的很明确了,目录穿越加双写绕过
拿到flag
EZ_upload
随便上传一个文件,跳转至upload.php查看源码
<?php
highlight_file(__FILE__);function handleFileUpload($file)
{$uploadDirectory = '/tmp/';if ($file['error'] !== UPLOAD_ERR_OK) {echo '文件上传失败。';return;}$filename = basename($file['name']);$filename = preg_replace('/[^a-zA-Z0-9_\-\.]/', '_', $filename);if (empty($filename)) {echo '文件名不符合要求。';return;}$destination = $uploadDirectory . $filename;if (move_uploaded_file($file['tmp_name'], $destination)) {exec('cd /tmp && tar -xvf ' . $filename.'&&pwd');echo $destination;} else {echo '文件移动失败。';}
}handleFileUpload($_FILES['file']);
?>
代码审计,就是上传一个名字符合要求的文件到tmp目录下,他会在tmp目录下tar解压这个文件
这个题我自己想肯定是想破头也做不出来的,感谢社团师哥的提示和帮助
这里用到的知识点是软链接,下面做简单介绍
1.介绍
符号链接也称为软链接,是将一个路径名链接到一个文件。软链接文件是一种特别类型的文件,它们是一个文本文件,文件内部只包含了被链接文件的路径名。
2.命令
ln -s 源文件绝对路径 软链接路径
注意源文件的路径必须是绝对路径。
3.用法
比如现在我们在a目录,在这个目录下存有b目录的一个软链接,我们往a目录下的软链接里传文件,相当于向b目录下传文件。本题就是利用这个特点来做。
解题思路
首先明确思路,本题显然只能往tmp里传文件,我们要想往靶机传马,就要在tmp目录下有一个通往/var/www/html的软链接。所以我们创建一个软链接html -> /var/www/html ,然后我们想办法往这个软链接里传马。
这里有点难懂,我看了一会儿也算是研究明白了,还是利用的linux机制
我们可以新建一个名为html的文件夹(注意这个文件夹名字和软链接名字是一样的),然后在这个文件夹里放shell.php写马,打成tar包上传。解压后,shell.php在html文件夹中,而linux就会认为这个php文件是在html软链接中,shell.php通过软链接传到了/var/www/html,也就成功写马可以利用了。
解题
1.创建html软链接
2.把这个软链接打包成tar包 1.tar
3.创建html文件夹(因为和软链接重名,可以换一个目录或者直接把软链接删掉,打完tar包后原来的软链接就没用了)
4.写shell.php并把他放在html文件夹中
5.将html/shell.php打成tar包(注意一定写这个路径html.shell.php,不能直接写./html或者html)
6.回到题目,依次上传1.tar和2.tar,访问shell.php,在根目录拿到flag
SeRce
源码非常简单
<?php
highlight_file(__FILE__);
$exp = $_GET["exp"];
if(isset($exp)){if(serialize(unserialize($exp)) != $exp){$data = file_get_contents($_POST['filetoread']);echo "File Contents: $data";}
}
exp直接交给ai绕过
?exp=i:01
关键就是后面的file_get_contents
这种类型的题之前做过一次,也是师哥教的,我也想到了那个做法
file_get_contents文件读取rce
利用这种做法,我们需要/proc/self/maps和这个目录中的so文件,放脚本运行。至于我为什么卡住了。。。
因为当时那个题要找libc-2.x.so,而这个题中没有这个,只有libc.so.6,我认为必要文件缺失,于是卡住了。。。
也是长个教训吧
1.读/proc/self/maps
注意用的时候我们需要里面的每一条换行,所以这里查看源代码再复制
2.找到so文件
3.读so文件
由于直接读的话是乱码,所以我们用filter伪协议base64输出,再用cyberchef下载解base64后的结果即可。
4.将maps.txt、download.elf和脚本放在同一目录下
5.修改脚本,生成payload
在上一次的题目中,我们的cmd是
echo "<?php eval(\$_POST[a]);?>" > /var/www/html/shell.php
测试发现这个目录没有写入权限,所以不能这么用
测试又发现我们可以在tmp下写文件,所以cmd
ls / | tee /tmp/1.txt
运行脚本,得到payload执行。
值得一提的是,本题执行后回显容器不存在,着并非说明靶机过期了,而是已经rce了
这里注意,如果脚本运行失败,看一下maps.txt是不是从源代码中复制的每一行都是换行的
执行根据回显发现根目录中有flag文件,直接tac /flag是无回显的,也就是没有访问权限
但是我们注意到根目录下有一个readflag,这是一个可执行文件,可以执行读flag的操作
于是我们的cmd
readflag | tee /tmp/1.txt
拿到flag。