XZ后门程序:钩子分析,从零基础到精通,收藏这篇就够了!

第1部分:XZ后门程序的故事——初始分析
第2部分:评估Y,以及XZ Utils事件(社会工程学)

在我们关于 XZ 后门程序的第一篇文章中,我们分析了从初始感染到它执行的函数挂钩的代码。正如我们当时提到的,它的初始目标是成功挂钩与RSA密钥操作相关的一个函数。在这篇文章中,我们将专注于后门在OpenSSH中的行为,特别是OpenSSH便携版9.7p1——截至目前为止的最新版本。

为了更好地了解情况,我们建议您阅读 Baeldung 关于SSH身份验证方法的文章和JFrog关于SSH中权限分离的文章。

主要发现

我们的分析揭示了关于该后门功能的以下有趣细节:

攻击者设置了防重放功能,以避免后门通信被截获或劫持。

  • 后门作者在 x86 代码中使用了自定义隐写术技术来隐藏公钥,这是一种非常巧妙的隐藏公钥的技术。

  • 后门程序通过挂钩日志记录函数来隐藏其未经授权连接到SSH服务器的日志。

  • 后门挂钩了密码身份验证功能,允许攻击者使用任何用户名/密码登录受感染的服务器,无需任何进一步检查。它对公钥身份验证也做了同样的处理。

  • 它具有远程代码执行能力,允许攻击者在受感染的服务器上执行任何系统命令。

详细分析

后门程序试图挂钩三个函数,其中 RSA_public_decrypt 是主要目标,RSA_get0_key 是次要目标。第三个函数 EVP_PKEY_set1_RSA 在所讨论的 SSH 服务器版本中不存在。它可能是用于恶意公钥生成工具的遗留物(此函数由 OpenSSH 包中包含的独立 ssh-keygen 工具使用),或者它可能曾在某个罕见或过时的SSH服务器版本中使用过。

当RSA证书被配置为SSH身份验证方法时,就会调用最新SSH服务器版本中的两个目标函数。它们首先检查传入的RSA连接是否使用认证数据(RSA密钥)作为参数。如果是,后门将其传递给一个通用函数(由所有钩子调用),该函数解析这个RSA密钥并提取嵌入在其模数部分的信息。后门的主要有效载荷函数仅在客户端预认证会话期间执行一次,即在进行基于RSA的认证检查时。

RSA_public_decrypt 钩子函数

攻击者必须生成一个特定的RSA密钥来与被后门感染的服务器交互;该密钥用作攻击者命令的容器,用于使用 CA 证书的SSH连接。

RSA密钥由OpenSSL库中的一个结构表示,该结构包含E(指数)和N(模数)。后门会提取并处理RSA模数,这意味着恶意有效载荷被打包在RSA密码系统中的N值内。

自定义RSA模数必须符合以下格式才能被后门正确处理:

RSA 模数数据结构

有效载荷头部有三个字段(上图中的PartialCommand1、2和3),用于计算命令类型,也充当一种魔数检查形式。命令类型是使用以下公式计算的:PartialCommand3 + (PartialCommand2 * PartialCommand1),其中计算结果必须在0到3之间:

命令类型的计算

如果计算出的结果检查通过,代码将继续进行有效载荷解密和有效载荷签名检查。

ED448加密公钥提取——基于x86的隐写术

为了解密和验证有效载荷数据,后门使用从二进制文件中提取的 ED448 公钥。

当我们第一次遇到密钥提取过程时,它看起来像是后门作者设法创建了代码,在生成私钥之前生成了正确的公钥,这本应是不可能的。通常,对于椭圆曲线算法,必须先生成私钥,然后从私钥计算出公钥。为了解开从二进制生成公钥的谜团,我们分析了各种加密库的源代码,但一无所获。然后我们更仔细地分析了后门代码,并发现密钥是使用常规流程生成的。然而,攻击者在x86代码中使用了一种自定义的隐写技术来隐藏任意消息(在本例中是公钥)。

公钥信息散布在二进制代码中的特定有效指令内。恢复密钥的方法在某种程度上类似于返回导向编程(ROP)二进制利用场景中的gadget扫描技术。但在这里,“gadgets”实际上是寄存器到寄存器的指令(例如,mov rdi, rbx),每个指令都包含1位信息,其值为1或0。

为了实现密钥恢复,一些函数,通常在函数开始时,会调用带有特定参数的“密钥重建”算法。

部分密钥重建函数调用

该算法使用的参数是:

  • BitIndex:保存当前要解码的密钥索引的起始值,也用于保存加密密钥位图中最初要设置的位。

  • Total Instructions:当前函数中要扫描的寄存器到寄存器指令的总数。

  • Key Index:此函数将重建的特定密钥索引。此值存在是为了避免在第二次调用时重新扫描同一个函数。

寄存器-寄存器指令解码

密钥重建算法从头到尾扫描后门的某些函数,寻找寄存器-寄存器指令。当找到一条指令时,它会解码“BitIndex”值以提取要设置的正确字节索引和位。

加密密钥重建代码片段

BitIndex值被解包以确定缓冲区中的目标索引。然后它将位(按位或)添加到该索引处的当前值。由于加密公钥缓冲区用零初始化,因此重建算法将仅激活其中的特定位。如果寄存器-寄存器指令匹配操作码标准(上图),它会将密钥位值设置为1,否则会跳过它,表示此位值应保持为零。之后,BitIndex值增加。

即使指令的反汇编表示法相同,该算法也会逐一确定是否为每条指令设置该位。这是因为有些指令的汇编代码可能相同,但操作码可能不同。

公钥重建算法

