堡垒靶场:sshd辅助CVE-2021-26708(Linux内核)漏洞利用提权

admin 2025年7月1日16:26:40评论12 views字数 4175阅读13分55秒阅读模式

Vault Labs, HardenedVault

Linux内核漏洞CVE-2021-26708

Alexander Popov 于2021年发表了一篇文章 Four Bytes of Power:Exploiting CVE-2021-26708 在 Linux 内核中使用四字节覆盖漏洞来执行权限提升,这篇文章详细的分析和记录了提升root权限的漏洞利用全过程。简单总结,该漏洞有几个步骤如下

1.在可预测的地址上分配一个good msg:在vsock上赢得竞态;从/dev/kmsg中读取堆信息泄漏地址后使用msgsnd()分配一个good msg到那个泄漏地址上。

2.针对good msg”任意释放:在vsock上赢得竞态;以泄漏地址覆写msg->security;使用失败的msgsnd分配一个污染的msg并且释放msg->security。需要注意的是good msg”可以被释放但它依然存在msg队列中,而这让UAF(user-after-free)变得可行。

3.任意写good msg”:任意读可以通过 setxattr 在good msg” 的地址处分配对象,然后覆写。

4.good msg”中任意读:使用msgrcv()泄漏vsk结构体内容。

5.buff中分配一个带特殊flag的sk_buff

6.类似step-4:搜索堆上特殊flag以获得sk_buff地址。

7.类似step-2:释放 sk_buff。

8.类似step-3:覆写sk_buff函数指针以劫持执行流。

9.构建ROP链进行提权。

This is the way: sshd

您可能会注意到,步骤 4 能够获取owner_cred泄露的地址,而步骤 2 可以实现任意释放,cred 结构在特殊的slab缓存中分配:cred_jar。如果创建了多个特权进程,并且同时释放了cred指针(或者特权进程的创建时间比释放的cred指针晚一点),那么其中一个进程的cred可以位于释放的地址,这使得权限提升成为可能,sshd 似乎是我们需要的特权进程,登录完成后的 ssh 连接有两个进程:

$ ps -axu|grep ssh

USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND

...

root9240.60.543876 10576 ?Ss01:470:00 sshd: victim [priv]

victim9390.00.3437766196 ?S01:470:00 sshd: victim@pts/0

...

在没有完成登录的情况下与目标的ssh连接将如下所示:

$ ps -axu|grep ssh

USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND

sshd9880.00.2305645676 ?S01:540:00 sshd: victim [net]

客户端ssh的权限无关紧要,因为sshd(其用户默认为 root)将建立连接,sshd将等待密码输入,直到超时,这些机制会使漏洞利用编写工作更容易,以下为基本步骤:

1.在可预测的地址上分配一个good msg”:在vsock上赢得竞态;从/dev/kmsg中读取堆信息泄漏地址后使用msgsnd()分配一个good msg”到那个泄漏地址上。

2.针对good msg”任意释放:在vsock上赢得竞态;以泄漏地址覆写msg->security;使用失败的msgsnd分配一个污染的msg并且释放msg->security。需要注意的是good msg”可以被释放但它依然存在msg队列中,而这让UAF(user-after-free)变得可行。

3.任意写good msg”:任意读可以通过 setxattr 在good msg” 的地址处分配对象,然后覆写。

4.good msg”中任意读:使用msgrcv()泄漏vsk结构体内容。

5.准备多个 “ssh user@target&” 在主机上但先别运行。

6.类似step-2,任意释放owner_cred。在owner_cred被释放后执行上面的ssh连接命令。其中一个sshd的cred会定位在owner_cred上以实现提权目的。

结果:

[victim@hardenedvault ~]$ uname -a

Linux hardenedvault 5.10.11-200.fc33.x86_64 #1 SMP Wed Jan 27 20:21:22 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

[victim@hardenedvault ~]$ id

uid=1001(victim) gid=1001(victim) groups=1001(victim) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[victim@hardenedvault ~]$ ./cve-2021-26708

[+] finish init userfaultfd:

pagefault addr: 5004000

[+] try to get addr of good msg_msg...

[+] 1598'th finished get addr of good msg_msg

[+] get the address of good msg after 1598 trys

[+] addr_of_good_msg: 0xffff977a85f71340

