vulhub Holynix

vulhub Holynix walkthrough

image.png

该靶机提供的为tar.bz2文件,先用PS解压

0x01 端口扫描

主机发现:

image.png

全端口扫描:

image.png

tcp只开了80,保险起见进行udp扫描:

image.png

目前来看确实只有80开放,进行详细信息扫描:

image.png

ubuntu跑着apache,开始web渗透:

0x02 web渗透

跑起目录爆破,同时打开浏览器访问web服务:

image.png

image.png

一个登录界面

image.png

image.png

一句话绕过登录,以alamo身份进到系统

image.png

雇员名单

image.png

从留言板得知信息:

  1. 可能目标机安装了gcc
  2. 可能有一个每五分钟一次的计划任务
  3. ssh服务被部署了端口敲击隐藏起来

image.png

可以上传文件,且可以自动解压gzip文件

image.png

只多扫出来两个存放杂文件的目录
从文件上传入手:

image.png

报错alamo不允许传文件
那就先看Security项目:

image.png

该功能通过此选项控制下方内容,抓包测试,无注入,但text_file_name参数处存在目录穿越:

image.png

读到/etc/passwd发现除了alamo还有不少其他用户,可能有人有文件上传权限,又想起来登录页面有注入点,尝试注入:

image.png

可以打通,且有creds库,查看:

image.png

看到sqlmap使用的盲注,跑字段果然dump不出来东西,如果还要查就需要写盲注脚本了
不过先不急,还有另一个线索可以尝试:
目录穿越可以成功,大概率使用的数据流操作函数,尝试使用伪协议读文件:

image.png

1
2
3
4
5
6
7
8
9
10
11
<?php
if ( $auth == 0 ) {
echo "<center><h2>Content Restricted</h2></center>";
} else {
echo "<h3>Home Directory Uploader</h3>";
echo "<form enctype='multipart/form-data' action='index.php?page=transfer.php' method='POST'>";
echo "Please choose a file: <input name='uploaded' type='file' /><br />";
echo "<input type='checkbox' name='autoextract' value='true' /> Enable the automatic extraction of gzip archives.<br>";
echo "<input type='submit' value='Upload' /></form>";
}
?>

果然可以,这里可以看到upload页面使用auth校验身份,但此文件中又未定义,那么大胆猜测是通过cookie验证的,抓包:

image.png

很幸运的是直接用uid=1确定身份,尝试修改:

image.png

成功上传,且看到名字变成了etenenbaum

为了找上传路径,查看上传文件的transfer.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
if ( $auth == 0 ) {
echo "<center><h2>Content Restricted</h2></center>";
} else {
if ( $upload == 1 )
{
$homedir = "/home/".$logged_in_user. "/";
$uploaddir = "upload/";
$target = $uploaddir . basename( $_FILES['uploaded']['name']) ;
$uploaded_type = $_FILES['uploaded']['type'];
$command=0;
$ok=1;

if ( $uploaded_type =="application/gzip" && $_POST['autoextract'] == 'true' ) { $command = 1; }

if ($ok==0)
{
echo "Sorry your file was not uploaded";
echo "<a href='?index.php?page=upload.php' >Back to upload page</a>";
} else {
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "<h3>The file '" .$_FILES['uploaded']['name']. "' has been uploaded.</h3><br />";
echo "The ownership of the uploaded file(s) have been changed accordingly.";
echo "<br /><a href='?page=upload.php' >Back to upload page</a>";
if ( $command == 1 )
{
exec("sudo tar xzf " .$target. " -C " .$homedir);
exec("rm " .$target);
} else {
exec("sudo mv " .$target. " " .$homedir . $_FILES['uploaded']['name']);
}
exec("/var/apache2/htdocs/update_own");
} else {
echo "Sorry, there was a problem uploading your file.<br />";
echo "<br /><a href='?page=upload.php' >Back to upload page</a>";
}
}
} else { echo "<br /><br /><h3>Home directory uploading disabled for user " .$logged_in_user. "</h3>"; }
}
?>

  1. 不使用解压缩功能:上传到upload/,之后移动到对应的家目录
  2. 使用解压缩功能:上传到upload/,解压缩到对应的家目录
  3. 还执行了一个脚本 exec("/var/apache2/htdocs/update_own")