总的来说,对于找到的每个指令,BitIndex被用来重建加密密钥的特定部分。总共,在二进制执行中搜索了456个指令,到这个过程结束时,加密的公钥被重建。

公匙重建自动化

在我们的研究中,我们重现了整个密钥重建过程,该过程最终得到后来被解密的加密公钥。

有效载荷解密和签名检查

ED448公钥使用ChaCha20算法加密,其中密钥和nonce是对由零组成的缓冲区进行ChaCha20加密的結果,其中零用作密钥和nonce。

解密后,后门会取公钥的前32个字节,并将其用作密钥来解密有效载荷主体,有效载荷主体也使用ChaCha20加密。

后门的有效载荷解密和检查图

有效载荷签名检查

解密后的有效载荷在其头部包含剩余数据的签名。要验证签名,必须拥有用于签署有效载荷的私钥。在预期的攻击场景中,只有后门作者才能访问签名并向受感染的服务器发送有效载荷。

为了验证有效载荷的完整性和真实性,后门再次使用解密后的 ED448 公钥来确认传入的有效载荷是用攻击者的私钥签名的。

有效载荷完整性和真实性检查

它还会将服务器公钥的 SHA-256 哈希值(从服务器发送公钥的初始 SSH 连接中获取)放入有效载荷签名数据中,并验证它是否与当前运行的服务器匹配。这样做是为了防止重放攻击,在重放攻击中,研究人员可以捕获后门通信并将相同的后门命令重放到另一个服务器上。

反重放攻击图

如果所有检查都通过,代码将继续解析所需后门命令的参数。后门可以以root和非root两种模式执行命令,执行方式可能根据权限级别而异。然而,非root模式操作似乎不是攻击者的目标,因此我们将描述root模式代码的功能。

后门命令

攻击者选择的命令取决于对头字段的计算结果。核心后门命令本质上允许攻击者以 root 或普通用户身份登录服务器并执行一些系统命令。本节描述每个命令的功能。

绕过SSH认证

如果SSH服务器之前未启用root登录,则命令0和1均可启用root登录。。此外,它们可以选择禁用可插拔身份验证模块 (PAM) 的使用。接下来,根据命令,可以挂钩两个OpenSSH函数之一,如果命令为 1,则为 mm_answer_authpassword,如果命令为 0,则为 mm_answer_keyallowed。

第一个命令核心代码

mm_answer_authpassword 钩子允许攻击者使用任何用户名/密码登录受感染的服务器,无需任何进一步检查。我们将在后面更详细地描述 mm_answer_keyallowed。

通过“system”调用执行远程命令

如果命令是 2,它会从有效载荷数据中提取命令字符串,并使用 system 函数在机器上执行它。攻击者可以在有效载荷主体中发送特定标志,以指定应执行命令的用户和组 ID。

远程命令执行代码片段

最后一条后门命令 (3)通过退出监控程序来关闭预验证会话。

主钩子函数完成后,后门会用一个空公钥替换传入的RSA公钥,以避免记录攻击者的任何恶意数据。

mm_answer_keyallowed钩子

如果后门命令为0,则会挂钩mm_answer_keyallowed函数。当非特权的NetworkProcessing sshd进程接收到ssh-userauth请求的publickey方法时,这个函数会被特权的Monitor进程调用,允许后门在该阶段处理额外的命令。

在这种处理方法中,类似步骤发生:提取附加到 ssh-userauth 请求的 RSA 密钥的模数,并如前所述检查其签名。可能的子命令是:

SubCommand

子命令1

  • 挂钩 mm_answer_authpassword 函数以允许使用任何密码的用户登录请求

SubCommand

子命令2

  • 挂钩 mm_answer_keyverify 函数以允许使用假密钥进行身份验证并将接收到的后门命令存储在内部结构中。mm_answer_keyverify 挂钩本质上允许传入的密钥在无需进一步检查的情况下通过身份验证过程,使用假密钥成功完成授权。

SubCommand

子命令3

  • 与系统执行方法类似,此命令允许使用 system 函数执行命令,可以选择组/用户 ID。

日志隐藏功能

后门还可以通过挂钩日志记录函数来隐藏指示未经授权连接到SSH服务器的日志,并可选地调用libc setlogmask(0x80000000),这将导致忽略所有Syslog消息。参数中的0x80000000实际上意味着将日志掩码设置为零,因为零掩码参数是一个具有特殊意义的保留值。

该钩子还将通过在前缀树中搜索来过滤日志消息,正如我们在关于XZ后门的第一篇文章中所描述的那样。它的进一步行为取决于找到了哪些目标消息(如果有的话):

日志过滤代码片段

可用的日志过滤器包括:

总 结

CONCLUSION

经过三篇关于这个后门的文章,我们可以得出结论,它确实是一个高度复杂的威胁,具有许多特殊之处。有几个亮点使这个威胁独一无二,例如公钥信息嵌入在二进制代码本身中的方式,这使得恢复过程变得复杂,以及对操作的精心准备,这涉及到一个持续时间长的社会工程学活动。。

值得注意的是,这个威胁背后的组织或攻击者对 SSH 和 libc 等开源项目的内部结构有深入的了解,并且在用于启动感染的代码/脚本混淆方面也具有专业知识。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,需要点击下方链接即可前往获取,或微信扫描下方二维码领取~

**读者福利 |** 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击)**

在这里插入图片描述

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

我帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。****(全套教程文末领取哈)
在这里插入图片描述

在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

在这里插入图片描述

黑客资料由于是敏感资源,这里不能直接展示哦!****(全套教程文末领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或点击链接免费领取~
**读者福利 |** 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 **(安全链接,放心点击)**

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值