[+] addr_of_vsk: 0xffff977a8555e600

[+] adapt the msg_msg spraying payload:

msg_ptr0x5003fd8

m_type1337 at 0x5003fe8

m_ts6096 at 0x5003ff0

msgsegnext 0xffff977a8555e600 at 0x5003ff8

[+] prepare setxattr threads...

[+] start read userfault...

[+] Start free good msg...

[+] msgsnd failed: msg->security maybe freed

[+] intriguring userfaultfd page fault(msg)

pagefault address: 5004000 flags: 0

[+] try to read kernel leak...

[+] 8177'th finished read the leak

[+] read leak:

sk_def_write_space:ffffffff939851b0

owner_cred:ffff977a83e15600

sk_memcg:ffff977a85549000

[+] Start free cred...

[+] msgsnd failed: owner cred maybe freed !!!

[+] 100'th free owner_cred, waitting for sshd

[root@hardenedvault ~]# id

uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:unconfined_t:s0-s0:c0.c1023

关于sshd辅助堆喷cred-jar的细节

一个步骤完成漏洞利用是否可能?

事实上是可能的,但需要创建一个特殊的进程,该进程在任意释放owner_cred之前创建一个进程,并等待owner_cred被释放以及启动ssh到localhost。

ssh登录与否?

sshd可能会因超时而终止,ssh登录效果会更好,在这种情况下,当sshd终止时会出现内核崩溃,但时间窗口对于攻击者来说足够了!可以在/etc/ssh/sshd_config中配置 LoginGraceTime。

多个ssh效果更好?

由于cred_jar缓存可能会受到其他进程的影响,所以运行多个 ssh 会更稳定。

限制

目标机器必须开启ssh服务器

显然,在目标计算机上运行的 ssh 服务器对于权限提升是必需的,我们还没有调查是否可以在一个非特权进程上触发创建特权进程来帮助cred_jar堆喷,如果进程满足以下条件:

1.非特权进程可以让目标创建特权进程。

2.一个特权进程对一个非特权进程的响应。

3.特权进程具有较长的生存期。

然后可以用来做cred_jar堆喷。

被其他进程影响

如果目标机器是执行创建并终止了大量进程的服务器,则权限可能会受到它们的影响。

PoC和防御

测试过的GNU/Linux发行版和内核版本?

公开版本仅针对Federa 33 和5.10.11-200.fc33.x86_64进行过测试。

PoC/Exploit是开源的吗?

是的,可以在Vault Range PoC中找到.

有关于防御建议吗?

针对此漏洞利用,有很多有效的防御缓解措施,但赛博堡垒这里想指出的是,某些缓解措施比其他缓解措施更重要,纯数据污染攻击可以通过任意写入来实现,这可能会在两个阶段绕过大多数缓解措施:利用阶段(exploitation stage)和后利用阶段(post-exploitation stage)。PaX/GRsecurit的KERNSEAL/AUTOSLAB是一个非常出色的缓解措施,因为它可以针对前漏洞利用阶段(pre-exploitation stage)进行安全防护的同时保障性能。

Mitigation

Pre-exploitation

Exploitation

Post-exploitation

Bypassable

PaX RAP

N

Y

N

L4: Hardcore

PaX KERNSEAL/AUTOSLAB

Y

N

N

L5: Nightmare

VED wCFI

N

Y

N

L3: Hurt Me Plenty

Metadata integrity

N

N

Y, AKO/LKRG/VED

L2: Bring It On

VED self-protection

N

Y

N

L3: Hurt Me Plenty

根据赛博堡垒客户的反馈,平台安全级别的诸多威胁中,大多数带有花哨名称安全产品(例如:EDR/ XDR,HIDS等)的可绕过级别只能保持"L1:I can win",安全产品容易被攻陷对于生产环境来说并不是一件值得骄傲的事情,不是吗?

Demo

堡垒靶场:sshd辅助CVE-2021-26708(Linux内核)漏洞利用提权

获得PoC代码,请在公众号输入:poc

原文始发于微信公众号(赛博堡垒):堡垒靶场:sshd辅助CVE-2021-26708(Linux内核)漏洞利用提权

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年7月1日16:26:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   堡垒靶场:sshd辅助CVE-2021-26708(Linux内核)漏洞利用提权https://cn-sec.com/archives/1124335.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息