一个新发现的靶场hackmyvm,随便拿台靶机试试难度,本期靶机boxing

url用户名

这个之前CTF题里遇到过,这里用来绕SSRF的访问域名限制了,用得挺巧妙的。先来看一下代码

<?php
    if(isset($_GET['url'])){
        $url = $_GET['url'];
        if (!preg_match("/^http[s]?:\/\//", $url)) {
            $url = "http://" . $url;
        }
        if (strpos($url, "http://boxing.hmv") === 0 || strpos($url, "https://boxing.hmv") === 0) {
            $content = file_get_contents($url);
            echo $content;
        } else {
            echo "Unauthorized URL.";
        }
    }
?>

简答来说就是输入的内容会被拼接到http://后,再判断是不是http://boxing.hmv,如果是就读取

逻辑很简单,问题就出在拼接。如果我此时想访问这台机子的127.0.0.1:5000,如果我直接输入就会变成http://127.0.0.1:5000,没法访问。但如果我输入的是http://boxing.hmv@127.0.0.1:5000,这样就既能满足判断条件(因为是strpos位置匹配而不是preg_match这种全匹配),因此就能过

原理可以看这篇靶场笔记的parse_url与curl一栏https://redshome.top/2024/06/30/靶场笔记第十九章/

特殊字符fuzz

有时候碰到理论上能行但却没有执行结果的时候,确保拼接起来的命令能执行后,要思考的就是是否过滤掉了特殊字符。比如空格、引号这种老黑户

这个时候就可以把空格或者引号的地方fuzz一下换成别的,比如+这个神奇的符号。也许你直接在shell运行不对,但放到web上就对了,原因有可能是apache2启用了Rewrite配置或者php做了str_replace(在本题php里没找到replace,因此猜测是apache2,不过粗略搜索后也没发现,就有点发懵了= =)

放上fuzz的语句供参考

ffuf -u 'http://staging-env.boxing.hmv/index.php?url=boxing.hmv@localhost:5000?processName=asdFUZZ-eFUZZid' -w chars.txt -fs 2548

incrontab

简单来说就是一个处理正在监听中的系统事件的程序,而这个程序在这台机子里由一个叫incrontab.sh的脚本运行,用来监听一些事件,其中有一个事件如下

echo '/home/cassius/user.txt IN_ATTRIB /opt/sos/sos.sh' | incrontab -

意思就是当user.txt被更改权限时触发sos.sh运行

file *

这段指令的意思乍一看就是把所有文件名匹配并填入这个*。而这么做的操作空间就很大了,可以利用file的-f参数来达到读取文件的目的。

file -f fname 这段指令的意思是将fname的内容当作文件名被file处理。而问题就出在如果fname内容不存在,则会出现下面这一幕

告诉你无法打开,然后又把内容告诉你,和你说是什么无法打开。这样我们不就能读文件内容了吗?而操作步骤也很简单,在执行file *的目录下创建一个名为-f的文件就行了,因为由于linux的字符排序,-的匹配优于字母(但低于数字和.),因此只要保证这个运行目录下不存在数字开头的文件名即可

小结

这靶场还挺有意思,发给用户ova文件自己起虚拟机,然后又可以交flag。靶机的安全措施就是把grub的编辑权限改成了需要登录,只能说这平台很自信,有信心自己的靶机能适配所有网络环境🤣(因为vulnhub的离线靶机启动一般都需要进虚拟机修改网卡名称,起的网卡和/etc/network配置文件里的网卡永远是两个名字……)