/var/apache2/htdocs/update_own:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
sudo chown root:root /home/
sudo chown -R alamo:developers /home/alamo/
sudo chown -R nobody:developers /home/development/
sudo chown -R etenenbaum:users /home/etenenbaum/
sudo chown -R gmckinnon:users /home/gmckinnon/
sudo chown -R hreiser:staff /home/hreiser/
sudo chown -R jdraper:users /home/jdraper/
sudo chown -R jjames:staff /home/jjames/
sudo chown -R jljohansen:developers /home/jljohansen/
sudo chown -R kpoulsen:users /home/kpoulsen/
sudo chown -R ltorvalds:admin /home/ltorvalds/
sudo chown -R mrbutler:staff /home/mrbutler/
sudo chown -R rtmorris:users /home/rtmorris/

暴露出了所有用户名,暂时没什么用
前往家目录找上传的马:

image.png

apache每用户目录

从源码可以看到最终的保存路径是/home/user,但只能通过~user的方式从web访问到:

Apache Web 服务器通常允许用户创建个人网页或站点,这些网页可以存放在每个用户的个人目录中。

http://<ip>/user1 和 http://<ip>/home/user1 并不等价。在Apache Web服务器中,/home/user1 是用户的个人目录的实际位置,而 ~user1 是通过mod_userdir模块配置的用户主页的访问路径。http://<ip>/user1 是一种特定的语法,在Web服务器中会被解析为用户 user1 的个人目录。而 http://<ip>/home/user1 则是直接指向 /home/user1 目录的路径,没有经过 Apache 的 mod_userdir 模块的解析。因此,这个路径可能无法正常访问到用户的个人网页。

回到题目:

image.png

居然没有读权限!猜测对整个家目录的上传的文件不具有读权限,想起来上传点还有解压功能,而且tar的解压命令是支持动态软链接的,值得尝试通过软链接将上传路径改到web根目录:

软链接写马

image.png

test1用来改变目录,删掉现有test文件,创建test目录用来写马:

image.png

依次上传test1、test2,最终在web路径下访问shell.php:

注意:上传完test1后其实并不会在旧上传目录下看到test,将test理解为管道较为合适
image.png

image.png

成功rce,反弹shell:

image.png

image.png

使用mkfifo反弹成功

0x03 提权

image.png

这里也可以看到test确实指向了网站根目录

image.png

sudo枚举发现不需要密码就可以执行mv

image.png

mv提权

由于sudo mv不需要密码,故将/bin/su移为/bin/mv,执行sudo mv即无密码执行sudo su

image.png

0x04 总结反思补足

文件上传软链接

利用1. 任意文件读取
条件:知道绝对路径、(www-data) 有读权限

image.png

zip --symlinkstar czf均可打包动态的软链接,上传被解压后访问可以像钩子把目标文件勾出来

1
2
3
ln -s /flag getflag
tar czf getflag.tar.gz getflag
zip --symlinks getflag.zip getflag

利用2. 改变文件上传路径
条件:知道网站根目录绝对路径

image.png

test1用来改变目录,删掉现有test文件,创建test目录用来写马:

image.png

依次上传test1、test2,最终在web路径下访问shell.php:

注意:上传完test1后其实并不会在旧上传目录下看到test,将test理解为管道较为合适
image.png

image.png

在web路径下访问到了shell.php

sqlmap少用batch

再次使用sqlmap跑了遍注入,去掉了batch参数,跑出来了:

image.png

0x05 总结

  1. 端口扫描:只扫到了web服务,且存在sql注入
  2. web渗透:sql一句话进入系统后台,存在当前用户无法使用的文件上传功能,修改cookie成功越权;在找不到上传路径的情况下发现文件包含点,利用伪协议读出各文件,得知上传路径为家目录,但无权访问家目录下的shell;猜测原因为目录权限问题,结合提供了解压缩功能,上传软链接修改上传路径为web根目录,在新上传路径下访问到shell,蚁剑连接,尝试多种反弹shell语句,最终mkfifo反弹成功
  3. 提权:mv命令具有无需密码的sudo权限,将mv的执行文件替换为su的执行文件,执行sudo mv达到sudo su的提权效果

vulhub Holynix
https://fyhypo.github.io/blog/vulnhub/vulnhub Holynix/
作者
FYHypo
发布于
2024年3月28日
许可协议