利用 Canonical 的 snapd 守护进程(Ubuntu Linux 中的默认服务)REST API 中的漏洞“Dirty_Sock”(CVE-2019-7304),获取 root 访问权限。
Ramil Mustafayev 的指南:https://kryptohaker.medium.com/linux-privilege-escalation-via-snapd-using-dirty-sock-exploit-and-demonstration-of-cve-2019-7304-892716cf99ca
此漏洞在 snapd 版本 2.37 之前的版本中被利用,原因是当对其 UNIX 套接字执行访问控制时,对远程套接字地址的验证和解析不正确。这也影响了当时的一些 Unix 和 Linux 发行版(例如 Ubuntu 16.04)。因此,为了实施此漏洞利用,我们需要 snapd 2.32 和 Ubuntu 16.04。
我从 https://launchpad.net/ubuntu/+source/snapd 获取了 snapd 2.32 的 Debian 软件包。

首先,我检查 Ubuntu 机器是否容易受到利用,使用命令 cat /etc/lsb-release(显示 Ubuntu 版本及其描述)和 uname -a(检查当前计算机和操作系统的信息)。然后,我们确认这台机器是可被利用的。

下一步是使用命令 systemctl start snapd 启动 snapd 服务(实际上,当攻击者利用此漏洞时,snapd 服务需要由管理员启动,否则他们无法成功启动它)。然后,我们可以检查 snapd 的版本以确保它存在漏洞。

接下来,我将使用命令 id(显示用户和组信息)和 tail /etc/passwd(/etc/passwd 文件用于跟踪每个注册用户)检查用户的权限。下面的结果显示,用户名为“coby”的攻击者是一个普通用户,对系统的访问权限最低。

要发起此攻击,我们将使用 dirty_sock 脚本,该脚本有两个版本,来自 https://github.com/initstring/dirty_sock。版本一需要出站互联网连接并运行 SSH 服务,而版本二可以直接运行,无需任何要求。
在本次利用中使用的 dirty_sockv2.py 中,应重点关注一些关键组件。该脚本中的第一个关键组件是变量 TROJAN_SNAP,它是一个 base64 编码的字符串,表示一个可安装的 snap 软件包。此软件包是一个空的“devmode” snap,其安装钩子中包含一个 bash 脚本,该脚本将创建一个新用户(“devmode”(开发者模式)是一种特殊的安装模式,允许 snap 绕过严格限制以进行开发和调试)。

该脚本中另一个重要的组件是 create_sockfile() 函数。此函数利用了“snapd 的 ucrednet.go”文件中的不安全解析,生成一个随机套接字文件并注入脏套接字 ;uid=0;,使我们能够覆盖 UID 变量。

为了实现此利用,我只需在终端中执行 dirty_sockv2.py。成功运行 dirty_sock 漏洞利用后,我们可以看到脚本自动创建了一个具有相同密码的 dirty_sock 账户。

然后,我检查 /etc/passwd 以查看注册用户列表,并发现创建了一个名为“dirty_sock”的新用户。

通过使用 su 命令,我可以使用发现的凭据登录“dirty_sock”账户。成功登录后,我可以检查该用户的权限,并看到它在 sudo 组中。这意味着攻击者已经获得了系统的完全控制权,并且可以以最高权限执行任何操作。

此漏洞的 CVSS 评分为 8.8(高严重性),意味着如果被利用,可能对系统造成巨大影响。此漏洞具有高严重性,因为它不需要高权限即可利用。当攻击者已经在系统上拥有一定的立足点(例如低权限用户)时,他们可以将权限提升至 root,这使得此漏洞成为一个严重的本地安全威胁,尤其是在多用户或云环境中。